Skip to content
  • Vladimir Davydov's avatar
    kobject: don't block for each kobject_uevent · bcccff93
    Vladimir Davydov authored
    Currently kobject_uevent has somewhat unpredictable semantics.  The
    point is, since it may call a usermode helper and wait for it to execute
    (UMH_WAIT_EXEC), it is impossible to say for sure what lock dependencies
    it will introduce for the caller - strictly speaking it depends on what
    fs the binary is located on and the set of locks fork may take.  There
    are quite a few kobject_uevent's users that do not take this into
    account and call it with various mutexes taken, e.g.  rtnl_mutex,
    net_mutex, which might potentially lead to a deadlock.
    
    Since there is actually no reason to wait for the usermode helper to
    execute there, let's make kobject_uevent start the helper asynchronously
    with the aid of the UMH_NO_WAIT flag.
    
    Personally, I'm interested in this, because I really want kobject_uevent
    to be called under the slab_mutex in the slub implementation as it used
    to be some time ago, because it greatly simplifies synchronization and
    automatically fixes a kmemcg-related race.  However, there was a
    deadlock detected on an attempt to call kobject_uevent under the
    slab_mutex (see https://lkml.org/lkml/2012/1/14/45), which was reported
    to be fixed by releasing the slab_mutex for kobject_uevent.
    
    Unfortunately, there was no information about who exactly blocked on the
    slab_mutex causing the usermode helper to stall, neither have I managed
    to find this out or reproduce the issue.
    
    BTW, this is not the first attempt to make kobject_uevent use
    UMH_NO_WAIT.  Previous one was made by commit f520360d ("kobject:
    don't block for each kobject_uevent"), but it was wrong (it passed
    arguments allocated on stack to async thread) so it was reverted in
    05f54c13
    
     ("Revert "kobject: don't block for each kobject_uevent".").
    It targeted on speeding up the boot process though.
    
    Signed-off-by: default avatarVladimir Davydov <vdavydov@parallels.com>
    Cc: Greg KH <greg@kroah.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    bcccff93