From owner-freebsd-arch@FreeBSD.ORG Thu Nov 13 15:26:12 2014 Return-Path: Delivered-To: freebsd-arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 8D681FF0; Thu, 13 Nov 2014 15:26:12 +0000 (UTC) Received: from bigwig.baldwin.cx (bigwig.baldwin.cx [IPv6:2001:470:1f11:75::1]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 651A39CC; Thu, 13 Nov 2014 15:26:12 +0000 (UTC) Received: from jhbbsd.localnet (unknown [209.249.190.124]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id D40B9B978; Thu, 13 Nov 2014 10:26:10 -0500 (EST) From: John Baldwin To: freebsd-arch@freebsd.org Subject: Re: Questions about locking; turnstiles and sleeping threads Date: Thu, 13 Nov 2014 09:48:23 -0500 User-Agent: KMail/1.13.5 (FreeBSD/8.4-CBSD-20140415; KDE/4.5.5; amd64; ; ) References: <54647D1E.9010904@freebsd.org> In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201411130948.23785.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.7 (bigwig.baldwin.cx); Thu, 13 Nov 2014 10:26:10 -0500 (EST) Cc: Hans Petter Selasky , Adrian Chadd , Alfred Perlstein X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Nov 2014 15:26:12 -0000 On Thursday, November 13, 2014 4:52:50 am Adrian Chadd wrote: > Hm, the more I dig into this, the more I realise it's not a 1:45am > question to ask. > > Specifically, callout_stop_safe() takes 'safe', which says "are we > waiting around for this callout to finish if it started". Ie, > callout_drain() is callout_stop_safe(c, 1) ; callout_stop() is > callout_stop_safe(c, 0). > > If safe is 1, then it'll potentially put the current thread to sleep > in order to wait for it to synchronise with the callout that's > running. It's sleeping with cc_lock which is the per-callwheel lock > and it's doing that with whatever other locks are held. That's the > situation which is tripping things up. > > The manpage says that no locks should be held that the callout may > block on, which isn't the case here at all - I'm trying to grab a lock > in another thread that the caller _into_ the callout subsystem holds. > The manpage doesn't mention anything about this. Sniffle. It should just say "no sleepable locks at all". And yes, callout_stop() is perfectly fine to call with locks held. It is only callout_drain() that should not be called, same as with bus_teardown_intr() and taskqueue_drain() (other routines that can sleep while ensuring that an asynchronous task run by another thread is stopped). -- John Baldwin