1
linux/net/core
Eric Dumazet bf368e4e70 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
37e5540b3c 
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>
2009-04-28 02:24:21 -07:00
..
datagram.c net: Avoid extra wakeups of threads blocked in wait_for_packet() 2009-04-28 02:24:21 -07:00
dev_mcast.c
dev.c net: Fix GRO for multiple page fragments 2009-04-20 02:20:30 -07:00
drop_monitor.c Network Drop Monitor: Adding drop monitor implementation & Netlink protocol 2009-03-13 12:09:29 -07:00
dst.c
ethtool.c core: remove pointless conditional before kfree() 2009-03-31 15:06:26 -07:00
fib_rules.c netlink: change nlmsg_notify() return value logic 2009-02-24 23:18:28 -08:00
filter.c
flow.c
gen_estimator.c
gen_stats.c
iovec.c
kmap_skb.h
link_watch.c
Makefile Network Drop Monitor: Adding Build changes to enable drop monitor 2009-03-13 12:09:29 -07:00
neighbour.c neigh: Allow for user space users of the neighbour table 2009-03-04 00:03:08 -08:00
net_namespace.c netns: Remove net_alive 2009-03-03 01:14:27 -08:00
net-sysfs.c net: fix warning about non-const string 2009-03-10 05:22:43 -07:00
net-sysfs.h
net-traces.c Network Drop Monitor: Add trace declaration for skb frees 2009-03-13 12:09:27 -07:00
netevent.c
netpoll.c netpoll: store local and remote ip in net-endian 2009-03-28 23:55:58 -07:00
pktgen.c proc 2/2: remove struct proc_dir_entry::owner 2009-03-31 01:14:44 +04:00
request_sock.c
rtnetlink.c netlink: change nlmsg_notify() return value logic 2009-02-24 23:18:28 -08:00
scm.c
skb_dma_map.c
skbuff.c gso: Fix support for linear packets 2009-03-28 23:39:18 -07:00
sock.c epoll keyed wakeups: make sockets use keyed wakeups 2009-04-01 08:59:20 -07:00
stream.c
sysctl_net_core.c sysctl: fix sparse warning: Should it be static? 2009-02-26 23:13:34 -08:00
user_dma.c
utils.c net: core: remove unneeded include in net/core/utils.c. 2009-03-26 01:11:48 -07:00