Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932353AbbFSSUo (ORCPT ); Fri, 19 Jun 2015 14:20:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35476 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932207AbbFSSUJ (ORCPT ); Fri, 19 Jun 2015 14:20:09 -0400 Date: Fri, 19 Jun 2015 20:18:57 +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 v5 2/3] aio: make aio_ring->dead boolean Message-ID: <20150619181857.GA20803@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150619181840.GA20780@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 Content-Length: 1729 Lines: 65 "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(). Also, the error path in ioctx_alloc() sets ->dead for no reason, remove this. Signed-off-by: Oleg Nesterov Reviewed-by: Jeff Moyer --- fs/aio.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/aio.c b/fs/aio.c index 893d300..4a360be 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,6 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) err_cleanup: aio_nr_sub(ctx->max_reqs); err_ctx: - atomic_set(&ctx->dead, 1); if (ctx->mmap_size) vm_munmap(ctx->mmap_base, ctx->mmap_size); aio_free_ring(ctx); @@ -790,11 +789,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 +1236,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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/