From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757143AbbFPXvW (ORCPT ); Tue, 16 Jun 2015 19:51:22 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43826 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752303AbbFPXvP (ORCPT ); Tue, 16 Jun 2015 19:51:15 -0400 Date: Wed, 17 Jun 2015 01:50:06 +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 v2 2/3] aio: make aio_ring->dead boolean Message-ID: <20150616235006.GA18598@redhat.com> References: <20150616230414.GA15776@redhat.com> <20150616230429.GA15793@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150616230429.GA15793@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 On 06/17, Oleg Nesterov wrote: > > @@ -327,7 +327,7 @@ static int aio_ring_remap(struct file *file, struct vm_area_struct *vma) > for (i = 0; i < table->nr; i++) { > struct kioctx *ctx = table->table[i]; > > - if (!ctx || WARN_ON(atomic_read(&ctx->dead))) > + if (!ctx || ctx->dead) Argh, sorry, I removed WARN_ON() by accident. ------------------------------------------------------------------------------ Subject: [PATCH v2 2/3] aio: make aio_ring->dead boolean "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 --- fs/aio.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/fs/aio.c b/fs/aio.c index 0693333..b22c20a 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; @@ -327,7 +327,7 @@ static int aio_ring_remap(struct file *file, struct vm_area_struct *vma) for (i = 0; i < table->nr; i++) { struct kioctx *ctx = table->table[i]; - if (!ctx || WARN_ON(atomic_read(&ctx->dead))) + if (!ctx || WARN_ON(ctx->dead)) continue; if (ctx->aio_ring_file == file) { @@ -768,7 +768,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); @@ -793,11 +793,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; @@ -1239,7 +1240,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