Date: Fri, 1 Jan 2021 14:46:13 +0100 From: Michal Meloun <meloun.michal@gmail.com> To: Ryan Libby <rlibby@FreeBSD.org>, src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: Re: git: 942951ba46ec - main - uma dbg: catch more corruption with atomics Message-ID: <d89b9ec0-29bd-3a54-7927-a9b49bde394c@gmail.com> In-Reply-To: <202012312103.0BVL3dGu073808@gitrepo.freebsd.org> References: <202012312103.0BVL3dGu073808@gitrepo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 31.12.2020 22:03, Ryan Libby wrote: > The branch main has been updated by rlibby: > > URL: https://cgit.FreeBSD.org/src/commit/?id=942951ba46ecd5ebab18de006a24dc52e2d3f745 > > commit 942951ba46ecd5ebab18de006a24dc52e2d3f745 > Author: Ryan Libby <rlibby@FreeBSD.org> > AuthorDate: 2020-12-31 21:02:45 +0000 > Commit: Ryan Libby <rlibby@FreeBSD.org> > CommitDate: 2020-12-31 21:02:45 +0000 > > uma dbg: catch more corruption with atomics > > Use atomic testandset and testandclear to catch concurrent double free, > and to reduce the number of atomic operations. > > Submitted by: jeff > Reviewed by: cem, kib, markj (all previous version) > Sponsored by: Dell EMC Isilon > Differential Revision: https://reviews.freebsd.org/D22703 Unfortunately, this broke arm and arm64 kernel with random 'duplicate alloc'/'duplicate free' panics. Michal > --- > sys/vm/uma_core.c | 9 ++++----- > 1 file changed, 4 insertions(+), 5 deletions(-) > > diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c > index a0192642205d..39c846effac8 100644 > --- a/sys/vm/uma_core.c > +++ b/sys/vm/uma_core.c > @@ -5392,10 +5392,10 @@ uma_dbg_alloc(uma_zone_t zone, uma_slab_t slab, void *item) > keg = zone->uz_keg; > freei = slab_item_index(slab, keg, item); > > - if (BIT_ISSET(keg->uk_ipers, freei, slab_dbg_bits(slab, keg))) > + if (BIT_TEST_SET_ATOMIC(keg->uk_ipers, freei, > + slab_dbg_bits(slab, keg))) > panic("Duplicate alloc of %p from zone %p(%s) slab %p(%d)", > item, zone, zone->uz_name, slab, freei); > - BIT_SET_ATOMIC(keg->uk_ipers, freei, slab_dbg_bits(slab, keg)); > } > > /* > @@ -5426,11 +5426,10 @@ uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item) > panic("Unaligned free of %p from zone %p(%s) slab %p(%d)", > item, zone, zone->uz_name, slab, freei); > > - if (!BIT_ISSET(keg->uk_ipers, freei, slab_dbg_bits(slab, keg))) > + if (!BIT_TEST_CLR_ATOMIC(keg->uk_ipers, freei, > + slab_dbg_bits(slab, keg))) > panic("Duplicate free of %p from zone %p(%s) slab %p(%d)", > item, zone, zone->uz_name, slab, freei); > - > - BIT_CLR_ATOMIC(keg->uk_ipers, freei, slab_dbg_bits(slab, keg)); > } > #endif /* INVARIANTS */ > >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d89b9ec0-29bd-3a54-7927-a9b49bde394c>