summaryrefslogtreecommitdiff
path: root/include/linux/sysdev.h
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2003-08-20 10:29:16 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-08-20 10:29:16 -0700
commit7d33101cd55d08cdc51ba5abe9290984cd4198d6 (patch)
tree7802dc579c66aa8c090087927b90528e24071e59 /include/linux/sysdev.h
parente3e0c299196a8dac91d2bd8e8dbb748d3a7b0f24 (diff)
[PATCH] fix /proc mm_struct refcounting bug
From: Suparna Bhattacharya <suparna@in.ibm.com> The /proc code's bare atomic_inc(&mm->count) is racy against __exit_mm()'s mmput() on another CPU: it calls mmput() outside task_lock(tsk), and task_lock() isn't appropriate locking anyway. So what happens is: CPU0 CPU1 mmput() ->atomic_dec_and_lock(mm->mm_users) atomic_inc(mm->mm_users) ->list_del(mm->mmlist) mmput() ->atomic_dec_and_lock(mm->mm_users) ->list_del(mm->mmlist) And the double list_del() of course goes splat. So we use mmlist_lock to synchronise these steps. The patch implements a new mmgrab() routine which increments mm_users only if the mm isn't already going away. Changes get_task_mm() and proc_pid_stat() to call mmgrab() instead of a direct atomic_inc(&mm->mm_users). Hugh, there's some cruft in swapoff which looks like it should be using mmgrab()...
Diffstat (limited to 'include/linux/sysdev.h')
0 files changed, 0 insertions, 0 deletions