]> git.baikalelectronics.ru Git - kernel.git/commit
net: Avoid extra wakeups of threads blocked in wait_for_packet()
authorEric Dumazet <dada1@cosmosbay.com>
Tue, 28 Apr 2009 09:24:21 +0000 (02:24 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 28 Apr 2009 09:24:21 +0000 (02:24 -0700)
commitbf330d912a55cfdc6a6af93f89fca86dd64249e2
tree43c8cd772aa17ca1dd852682ca489ccc7ab3fcd6
parentf92e9ab1399879ed66773720c688f084641b4307
net: Avoid extra wakeups of threads blocked in wait_for_packet()

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
dafee6c4b6e1b204cc7a77ad56fa1fdc92a3dd6d
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: Christoph Lameter <cl@linux.com>
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/wait.h
net/core/datagram.c