• Eric Dumazet's avatar
    net: Avoid extra wakeups of threads blocked in wait_for_packet() · bf368e4e
    Eric Dumazet authored
    In 2.6.25 we added UDP mem accounting.
    
    This unfortunatly added a penalty when a frame is transmitted, since
    we have at TX completion time to call sock_wfree() to perform necessary
    memory accounting. This calls sock_def_write_space() and utimately
    scheduler if any thread is waiting on the socket.
    Thread(s) waiting for an incoming frame was scheduled, then had to sleep
    again as event was meaningless.
    
    (All threads waiting on a socket are using same sk_sleep anchor)
    
    This adds lot of extra wakeups and increases latencies, as noted
    by Christoph Lameter, and slows down softirq handler.
    
    Reference : http://marc.info/?l=linux-netdev&m=124060437012283&w=2 
    
    Fortunatly, Davide Libenzi recently added concept of keyed wakeups
    into kernel, and particularly for sockets (see commit
    37e5540b 
    epoll keyed wakeups: make sockets use keyed wakeups)
    
    Davide goal was to optimize epoll, but this new wakeup infrastructure
    can help non epoll users as well, if they care to setup an appropriate
    handler.
    
    This patch introduces new DEFINE_WAIT_FUNC() helper and uses it
    in wait_for_packet(), so that only relevant event can wakeup a thread
    blocked in this function.
    
    Trace of function calls from bnx2 TX completion bnx2_poll_work() is :
    __kfree_skb()
     skb_release_head_state()
      sock_wfree()
       sock_def_write_space()
        __wake_up_sync_key()
         __wake_up_common()
          receiver_wake_function() : Stops here since thread is waiting for an INPUT
    Reported-by: default avatarChristoph Lameter <cl@linux.com>
    Signed-off-by: default avatarEric Dumazet <dada1@cosmosbay.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    bf368e4e
datagram.c 15.6 KB