From owner-svn-src-head@FreeBSD.ORG Thu May 21 16:15:41 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 381811065676; Thu, 21 May 2009 16:15:41 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from mail.terabit.net.ua (mail.terabit.net.ua [195.137.202.147]) by mx1.freebsd.org (Postfix) with ESMTP id BD6578FC13; Thu, 21 May 2009 16:15:40 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from skuns.zoral.com.ua ([91.193.166.194] helo=mail.zoral.com.ua) by mail.terabit.net.ua with esmtps (TLSv1:AES256-SHA:256) (Exim 4.63 (FreeBSD)) (envelope-from ) id 1M7Avi-000I5Y-Mb; Thu, 21 May 2009 19:15:38 +0300 Received: from deviant.kiev.zoral.com.ua (root@deviant.kiev.zoral.com.ua [10.1.1.148]) by mail.zoral.com.ua (8.14.2/8.14.2) with ESMTP id n4LGFZMV030613 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 21 May 2009 19:15:35 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (kostik@localhost [127.0.0.1]) by deviant.kiev.zoral.com.ua (8.14.3/8.14.3) with ESMTP id n4LGFZr9072271; Thu, 21 May 2009 19:15:35 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: (from kostik@localhost) by deviant.kiev.zoral.com.ua (8.14.3/8.14.3/Submit) id n4LGFZio072270; Thu, 21 May 2009 19:15:35 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: deviant.kiev.zoral.com.ua: kostik set sender to kostikbel@gmail.com using -f Date: Thu, 21 May 2009 19:15:35 +0300 From: Kostik Belousov To: John Baldwin Message-ID: <20090521161535.GQ1927@deviant.kiev.zoral.com.ua> References: <3bbf2fe10905210629p46c7a204v6863aaba77354462@mail.gmail.com> <20090521.094100.70797067.imp@bsdimp.com> <4A157919.7040103@samsco.org> <200905211211.00168.jhb@freebsd.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="0oEQci8Wf3TZ4Qnh" Content-Disposition: inline In-Reply-To: <200905211211.00168.jhb@freebsd.org> User-Agent: Mutt/1.4.2.3i X-Virus-Scanned: clamav-milter 0.95.1 at skuns.kiev.zoral.com.ua X-Virus-Status: Clean X-Spam-Status: No, score=-4.4 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on skuns.kiev.zoral.com.ua X-Virus-Scanned: mail.terabit.net.ua 1M7Avi-000I5Y-Mb 0255286934944ef271be3be154ef0b89 X-Terabit: YES Cc: Scott Long , src-committers@freebsd.org, svn-src-all@freebsd.org, attilio@freebsd.org, rwatson@freebsd.org, svn-src-head@freebsd.org, "M. Warner Losh" Subject: Re: svn commit: r192535 - head/sys/kern X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 May 2009 16:15:41 -0000 --0oEQci8Wf3TZ4Qnh Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, May 21, 2009 at 12:10:59PM -0400, John Baldwin wrote: > On Thursday 21 May 2009 11:54:01 am Scott Long wrote: > > M. Warner Losh wrote: > > > In message: > > > Robert Watson writes: > > > : On Thu, 21 May 2009, John Baldwin wrote: > > > :=20 > > > : >>>> Move the M_WAITOK flag in notify() into an M_NOWAIT one in o= rder=20 > to > > > : > match > > > : >>>> the behaviour alredy present with the further malloc() call = in > > > : >>>> devctl_notify(). > > > : >>>> This fixes a bug in the CAM layer where the camisr handler= =20 > finished to > > > : >>>> call camperiphfree() (and subsequently destroy_dev() resulti= ng in=20 > a new > > > : >>>> dev notify) while the xpt lock is held. > > > : >>> This is wrong. You cannot call destroy_dev() while holding any= =20 > mutex.=20 > > > : >>> Taking this into account, it makes no sense to use M_NOWAIT in= =20 > notify(). > > > : >> > > > : >> As long as devctl_notify() also calls M_NOWAIT and if not availa= ble=20 > skips=20 > > > : >> "silently" it just does the same thing, I think this approach is= more=20 > > > : >> consistent. > > > : >> > > > : >> It remains, though, the fact to fix CAM when calling destroy_dev= ().=20 > Maybe=20 > > > : >> we should add a witness_warn() there? > > > : > > > > : > I agree with kib, this should be reverted and CAM fixed instead. = I=20 > also=20 > > > : > agree that M_NOWAIT use should be limited where possible. > > > :=20 > > > : devctl_notify() probably needs to grow a sleepable flag, or perhaps= we=20 > need=20 > > > : two variations, one that can sleep. > > >=20 > > > devctl_notify() has expanded well beyond its original needs. Having > > > an extra case for sleeping is the wrong way to solve this problem. > > > Really. We're adding hacks on hacks on hacks here and we need to step > > > back and think. > > >=20 > > > I specifically didn't put in CDEV notifications into devd when I > > > originally did it because one can get the same notification via > > > kevents on /dev. Maybe the right answer is to remove this stuff > > > entirely and update devd to do that instead? It isn't a lot of code, > > > and should provide equivalent functionality without needing to change > > > the rules of the game when it comes to destroy_dev(). Especially this > > > close to the code slush... > > >=20 > > > Comments? > > >=20 > > > Warner > >=20 > > Very much in agreement here. I would also love to have destroy_dev()= =20 > > and make_dev() be locking-neutral. Having sleepable locks in leaf APIs > > is unpleasant for consumers of those APIs. >=20 > destroy_dev() does not use a sleepable lock, the problem is it drains so = it=20 > can provide sane semantics to a caller who wants to ensure that all outsi= de=20 > references to a cdev are gone when it returns. You can't provide that=20 > without doing some sort of synchronization with the other threads trying = to=20 > call d_open(), etc. And you most certainly can't do it if you call=20 > destroy_dev() while holding your driver's mutex as you then have the prob= lem=20 > that some other thread could be blocked on that mutex already in your=20 > d_open() routine when you call destroy_dev(). These sane semantics are= =20 > needed so drivers can do things like safely free softcs and destroy locks= ,=20 > etc. Another thing done inside destroy_dev is the call to the destructors of the cdevpriv data, that never had any restrictions on the sleepable context. We do have the KPI for the callers that cannot drop the locks and need to do destroy_dev, destroy_dev_sched(9). --0oEQci8Wf3TZ4Qnh Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEARECAAYFAkoVficACgkQC3+MBN1Mb4hyVQCaAiEfReu++iOf9z9sIld9D55I rqsAn2Jbhj37bADDDheoIcH7uREDQrzQ =3Zxs -----END PGP SIGNATURE----- --0oEQci8Wf3TZ4Qnh--