• S
    [PATCH] Remove down_write() from taskstats code invoked on the exit() path · bb129994
    Shailabh Nagar 提交于
    In send_cpu_listeners(), which is called on the exit path, a down_write()
    was protecting operations like skb_clone() and genlmsg_unicast() that do
    GFP_KERNEL allocations.  If the oom-killer decides to kill tasks to satisfy
    the allocations,the exit of those tasks could block on the same semphore.
    
    The down_write() was only needed to allow removal of invalid listeners from
    the listener list.  The patch converts the down_write to a down_read and
    defers the removal to a separate critical region.  This ensures that even
    if the oom-killer is called, no other task's exit is blocked as it can
    still acquire another down_read.
    
    Thanks to Andrew Morton & Herbert Xu for pointing out the oom related
    pitfalls, and to Chandra Seetharaman for suggesting this fix instead of
    using something more complex like RCU.
    Signed-off-by: NChandra Seetharaman <sekharan@us.ibm.com>
    Signed-off-by: NShailabh Nagar <nagar@watson.ibm.com>
    Signed-off-by: NAndrew Morton <akpm@osdl.org>
    Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
    bb129994
taskstats.c 13.0 KB