• Paul Jackson's avatar
    [PATCH] cpuset oom lock fix · 505970b9
    Paul Jackson authored
    The problem, reported in:
    
      http://bugzilla.kernel.org/show_bug.cgi?id=5859
    
    and by various other email messages and lkml posts is that the cpuset hook
    in the oom (out of memory) code can try to take a cpuset semaphore while
    holding the tasklist_lock (a spinlock).
    
    One must not sleep while holding a spinlock.
    
    The fix seems easy enough - move the cpuset semaphore region outside the
    tasklist_lock region.
    
    This required a few lines of mechanism to implement.  The oom code where
    the locking needs to be changed does not have access to the cpuset locks,
    which are internal to kernel/cpuset.c only.  So I provided a couple more
    cpuset interface routines, available to the rest of the kernel, which
    simple take and drop the lock needed here (cpusets callback_sem).
    Signed-off-by: default avatarPaul Jackson <pj@sgi.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    505970b9
oom_kill.c 7.68 KB