On 03/16, Konstantin Khlebnikov wrote: > > +/** > + * set_mm_exe_file - change a reference to the mm's executable file > + * > + * This changes mm's executale file (shown as symlink /proc/[pid]/exe). > + * > + * Main users are mmput(), sys_execve() and sys_prctl(PR_SET_MM_MAP/EXE_FILE). > + * Callers prevent concurrent invocations: in mmput() nobody alive left, > + * in execve task is single-threaded, prctl holds mmap_sem exclusively. > + */ > void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file) > { > + struct file *old_exe_file = rcu_dereference_protected(mm->exe_file, > + !atomic_read(&mm->mm_users) || current->in_execve || > + lock_is_held(&mm->mmap_sem)); > + > if (new_exe_file) > get_file(new_exe_file); > - if (mm->exe_file) > - fput(mm->exe_file); > - mm->exe_file = new_exe_file; > + rcu_assign_pointer(mm->exe_file, new_exe_file); > + if (old_exe_file) > + fput(old_exe_file); > } Yes, I think this is correct, __fput() does call_rcu(file_free_rcu). And much better than the new lock ;) Acked-by: Oleg Nesterov <oleg@xxxxxxxxxx> So I think the patch is fine, but personally I dislike the "prctl holds mmap_sem exclusively" and rcu_dereference_protected(). I mean, I think we can do another cleanup on top of this change. 1. set_mm_exe_file() should be called by exit/exec only, so it should use rcu_dereference_protected(mm->exe_file, atomic_read(&mm->mm_users) <= 1); 2. prctl() should not use it, it can do get_file(new_exe); old_exe = xchg(&mm->exe_file); if (old_exe) fput(old_exe); 3. and we can remove down_write(mmap_sem) from prctl paths. Actually we can do this even without xchg() above, but we might want to kill MMF_EXE_FILE_CHANGED and test_and_set_bit() check. What do you think? Oleg. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>