Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Dec 1998 00:13:09 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        Don Lewis <Don.Lewis@tsc.tdk.com>
Cc:        freebsd-current@FreeBSD.ORG
Subject:   Re: asleep()/await(), M_AWAIT, etc...
Message-ID:  <199812200813.AAA30210@apollo.backplane.com>
References:   <199812191115.DAA12134@salsa.gv.tsc.tdk.com>

next in thread | previous in thread | raw e-mail | index | archive | help
:One case that I thought of could cause you to spin.
:
:	lock object	(succeeds)
:		MALLOC(..., M_AWAIT)	(succeeds)
:		MALLOC(..., M_AWAIT)	(fails)
:
:After the second MALLOC fails, you'll free the first chunk of memory allocated
:and unlock the object.  When you call await(), it'll succeed because memory
:is available because of the memory that was just freed.  The first MALLOC()
:will succeed, and the second one will fail again.  The way this code is
:written, it looks like only two levels, but it really is 3 by your criteria
:and thus is getting into questionable territory.

    Hmm.  This could theoretically cause a problem but the hysteresis in the
    memory subsystem ought to handle most cases.  Still, I can see
    a potential problem if the allocation is big enough (i.e. larger then a
    few pages).

:}     describe is precisely the already-existant situation that asleep() and 
:}     await() can be used to fix.  This might sound expensive, but most
:}     of the places where we would need to use asleep()/await() would not
:}     actually have to pop back more then a few subroutine levels to be
:}     effective.
:
:For pathname traversal, if you give up a lock, I think you have to restart
:from the beginning.

    This one could be solved by allocating a forward-looking namei entry 
    to placemark the blocked operation.  So if you are traversing a/b/c/d and
    while holding b you miss c, you would allocate a namei record for c to 
    placemark the I/O and release b, then block normally (i.e. just use 
    tsleep()).  This would prevent a cascade.  I do not think there are any
    path-oriented syscalls that need to lock a vnode prior to resolving the
    path, so asleep()/await() would not be necessary anyway.

							-Matt

    Matthew Dillon  Engineering, HiWay Technologies, Inc. & BEST Internet 
                    Communications & God knows what else.
    <dillon@backplane.com> (Please include original email in any response)    

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?199812200813.AAA30210>