[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20070604105158.31ede1f5@freepuppy>
Date: Mon, 4 Jun 2007 10:51:58 -0700
From: Stephen Hemminger <shemminger@...ux-foundation.org>
To: Thomas Gleixner <tglx@...utronix.de>
Cc: Ulrich Drepper <drepper@...il.com>,
Maximilian Engelhardt <maxi@...monizer.de>,
Michael Buesch <mb@...sch.de>,
linux-kernel <linux-kernel@...r.kernel.org>,
linux-wireless <linux-wireless@...r.kernel.org>,
Arnaldo Carvalho de Melo <acme@...stprotocols.net>,
Jeff Garzik <jgarzik@...ox.com>,
Gary Zambrano <zambrano@...adcom.com>, netdev@...r.kernel.org,
Andrew Morton <akpm@...ux-foundation.org>,
Ingo Molnar <mingo@...e.hu>
Subject: Re: iperf: performance regression (was b44 driver problem?)
On Mon, 04 Jun 2007 19:32:48 +0200
Thomas Gleixner <tglx@...utronix.de> wrote:
> On Mon, 2007-06-04 at 09:59 -0700, Stephen Hemminger wrote:
> > > > gettimeofday({1180973726, 982754}, NULL) = 0
> > > > recv(4, "\0\0\0\0\0\0\0\1\0\0\23\211\0\0\0\0\0\0\0\0\377\377\364"..., 8192, 0) = 8192
> > > > gettimeofday({1180973726, 983790}, NULL) = 0
> > >
> > > Well, gettimeofday() is not affected by the highres code, but
> > >
> > > > nanosleep({0, 0}, NULL) = 0
> > > > nanosleep({0, 0}, NULL) = 0
> > >
> > > is. The nanosleep call with a relative timeout of 0 returns immediately
> > > with highres enabled, while it sleeps at least until the next tick
> > > arrives when highres is off. Are there more of those stupid sleeps in
> > > the code ?
> >
> > GLIBC pthread_mutex does it, YES it is a problem!
> > Looks like the old behavior is required for ABI compatibility.
> >
> > iperf server has several threads. One thread is using pthread_mutex_lock
> > to wait for the other thread. It looks like pthread_mutex_lock is using
> > nanosleep as yield().
>
> I doubt that. This is in the iperf code itself.
>
> void thread_rest ( void ) {
> #if defined( HAVE_THREAD )
> #if defined( HAVE_POSIX_THREAD )
> // TODO add checks for sched_yield or pthread_yield and call that
> // if available
> usleep( 0 );
>
> ----------^^^^
>
> It results in a nanosleep({0,0}, NULL)
>
> tglx
>
Yes, the following patch makes iperf work better than ever.
But are other broken applications going to have same problem.
Sounds like the old "who runs first" fork() problems.
--- iperf-2.0.2/compat/Thread.c.orig 2005-05-03 08:15:51.000000000 -0700
+++ iperf-2.0.2/compat/Thread.c 2007-06-04 10:54:21.000000000 -0700
@@ -405,9 +405,13 @@
void thread_rest ( void ) {
#if defined( HAVE_THREAD )
#if defined( HAVE_POSIX_THREAD )
- // TODO add checks for sched_yield or pthread_yield and call that
- // if available
+
+#if defined( _POSIX_PRIORITY_SCHEDULING )
+ sched_yield();
+#else
usleep( 0 );
+#endif
+
#else // Win32
SwitchToThread( );
#endif
--
Stephen Hemminger <shemminger@...ux-foundation.org>
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists