From owner-svn-src-all@FreeBSD.ORG Sun Sep 22 20:59:32 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id C554ACBA; Sun, 22 Sep 2013 20:59:32 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 46F872651; Sun, 22 Sep 2013 20:59:32 +0000 (UTC) Received: from tom.home (kostik@localhost [127.0.0.1]) by kib.kiev.ua (8.14.7/8.14.7) with ESMTP id r8MKxPgY094210; Sun, 22 Sep 2013 23:59:25 +0300 (EEST) (envelope-from kostikbel@gmail.com) DKIM-Filter: OpenDKIM Filter v2.8.3 kib.kiev.ua r8MKxPgY094210 Received: (from kostik@localhost) by tom.home (8.14.7/8.14.7/Submit) id r8MKxPHD094209; Sun, 22 Sep 2013 23:59:25 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Sun, 22 Sep 2013 23:59:25 +0300 From: Konstantin Belousov To: Attilio Rao Subject: Re: svn commit: r255797 - head/sys/kern Message-ID: <20130922205925.GN41229@kib.kiev.ua> References: <201309221923.r8MJNm3u021657@svn.freebsd.org> <20130922201916.GL41229@kib.kiev.ua> <20130922203426.GM41229@kib.kiev.ua> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="anPoB0msPFVAi9r1" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Spam-Status: No, score=-2.0 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,NML_ADSP_CUSTOM_MED autolearn=no version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on tom.home Cc: "svn-src-head@freebsd.org" , Matthew Fleming , "svn-src-all@freebsd.org" , "src-committers@freebsd.org" X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Sep 2013 20:59:33 -0000 --anPoB0msPFVAi9r1 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sun, Sep 22, 2013 at 09:49:34PM +0100, Attilio Rao wrote: > On Sun, Sep 22, 2013 at 9:34 PM, Konstantin Belousov > wrote: > > On Sun, Sep 22, 2013 at 11:19:16PM +0300, Konstantin Belousov wrote: > >> On Sun, Sep 22, 2013 at 01:14:21PM -0700, Matthew Fleming wrote: > >> > On Sun, Sep 22, 2013 at 12:23 PM, Konstantin Belousov wrote: > >> >> > > Author: kib > >> > > Date: Sun Sep 22 19:23:48 2013 > >> > > New Revision: 255797 > >> > > URL: http://svnweb.freebsd.org/changeset/base/255797 > >> > > > >> > > Log: > >> > > Increase the chance of the buffer write from the bufdaemon helper > >> > > context to succeed. If the locked vnode which owns the buffer t= o be > >> > > written is shared locked, try the non-blocking upgrade of the lo= ck to > >> > > exclusive. > >> > > > >> > > PR: kern/178997 > >> > > Reported and tested by: Klaus Weber < > >> > > fbsd-bugs-2013-1@unix-admin.de> > >> > > Sponsored by: The FreeBSD Foundation > >> > > MFC after: 1 week > >> > > Approved by: re (marius) > >> > > > >> > > Modified: > >> > > head/sys/kern/vfs_bio.c > >> > > > >> > > Modified: head/sys/kern/vfs_bio.c > >> > > > >> > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D > >> > > --- head/sys/kern/vfs_bio.c Sun Sep 22 19:15:24 2013 (r= 255796) > >> > > +++ head/sys/kern/vfs_bio.c Sun Sep 22 19:23:48 2013 (r= 255797) > >> > > @@ -2624,6 +2624,8 @@ flushbufqueues(struct vnode *lvp, int ta > >> > > int hasdeps; > >> > > int flushed; > >> > > int queue; > >> > > + int error; > >> > > + bool unlock; > >> > > > >> > > flushed =3D 0; > >> > > queue =3D QUEUE_DIRTY; > >> > > @@ -2699,7 +2701,16 @@ flushbufqueues(struct vnode *lvp, int ta > >> > > BUF_UNLOCK(bp); > >> > > continue; > >> > > } > >> > > - if (vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_CANR= ECURSE) > >> > > =3D=3D 0) { > >> > > + if (lvp =3D=3D NULL) { > >> > > + unlock =3D true; > >> > > + error =3D vn_lock(vp, LK_EXCLUSIVE | LK_NO= WAIT); > >> > > + } else { > >> > > + ASSERT_VOP_LOCKED(vp, "getbuf"); > >> > > + unlock =3D false; > >> > > + error =3D VOP_ISLOCKED(vp) =3D=3D LK_EXCLU= SIVE ? 0 : > >> > > + vn_lock(vp, LK_UPGRADE | LK_NOWAIT); > >> > > > >> > > >> > I don't think this is quite right. > >> > > >> > When the lock is held shared, and VOP_LOCK is implemented by lockmgr= (9), > >> > (i.e. all in-tree filesystems?), LK_UPGRADE may drop the lock, and n= ot > >> > reacquire it. This would happen when the vnode is locked shared, the > >> > upgrade fails (2 shared owners), then lockmgr(9) will try to lock EX= , which > >> > will also fail (still one shared owner). The caller's lock is no lo= nger > >> > held. > >> > > >> > Doesn't that scenario (LK_UPGRADE failing) cause problems both for t= he > >> > caller (unexpected unlock) and for flushbufqueues(), which expects t= he > >> > vnode lock to be held since lvp is non-NULL? > >> > >> Does it ? If the lock is dropped, the code is indeed in trouble. > >> Please note that LK_NOWAIT is specified for upgrade, and I believe > >> that this causes lockmgr to return with EBUSY without dropping > >> the lock. > > > > Yes, you are right, I reverted the patch. Thank you for noting this. > > > > I am bitten by unreasonable behaviour of non-blocking upgrade once more. > > It has a history. > > > > Some time ago I proposed the following patch, which was turned down. > > That time, I was able to work-around the case. For the bufdaemon helper, > > I do not see any way to avoid this, except of sometimes locking the > > reader vnode exclusive in anticipation of the too high dirty buffer > > mark. >=20 > If you are speaking about me, you are mistaken, I never turned out this p= atch. > What I said is completely different: I said that LK_UPGRADE is a > completely wrong semantic because it can hide wrong things like the > one you hit today. > I wanted to see it removed and replaced by explicit LK_RELEASE + > LK_EXCLUSIVE operations. > Note that this would have avoided this patch. >=20 > I'm completely in favour of LK_TRYUPGRADE. Excellent, I will expedite the LK_TRYUPGRADE into tree and then reinstantia= te the bufdaemon helper patch. Thank you. --anPoB0msPFVAi9r1 Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.21 (FreeBSD) iQIcBAEBAgAGBQJSP1osAAoJEJDCuSvBvK1BbjYP/2XleBxWaB+GZXZAHiyGY1Hc 3Zkn1lfOKHGJWe+a+qeGpuvEtFki4JZJbuoiW1nmT60ljksJPDmQuhVpSgsTIaH4 HfIKqDFgaGrcrKUk2nMLuHYGKjivY65/sMTMAD4EQxk7OGby25ejmS4cY7NvnuVE jbQ3YijrbsVthJrb7BkXUfZB2GBoZ9AYC+/EJfJDZuJeEPZxsLSjcQTFligIhMjQ t96N/dHpxpbSg935sN86LvKpW1W2ttsznrdxlJaNcUbofLlNpapXEx6TovUd5dS2 K6Co6EnV26RAhSZtMylM7fcEBfyy9Bpllxe/dP4xdDlwuWjLMXMzwXN6ZduySalU UoCXJcGD7q0eflEPWq88ehgKyr9ty0Cn+eMMgY/tNkbuckPxcztdCESkBmseDgAg CfuNGI3jKQAUk3Fh0bFuN4gwk1p5Z0I9iSQNmvwx8d1S7Ec8ImW3VvEoDFy30gKW lpFRI61WK8N3Sd6hBse/C3nr/bYLb1+rF4mMr1Lqf+uidaOJsnbSltSJtYc4DKwc zKwcZaPOHGAfuRsyYB82vtT+xUfDs0dJGqj9tBBV3ToSCWOqaLqivYF9M67Qhzrn InAG+iKtjLioqgOsOfNWozWIryVe/YgCshbI38yMI7uAGp3qu+HMmqHBKs8E00J9 SDlmIjtYNnU/WxbpGh3s =donU -----END PGP SIGNATURE----- --anPoB0msPFVAi9r1--