All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bill Fink <billfink@mindspring.com>
To: David Miller <davem@davemloft.net>
Cc: herbert@gondor.apana.org.au, ilpo.jarvinen@helsinki.fi,
	netdev@vger.kernel.org, jheffner@psc.edu
Subject: Re: TSO trimming question
Date: Fri, 21 Dec 2007 05:58:22 -0500	[thread overview]
Message-ID: <20071221055822.8d977800.billfink@mindspring.com> (raw)
In-Reply-To: <20071221.013642.29817274.davem@davemloft.net>

On Fri, 21 Dec 2007, David Miller wrote:

> From: Herbert Xu <herbert@gondor.apana.org.au>
> Date: Fri, 21 Dec 2007 17:29:27 +0800
> 
> > On Fri, Dec 21, 2007 at 01:27:20AM -0800, David Miller wrote:
> > >
> > > It's two shifts, and this gets scheduled along with the other
> > > instructions on many cpus so it's effectively free.
> > > 
> > > I don't see why this is even worth mentioning and discussing.
> > 
> > I totally agree.  Two shifts are way better than a branch.
> 
> We take probably a thousand+ 100+ cycle cache misses in the TCP stack
> on big window openning ACKs.
> 
> Instead of discussing ways to solve that huge performance killer we're
> wanking about two friggin' integer shifts.
> 
> It's hilarious isn't it? :-)

I don't think obfuscated code is hilarious.  Instead of the convoluted
and dense code:

	/* Defer for less than two clock ticks. */
	if (tp->tso_deferred &&
	    ((jiffies << 1) >> 1) - (tp->tso_deferred >> 1) > 1)

You can have the much simpler and more easily understandable:

	/* Defer for less than two clock ticks. */
	if (tp->tso_deferred && (jiffies - tp->tso_deferred) > 1)

And instead of:

	/* Ok, it looks like it is advisable to defer.  */
        tp->tso_deferred = 1 | (jiffies<<1);

        return 1;

You could do as Ilpo suggested:

	/* Ok, it looks like it is advisable to defer.  */
	tp->tso_deferred = max_t(u32, jiffies, 1);

        return 1;

Or perhaps more efficiently:

	/* Ok, it looks like it is advisable to defer.  */
	tp->tso_deferred = jiffies;
	if (unlikely(jiffies == 0))
		tp->tso_deferred = 1;

        return 1;

Or perhaps even:

	/* Ok, it looks like it is advisable to defer.  */
	tp->tso_deferred = jiffies;

	/* need to return a non-zero value to defer, which means won't
	 * defer if jiffies == 0 but it's only a 1 in 4 billion event
	 * (and avoids a compare/branch by not checking jiffies)
	 /
        return jiffies;

Since it really only needs a non-zero return value to defer.

See, no branches needed and much clearer code.  That seems worthwhile
to me from a code maintenance standpoint, even if it isn't any speed
improvement.

And what about the 64-bit jiffies versus 32-bit tp->tso_deferred issue?
Should tso_deferred be made unsigned long to match jiffies?

						-Bill

  reply	other threads:[~2007-12-21 10:58 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-12-19 21:46 TSO trimming question Ilpo Järvinen
2007-12-19 22:02 ` Ilpo Järvinen
2007-12-20  3:26   ` Herbert Xu
2007-12-20  7:55     ` David Miller
2007-12-20  7:54 ` David Miller
2007-12-20 11:40   ` Ilpo Järvinen
2007-12-20 11:56     ` David Miller
2007-12-20 16:02       ` John Heffner
2007-12-21  4:36         ` David Miller
2007-12-21  8:06       ` Bill Fink
2007-12-21  9:26         ` Ilpo Järvinen
2007-12-21  9:28           ` Ilpo Järvinen
2007-12-21  9:27         ` David Miller
2007-12-21  9:29           ` Herbert Xu
2007-12-21  9:36             ` David Miller
2007-12-21 10:58               ` Bill Fink [this message]
2007-12-21 18:54                 ` Bill Fink
2007-12-21 18:58                   ` Ilpo Järvinen
2007-12-21 19:37                     ` Bill Fink
2007-12-20 12:00     ` David Miller
2007-12-20 12:35       ` Ilpo Järvinen
2007-12-20 14:00       ` Herbert Xu
2007-12-20 23:55         ` David Miller
2007-12-21 18:55           ` [PATCH] [TCP]: Force TSO splits to MSS boundaries Ilpo Järvinen
2007-12-21 20:01             ` Ilpo Järvinen
2007-12-25  5:35             ` 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=20071221055822.8d977800.billfink@mindspring.com \
    --to=billfink@mindspring.com \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=ilpo.jarvinen@helsinki.fi \
    --cc=jheffner@psc.edu \
    --cc=netdev@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.