netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tom Herbert <therbert@google.com>
To: David Miller <davem@davemloft.net>
Cc: shemminger@vyatta.com, dada1@cosmosbay.com, andi@firstfloor.org,
	netdev@vger.kernel.org
Subject: Re: [PATCH] Software receive packet steering
Date: Wed, 22 Apr 2009 08:46:13 -0700	[thread overview]
Message-ID: <65634d660904220846h3bbd35a7n5269f6d23db6cea4@mail.gmail.com> (raw)
In-Reply-To: <20090422.022120.211323498.davem@davemloft.net>

>
> There are some things I've been brainstorming about.
>
> One thought I keep coming back to is the hack the block layer
> is using right now.  It remembers which CPU a block I/O request
> comes in on, and it makes sure the completion runs on that
> cpu too.
>
> We could remember the cpu that the last socket level operation
> occurred upon, and use that as a target for packets.  This requires a
> bit of work.
>
> First we'd need some kind of pre-demux at netif_receive_skb()
> time to look up the cpu target, and reference this blob from
> the socket somehow, and keep it uptodate at various specific
> locations (read/write/poll, whatever...).
>
> Or we could pre-demux the real socket.  That could be exciting.
>

We are doing the pre-demux, and it works well.  The additional benefit
is that the hash result or the the sk itself could be cached in the
skb for the upper layer protocol.

One caveat though is that if the device provides a hash, ie. Toeplitz,
we really want to use that in the CPU look-up to avoid the cache miss
on the header.  We considered using the Toeplitz hash as the inet
hash, but it's incredibly expensive to do in software being about 20x
slower than inet_ehashfn is best we could do.  Our (naive) solution is
to maintain a big array of CPU indices where we write the CPU ids from
recvmsg and sendmsg, and then read it using the hash provided on
incoming packets.  This is lockless and allows very fast operations,
but doesn't take collisions into account (probably allows a slim
possibility of thrashing a connection between CPUs).  The other option
we considered was maintaining a secondary cnx lookup table based on
Toeplitz hash, but that seemed to be rather involved.

> But then we come back to the cpu number changing issue.  There is a
> cool way to handle this, because it seems that we can just keep
> queueing to the previous cpu and it can check the socket cpu cookie.
> If that changes, the old target can push the rest of it's queue to
> that cpu and then update the cpu target blob.
>
> Anyways, just some ideas.
>
Thanks for your thoughts.

  reply	other threads:[~2009-04-22 15:46 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-08 22:48 [PATCH] Software receive packet steering Tom Herbert
2009-04-08 23:08 ` Stephen Hemminger
2009-04-08 23:09 ` Stephen Hemminger
2009-04-08 23:15   ` David Miller
2009-04-09 16:43     ` Tom Herbert
2009-04-09 18:23       ` Ben Hutchings
2009-04-09 21:17       ` David Miller
2009-04-09  0:36 ` David Miller
2009-04-09  4:40   ` Tom Herbert
2009-04-09  5:24     ` David Miller
2009-04-20 10:32 ` Andi Kleen
2009-04-20 10:46   ` David Miller
2009-04-21  3:26   ` Tom Herbert
2009-04-21  9:48     ` Eric Dumazet
2009-04-21 15:46       ` Stephen Hemminger
2009-04-21 18:52         ` Tom Herbert
2009-04-22  9:21           ` David Miller
2009-04-22 15:46             ` Tom Herbert [this message]
2009-04-22 18:49             ` Rick Jones
2009-04-22 20:44             ` Jesper Dangaard Brouer
2009-04-23  6:58               ` Jens Axboe
2009-04-23  7:25                 ` David Miller
2009-04-23  7:29                   ` Jens Axboe
2009-04-23  9:12               ` Jens Laas
2009-04-22 14:33         ` Martin Josefsson
2009-04-23  7:34           ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=65634d660904220846h3bbd35a7n5269f6d23db6cea4@mail.gmail.com \
    --to=therbert@google.com \
    --cc=andi@firstfloor.org \
    --cc=dada1@cosmosbay.com \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    --cc=shemminger@vyatta.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).