Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Oct 2013 11:17:00 +0300
From:      Alexander Motin <mav@FreeBSD.org>
To:        John Baldwin <jhb@freebsd.org>
Cc:        svn-src-projects@freebsd.org, Adrian Chadd <adrian@freebsd.org>, "src-committers@freebsd.org" <src-committers@freebsd.org>
Subject:   Re: svn commit: r254846 - projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <525CF9FC.2000109@FreeBSD.org>
In-Reply-To: <201308261425.34743.jhb@freebsd.org>
References:  <201308251121.r7PBLA3v033536@svn.freebsd.org> <CAJ-VmomGUoQco04RCPuc1iA%2B1qecPqzBb_u8PBKiTL-Y0SaMkQ@mail.gmail.com> <521A06A2.7050807@FreeBSD.org> <201308261425.34743.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 26.08.2013 21:25, John Baldwin wrote:
> On Sunday, August 25, 2013 9:29:06 am Alexander Motin wrote:
>> On 25.08.2013 15:48, Adrian Chadd wrote:
>>> Surely there's a better way to check whether a thread can sleep besides
>>> digging around in curthread->td_no_sleeping ? What about adding an
>>> accessor macro along side THREAD_SLEEPING_OK and THREAD_NO_SLEEPING ?
>>
>> That sounds good to me. I was also surprised such macros are not there
>> yet when found some code doing these checks just the same way as I did.
>
> It was never intended to be public, only as a debugging aid for assertions. :(
> I had hoped that the calling code would know when it was in an ithread or not
> and call different routines as needed (i.e. that the programmer would
> intentionally think about the context they were in).  Perhaps this is not
> realistic?  Are you really queueing new I/O from ithreads and/or timers?

I've found potential case where it is not realistic. Requests are 
normally completed from the interrupt threads. Completion caller does 
know that it is impossible to sleep in that context. But it holds no 
locks, it is re-enterable, and so it allows direct completion. Request 
goes up the stack and at some point on the call chain this completion 
triggers another request to be sent down (may be even to some different 
device), but again directly. This new request sender knows nothing about 
interrupt context and the fact it can't sleep.

Can you propose some other way to deal with such case other then using 
per-thread flag/counter?  I could use separate per-thread counter, 
incremented during up call, but I don't see much benefits form it. If 
you don't want it to be system-wide accessible to not relax people too 
much, I could create GEOM-specific wrapper for it.

-- 
Alexander Motin



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