Date: Thu, 18 Nov 1999 08:22:28 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: David Greenman <dg@root.com> Cc: remy@synx.com, bmilekic@dsuper.net, julian@whistle.com, freebsd-hackers@FreeBSD.ORG Subject: Re: mbuf wait code (revisited) -- review? Message-ID: <199911181622.IAA85547@apollo.backplane.com> References: <199911181535.HAA15679@implode.root.com>
next in thread | previous in thread | raw e-mail | index | archive | help
wakeup_one is really a very dangerous routine to use if you
aren't careful. If the one process that is woken up does not
do the correct thing (call wakeup_one again if it cannot
immediately get the resource it was waiting on) you can lockup
the system.
I would not recommend using wakeup_one in anything but an
integrated manner. That is, for example, if you were to
encapsulate the mbuf wait-for-free and mbuf freeing code
into their own routines you could then safely implement use
of wakeup_one within those routines. But if you try to implement
wakeup_one in all the myrid places where the mbuf code
might interact in this manner, you create serious instability
in the codebase.
-Matt
Matthew Dillon
<dillon@backplane.com>
:
:>On 18 Nov, Bosko Milekic wrote:
:>>
:>> Although I've presently received little feedback on this...
:>>
:>> I found a potential problem with the patch, so I am taking the following
:>> approach to bypass it. I have a feeling that there's another way, though
:>> (perhaps better, conceptually).
:>>
:>> Consider a case where there are 40 instances of tsleep all waiting for an mbuf
:>> to be freed. Consider a single mbuf beeing freed, this would awake _all_ the
:>> sleepers, the first one "queued" would succeed in the [retried] MGET whereas the
:>> other 39 will fail and return NULL (not necessarily having waited the designated
:>> mbuf_wait time).
:>>
:>> I am replacing the wakeup() in the wakeup procedure with a wakeup_one and adding
:>>......
:>
:>Another place where a wakeup_one would be of great interest is the
:>point where multiple processes are select()ing on a listen socket. Every
:>incoming connection wakes every process to have them returning to user
:>mode, have one succeeding in accept() and N-1 failling and returning to
:>select(). It have been identified as a key improvement for, eg Apache,
:>but, AFAIK, there where no proposal to provide a solving feature
:>(sysctl-ized) in FBSD (Some work have been done in Linux, since a
:>well-known comparative benchmark offense). Would be even more usefull
:>in SMP context.
:
: FreeBSD has used wakeup_one() for this purpose since I wrote wakeup_one().
:In fact, it was the main reason I wrote it. Shortly after doing this the Apache
:Group changed to using file locking to coordinate access to the socket and
:we ended up back at square one in terms of the thundering herd. Someone needs
:to modify the file locking to use wakeup_one(), but that is not as trivial
:as it might first seem (think shared/exclusive locks and priority inversion).
:
:-DG
:
:David Greenman
:Co-founder/Principal Architect, The FreeBSD Project - http://www.freebsd.org
:Creator of high-performance Internet servers - http://www.terasolutions.com
:Pave the road of life with opportunities.
:
:
:To Unsubscribe: send mail to majordomo@FreeBSD.org
:with "unsubscribe freebsd-hackers" in the body of the message
:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199911181622.IAA85547>
