Skip to content
  • Jason Baron's avatar
    epoll: avoid calling ep_call_nested() from ep_poll_safewake() · 57a173bd
    Jason Baron authored
    ep_poll_safewake() is used to wakeup potentially nested epoll file
    descriptors.  The function uses ep_call_nested() to prevent entering the
    same wake up queue more than once, and to prevent excessively deep
    wakeup paths (deeper than EP_MAX_NESTS).  However, this is not necessary
    since we are already preventing these conditions during EPOLL_CTL_ADD.
    This saves extra function calls, and avoids taking a global lock during
    the ep_call_nested() calls.
    
    I have, however, left ep_call_nested() for the CONFIG_DEBUG_LOCK_ALLOC
    case, since ep_call_nested() keeps track of the nesting level, and this
    is required by the call to spin_lock_irqsave_nested().  It would be nice
    to remove the ep_call_nested() calls for the CONFIG_DEBUG_LOCK_ALLOC
    case as well, however its not clear how to simply pass the nesting level
    through multiple wake_up() levels without more surgery.  In any case, I
    don't think CONFIG_DEBUG_LOCK_ALLOC is generally used for production.
    This patch, also apparently fixes a workload at Google that Salman Qazi
    reported by completely removing the poll_safewake_ncalls->lock from
    wakeup paths.
    
    Link: http://lkml.kernel.org/r/1507920533-8812-1-git-send-email-jbaron@akamai.com
    
    
    Signed-off-by: default avatarJason Baron <jbaron@akamai.com>
    Acked-by: default avatarDavidlohr Bueso <dbueso@suse.de>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Salman Qazi <sqazi@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    57a173bd