Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Apr 2021 22:06:40 +0200
From:      Alexander Lochmann <alexander.lochmann@tu-dortmund.de>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        freebsd-fs@freebsd.org
Subject:   Re: [struct buf] Unlocked access to b_vflags?
Message-ID:  <6f370c67-f3ba-00ce-5da7-7ee400a4180b@tu-dortmund.de>
In-Reply-To: <YH3hQcmVhFvQK81W@kib.kiev.ua>
References:  <792c8a3d-8ea6-073f-3fda-b3eb793ef2b9@tu-dortmund.de> <YHVxfMrU9lmw3sG9@kib.kiev.ua> <4ade0f5d-d4f4-616a-b198-fc58f947070d@tu-dortmund.de> <YH3hQcmVhFvQK81W@kib.kiev.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--HFWgVQWvOw8vw2RbNT5bdXY3emhVZWJKN
Content-Type: multipart/mixed; boundary="50Rj90fW8Fc0EkjBE07aP6mNyo9ZDIM1h";
 protected-headers="v1"
From: Alexander Lochmann <alexander.lochmann@tu-dortmund.de>
To: Konstantin Belousov <kostikbel@gmail.com>
Cc: freebsd-fs@freebsd.org
Message-ID: <6f370c67-f3ba-00ce-5da7-7ee400a4180b@tu-dortmund.de>
Subject: Re: [struct buf] Unlocked access to b_vflags?
References: <792c8a3d-8ea6-073f-3fda-b3eb793ef2b9@tu-dortmund.de>
 <YHVxfMrU9lmw3sG9@kib.kiev.ua>
 <4ade0f5d-d4f4-616a-b198-fc58f947070d@tu-dortmund.de>
 <YH3hQcmVhFvQK81W@kib.kiev.ua>
In-Reply-To: <YH3hQcmVhFvQK81W@kib.kiev.ua>

--50Rj90fW8Fc0EkjBE07aP6mNyo9ZDIM1h
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Language: de-DE
Content-Transfer-Encoding: quoted-printable



On 19.04.21 22:00, Konstantin Belousov wrote:
> On Mon, Apr 19, 2021 at 09:43:47PM +0200, Alexander Lochmann wrote:
>> Out of curiosity: What's the path from function entry to the access in=20
line
>> 759?
>> The lock is acquired upon function entry in line 7197, and never relea=
sed
>> afterwards (except for the lines 7212 and 7217).
> The bufobj mutex is interlocked with the buffer locks.  Basically, each=

> time LK_INTERLOCK is used, the bo_lock is dropped.
Is this done by BUF_LOCK() in line 7233?


Is the interlocked behavior done automatically, or just because both=20
LK_INTERLOCK and BO_LOCKPTR(bo) are specified?
>
> Or do you ask about something else?
No. I think that's it.

