Date: Tue, 18 May 1999 00:36:40 +0200 From: Pierre Beyssac <beyssac@enst.fr> To: Matthew Dillon <dillon@apollo.backplane.com>, Garrett Wollman <wollman@khavrinen.lcs.mit.edu> Cc: freebsd-current@FreeBSD.ORG Subject: Re: mbuf starvation Message-ID: <19990518003640.A2978@enst.fr> In-Reply-To: <199905122034.NAA88116@apollo.backplane.com>; from Matthew Dillon on Wed, May 12, 1999 at 01:34:05PM -0700 References: <19990512172544.A440@enst.fr> <199905121656.MAA00970@khavrinen.lcs.mit.edu> <199905122034.NAA88116@apollo.backplane.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, May 12, 1999 at 01:34:05PM -0700, Matthew Dillon wrote: > asleep() allows a subroutine deep in the call stack to specify an > asynchronous blocking condition and then return a temporary failure > up through the ranks. At the top level, the scheduler sees and acts > upon the asynchronous blocking condition. Higher level routines do not So if I get it right, this would give something like the code below. Is that the idea? What's missing in the asleep/await code to use them in such a way? soxxx() { for (;;) { await(&mbuf_slp); /* code */ error = xxx(&mbuf_slp); if (error != ENOBUFS) break; } } m_retry() { /* find an mbuf... */ if (/* got an mbuf to return */) return mbuf; else { asleep(&mbuf_slp); return NULL; } } m_free() { /* Free mbuf... */ wakeup(&mbuf_slp); } And, unless I'm missing something, we still need to properly check for NULL return values from m_get and friends. -- Pierre Beyssac pb@enst.fr To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990518003640.A2978>