Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 Mar 2002 16:48:40 -0700
From:      Chad David <davidc@acns.ab.ca>
To:        Alfred Perlstein <bright@mu.org>
Cc:        John Baldwin <jhb@FreeBSD.org>, smp@FreeBSD.org
Subject:   Re: select fix and giant pushdown patch
Message-ID:  <20020311164840.A89277@colnta.acns.ab.ca>
In-Reply-To: <20020311232903.GB92565@elvis.mu.org>; from bright@mu.org on Mon, Mar 11, 2002 at 03:29:03PM -0800
References:  <20020311001131.GN26621@elvis.mu.org> <XFMail.020311120529.jhb@FreeBSD.org> <20020311222102.GA92565@elvis.mu.org> <20020311154042.A89113@colnta.acns.ab.ca> <20020311232903.GB92565@elvis.mu.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Mar 11, 2002 at 03:29:03PM -0800, Alfred Perlstein wrote:
> * Chad David <davidc@acns.ab.ca> [020311 14:40] wrote:
> > On Mon, Mar 11, 2002 at 02:21:02PM -0800, Alfred Perlstein wrote:
> > > 
> > > No, actually this code needs to be fixed up. :)  *slaps chad*
> > > It should be a TAILQ_FOREACH followed by a TAILQ_INIT. :)
> > 
> > man 9 queue
> > Note: Faster TailQ Deletion.  If you cannot trust the man page what
> > can you trust ;-).
> 
> That only applies when removing the nodes from the list. :)
> UTSL sys/queue.h to see what TAILQ_FOREACH expands to. :)

I know, I know.  I wrote some of this at 4am, and I'm still feeling
stupid about all of the other dump things I did, so don't rub it in :(.

> 
> > > This is Chad's XXX, what he's talking about is why do we need to clear
> > > the TDF_SELECT flag at all, not that it's done while holding sched lock
> > > (which makes sense).
> > > 
> > > I think there's actually a race here, we seem to only recheck the
> > > TDF_SELECT flag if there was a timeout specified in the select call.
> > > So if there wasn't a timeout it looks like we could loose a race
> > > where an fd being waited on but we don't recheck if a selwakeup occured
> > > on it.  Am I missing something?  Basically, I think this code should be
> > > something like:
> > > 
> > >        mtx_lock_spin(&sched_lock);
> > >        if ((td->td_flags & TDF_SELECT) == 0) {
> > >               mtx_unlock_spin(&sched_lock);
> > >               goto restart;
> > >        }
> > >        td->td_flags &= ~TDF_SELECT;
> > >        mtx_unlock_spin(&sched_lock);
> > 
> > I think you also need to check nselcoll.
> 
> Good call.  Are you sure about this?  It's just odd that there's so
> much hysterics when a timeout is involved... should we just nuke
> that code and add the 'goto restart' here if the flag is unset OR
> we've had more collisions?

I think you need the extra call to selscan() in the timedout case so that
you will return with the most up to date bits set.  You could put a check
right after we lock sellock and remove the timeout check, but if we are
timedout you probably do not want to loop there, but instead just update
the bits and return?

I would remove the td->td_flags &= ~TDF_SELECT part all together after the
timeout check as is gets cleared right after done: anyway.

-- 
Chad David        davidc@acns.ab.ca
www.FreeBSD.org   davidc@freebsd.org
ACNS Inc.         Calgary, Alberta Canada
Fourthly, The constant breeders, beside the gain of eight shillings
sterling per annum by the sale of their children, will be rid of the
charge of maintaining them after the first year. - Johnathan Swift

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-smp" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020311164840.A89277>