Skip to content
  • Luis R. Rodriguez's avatar
    wait: add wait_event_killable_timeout() · 8ada9279
    Luis R. Rodriguez authored
    These are the few pending fixes I have queued up for v4.13-final.  One
    is a a generic regression fix for recursive loops on kmod and the other
    one is a trivial print out correction.
    
    During the v4.13 development we assumed that recursive kmod loops were
    no longer possible.  Clearly that is not true.  The regression fix makes
    use of a new killable wait.  We use a killable wait to be paranoid in
    how signals might be sent to modprobe and only accept a proper SIGKILL.
    The signal will only be available to userspace to issue *iff* a thread
    has already entered a wait state, and that happens only if we've already
    throttled after 50 kmod threads have been hit.
    
    Note that although it may seem excessive to trigger a failure afer 5
    seconds if all kmod thread remain busy, prior to the series of changes
    that went into v4.13 we would actually *always* fatally fail any request
    which came in if the limit was already reached.  The new waiting
    implemented in v4.13 actually gives us *more* breathing room -- the wait
    for 5 seconds is a wait for *any* kmod thread to finish.  We give up and
    fail *iff* no kmod thread has finished and they're *all* running
    straight for 5 consecutive seconds.  If 50 kmod threads are running
    consecutively for 5 seconds something else must be really bad.
    
    Recursive loops with kmod are bad but they're also hard to implement
    properly as a selftest without currently fooling current userspace tools
    like kmod [1].  For instance kmod will complain when you run depmod if
    it finds a recursive loop with symbol dependency between modules as such
    this type of recursive loop cannot go upstream as the modules_install
    target will fail after running depmod.
    
    These tests already exist on userspace kmod upstream though (refer to
    the testsuite/module-playground/mod-loop-*.c files).  The same is not
    true if request_module() is used though, or worst if aliases are used.
    
    Likewise the issue with 64-bit kernels booting 32-bit userspace without
    a binfmt handler built-in is also currently not detected and proactively
    avoided by userspace kmod tools, or kconfig for all architectures.
    Although we could complain in the kernel when some of these individual
    recursive issues creep up, proactively avoiding these situations in
    userspace at build time is what we should keep striving for.
    
    Lastly, since recursive loops could happen with kmod it may mean
    recursive loops may also be possible with other kernel usermode helpers,
    this should be investigated and long term if we can come up with a more
    sensible generic solution even better!
    
    [0] https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git/log/?h=20170809-kmod-for-v4.13-final
    [1] https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git
    
    This patch (of 3):
    
    This wait is similar to wait_event_interruptible_timeout() but only
    accepts SIGKILL interrupt signal.  Other signals are ignored.
    
    Link: http://lkml.kernel.org/r/20170809234635.13443-2-mcgrof@kernel.org
    
    
    Signed-off-by: default avatarLuis R. Rodriguez <mcgrof@kernel.org>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Cc: Jessica Yu <jeyu@redhat.com>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Michal Marek <mmarek@suse.com>
    Cc: Petr Mladek <pmladek@suse.com>
    Cc: Miroslav Benes <mbenes@suse.cz>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Matt Redfearn <matt.redfearn@imgtec.com>
    Cc: Dan Carpenter <dan.carpenter@oracle.com>
    Cc: Colin Ian King <colin.king@canonical.com>
    Cc: Daniel Mentz <danielmentz@google.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Matt Redfearn <matt.redfearn@imgetc.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8ada9279