- Alex
>=20
>>
>> - Alex
>>
>> On 13.04.21 12:25, Konstantin Belousov wrote:
>>> On Mon, Apr 12, 2021 at 11:19:05PM +0200, Alexander Lochmann wrote:
>>>> Hi folks,
>>>>
>>>> I'm was digging through our data set when I encountered a strange si=
tuation:
>>>> According to the code in trunc_dependencies() in sys/ufs/ffs/ffs_sof=
tdep.c,
>>>> the bo_lock should be held. At least that's how I read the code.
>>>> However, we see several thousands of accesses to b_vflags without th=
e
>>>> bo_lock held.
>>>> At least the own b_lock is acquired.
>>>> The access happens in line 7549: bp->b_vflags |=3D BV_SCANNED; [1]
>>>> Can you please shed some light on this situation?
>>>> Is the b_lock sufficeint, and somehow overrules the bo_lock?
>>>> Am I missing something?
>>> I think you found a valid race.  There is one more place where BV_SCA=
NNED
>>> was manipulated without owning bufobj lock.  Patch below should fix b=
oth.
>>>
>>> commit a678470b1307542c5a46b930c119b2358863e0d2
>>> Author: Konstantin Belousov <kib@FreeBSD.org>
>>> Date:   Tue Apr 13 13:22:56 2021 +0300
>>>
>>>       b_vflags update requries bufobj lock
>>>       Reported by:    Alexander Lochmann <alexander.lochmann@tu-dortm=
und.de> (trunc_dependencies())
>>>
>>> diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
>>> index 0091b5dcd3b8..23c0cf6e128b 100644
>>> --- a/sys/ufs/ffs/ffs_softdep.c
>>> +++ b/sys/ufs/ffs/ffs_softdep.c
>>> @@ -7546,7 +7546,9 @@ trunc_dependencies(ip, freeblks, lastlbn, lasto=
ff, flags)
>>>    			BO_LOCK(bo);
>>>    			goto cleanrestart;
>>>    		}
>>> +		BO_LOCK(bo);
>>>    		bp->b_vflags |=3D BV_SCANNED;
>>> +		BO_UNLOCK(bo);
>>>    		bremfree(bp);
>>>    		if (blkoff !=3D 0) {
>>>    			allocbuf(bp, blkoff);
>>> diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c
>>> index dc638595eb7b..05eb19c0ee13 100644
>>> --- a/sys/ufs/ffs/ffs_vnops.c
>>> +++ b/sys/ufs/ffs/ffs_vnops.c
>>> @@ -321,8 +321,9 @@ ffs_syncvnode(struct vnode *vp, int waitfor, int =
flags)
>>>    			if (BUF_LOCK(bp,
>>>    			    LK_EXCLUSIVE | LK_SLEEPFAIL | LK_INTERLOCK,
>>>    			    BO_LOCKPTR(bo)) !=3D 0) {
>>> +				BO_LOCK(bo);
>>>    				bp->b_vflags &=3D ~BV_SCANNED;
>>> -				goto next;
>>> +				goto next_locked;
>>>    			}
>>>    		} else
>>>    			continue;
>>> @@ -385,6 +386,7 @@ ffs_syncvnode(struct vnode *vp, int waitfor, int =
flags)
>>>    		 * to start from a known point.
>>>    		 */
>>>    		BO_LOCK(bo);
>>> +next_locked:
>>>    		nbp =3D TAILQ_FIRST(&bo->bo_dirty.bv_hd);
>>>    	}
>>>    	if (waitfor !=3D MNT_WAIT) {
>>>
>>
>> --=20
>> Technische Universit=C3=A4t Dortmund
>> Alexander Lochmann                PGP key: 0xBC3EF6FD
>> Otto-Hahn-Str. 16                 phone:  +49.231.7556141
>> D-44227 Dortmund                  fax:    +49.231.7556116
>> http://ess.cs.tu-dortmund.de/Staff/al
>>
>=20
>=20
>=20

--=20
Technische Universit=C3=A4t Dortmund
Alexander Lochmann                PGP key: 0xBC3EF6FD
Otto-Hahn-Str. 16                 phone:  +49.231.7556141
D-44227 Dortmund                  fax:    +49.231.7556116
http://ess.cs.tu-dortmund.de/Staff/al


--50Rj90fW8Fc0EkjBE07aP6mNyo9ZDIM1h--

--HFWgVQWvOw8vw2RbNT5bdXY3emhVZWJKN
Content-Type: application/pgp-signature; name="OpenPGP_signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="OpenPGP_signature"

-----BEGIN PGP SIGNATURE-----

wsF5BAABCAAjFiEElhZsUHzVP0dbkjCRWT7tBbw+9v0FAmB94tAFAwAAAAAACgkQWT7tBbw+9v0N
JQ//aeEs/I94nNXCWGFUfEMGlF18dTGS2wAhRozhAs3SargGtMkjPWOD25NwCgZdhwGksnGdcmHY
nCTTN3NVlHp801+puXx7Q4UEfWANSn1L1LlEy/XJl+5K811xxS8+qfQoBz+coMdmO1OwbRmQUppB
5hIJjRdHrG+9SIfYlXC31xkVDOMPUpXJpCpC4Nm2mdc7oW0AGDFhiUvZwAE1ZnvdGxYIopIdiTHa
kY9lmSIqukw4KNkoF2TmTuBuJNCrIM6i/aC3nJliRapwUPAvwUm54Su8pOkQoOPLBeQXgsvv/xx6
XQw1KXh7d9K1J7/BQ2+u3pTXEd9tr07HvGkR7LG+EYLZ1K9E027wBf7jJHQmgEXzaNMZNII1Bvq2
pFAgyHBQin837jAlFbSv3DLnpQKtLw7Ylg07UjQXZiKgBRFXqgiCpcMG37rFNjqzPVAYDrtLM51k
bXw9Fgf3Md76qpg0tr14f2O0ICN5yQ0uphPktuQAF4ZXZsdDSH3+Au8fR9eD9sIkhGAf+Ay0TeY7
fYB0Ossd4cDBWQX3wWReSdkGNeJxLETNnxN7TBLLpcpi8IYVgXHIbyC41Lb5wFXXgaUcu5sWxCOJ
NSLqud5WsKHoO9z26wTqhXCGnaq5CJydSgjXfA1QDGh8E/M1li7CYdsmLrKeh8RkTleFrBuK4wec
Qs0=
=CfoM
-----END PGP SIGNATURE-----

--HFWgVQWvOw8vw2RbNT5bdXY3emhVZWJKN--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6f370c67-f3ba-00ce-5da7-7ee400a4180b>