Skip site navigation (1)Skip section navigation (2)
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>