From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932750AbbFRRxt (ORCPT ); Thu, 18 Jun 2015 13:53:49 -0400 Received: from mx1.redhat.com ([209.132.183.28]:44110 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932679AbbFRRxU (ORCPT ); Thu, 18 Jun 2015 13:53:20 -0400 Date: Thu, 18 Jun 2015 19:52:09 +0200 From: Oleg Nesterov To: Al Viro , Andrew Morton , Benjamin LaHaise , Jeff Moyer Cc: linux-aio@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/3] aio: make aio_ring->dead boolean Message-ID: <20150618175209.GA10060@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150618175143.GA10033@redhat.com> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org "atomic_t dead" makes no sense. atomic_read() is the plain LOAD, it doesn't have some "additional" synchronization with xchg(). And now that kill_ioctx() sets "dead" under mm->ioctx_lock we do not even need xchg(). Signed-off-by: Oleg Nesterov Reviewed-by: Jeff Moyer --- fs/aio.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/aio.c b/fs/aio.c index 893d300..d63a889 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -84,7 +84,7 @@ struct ctx_rq_wait { struct kioctx { struct percpu_ref users; - atomic_t dead; + bool dead; struct percpu_ref reqs; @@ -765,7 +765,7 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) err_cleanup: aio_nr_sub(ctx->max_reqs); err_ctx: - atomic_set(&ctx->dead, 1); + ctx->dead = true; /* unneeded */ if (ctx->mmap_size) vm_munmap(ctx->mmap_base, ctx->mmap_size); aio_free_ring(ctx); @@ -790,11 +790,12 @@ static int kill_ioctx(struct mm_struct *mm, struct kioctx *ctx, struct kioctx_table *table; spin_lock(&mm->ioctx_lock); - if (atomic_xchg(&ctx->dead, 1)) { + if (unlikely(ctx->dead)) { spin_unlock(&mm->ioctx_lock); return -EINVAL; } + ctx->dead = true; table = rcu_dereference_raw(mm->ioctx_table); WARN_ON(ctx != table->table[ctx->id]); table->table[ctx->id] = NULL; @@ -1236,7 +1237,7 @@ static bool aio_read_events(struct kioctx *ctx, long min_nr, long nr, if (ret > 0) *i += ret; - if (unlikely(atomic_read(&ctx->dead))) + if (unlikely(ctx->dead)) ret = -EINVAL; if (!*i) -- 1.5.5.1