Thread (35 messages) 35 messages, 9 authors, 2008-04-21

Re: [RFC,PATCH] loopback: calls netif_receive_skb() instead of netif_rx()

From: Ingo Molnar <hidden>
Date: 2008-03-31 10:44:29
Also in: lkml

* David Miller [off-list ref] wrote:
I don't think it's safe.

Every packet you receive can result in a sent packet, which in turn 
can result in a full packet receive path being taken, and yet again 
another sent packet.

And so on and so forth.

Some cases like this would be stack bugs, but wouldn't you like that 
bug to be a very busy cpu instead of a crash from overrunning the 
current stack?
sure.

But the core problem remains: our loopback networking scalability is 
poor. For plain localhost<->localhost connected sockets we hit the 
loopback device lock for every packet, and this very much shows up on 
real workloads on a quad already: the lock instruction in netif_rx is 
the most expensive instruction in a sysbench DB workload.

and it's not just about scalability, the plain algorithmic overhead is 
way too high as well:

 $ taskset 1 ./bw_tcp -s
 $ taskset 1 ./bw_tcp localhost
 Socket bandwidth using localhost: 2607.09 MB/sec
 $ taskset 1 ./bw_pipe
 Pipe bandwidth: 3680.44 MB/sec

i dont think this is acceptable. Either we should fix loopback TCP 
performance or we should transparently switch to VFS pipes as a 
transport method when an app establishes a plain loopback connection (as 
long as there are no frills like content-modifying component in the 
delivery path of packets after a connection has been established - which 
covers 99.9% of the real-life loopback cases).

I'm not suggesting we shouldnt use TCP for connection establishing - but 
if the TCP loopback packet transport is too slow we should use the VFS 
transport which is both more scalable, less cache-intense and has lower 
straight overhead as well.

	Ingo
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help