• Oleg Nesterov's avatar
    aio: change exit_aio() to load mm->ioctx_table once and avoid rcu_read_lock() · eb18d4ee
    Oleg Nesterov authored
    commit 4b70ac5f upstream.
    
    On 04/30, Benjamin LaHaise wrote:
    >
    > > -		ctx->mmap_size = 0;
    > > -
    > > -		kill_ioctx(mm, ctx, NULL);
    > > +		if (ctx) {
    > > +			ctx->mmap_size = 0;
    > > +			kill_ioctx(mm, ctx, NULL);
    > > +		}
    >
    > Rather than indenting and moving the two lines changing mmap_size and the
    > kill_ioctx() call, why not just do "if (!ctx) ... continue;"?  That reduces
    > the number of lines changed and avoid excessive indentation.
    
    OK. To me the code looks better/simpler with "if (ctx)", but this is subjective
    of course, I won't argue.
    
    The patch still removes the empty line between mmap_size = 0 and kill_ioctx(),
    we reset mmap_size only for kill_ioctx(). But feel free to remove this change.
    
    -------------------------------------------------------------------------------
    Subject: [PATCH v3 1/2] aio: change exit_aio() to load mm->ioctx_table once and avoid rcu_read_lock()
    
    1. We can read ->ioctx_table only once and we do not read rcu_read_lock()
       or even rcu_dereference().
    
       This mm has no users, nobody else can play with ->ioctx_table. Otherwise
       the code is buggy anyway, if we need rcu_read_lock() in a loop because
       ->ioctx_table can be updated then kfree(table) is obviously wrong.
    
    2. Update the comment. "exit_mmap(mm) is coming" is the good reason to avoid
       munmap(), but another reason is that we simply can't do vm_munmap() unless
       current->mm == mm and this is not true in general, the caller is mmput().
    
    3. We do not really need to nullify mm->ioctx_table before return, probably
       the current code does this to catch the potential problems. But in this
       case RCU_INIT_POINTER(NULL) looks better.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarBenjamin LaHaise <bcrl@kvack.org>
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    eb18d4ee
aio.c 40.1 KB