From: Uladzislau Rezki <urezki@gmail.com>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: Uladzislau Rezki <urezki@gmail.com>,
"Paul E. McKenney" <paulmck@kernel.org>,
"Jason A. Donenfeld" <Jason@zx2c4.com>,
Jakub Kicinski <kuba@kernel.org>,
Julia Lawall <Julia.Lawall@inria.fr>,
linux-block@vger.kernel.org, kernel-janitors@vger.kernel.org,
bridge@lists.linux.dev, linux-trace-kernel@vger.kernel.org,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
kvm@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
"Naveen N. Rao" <naveen.n.rao@linux.ibm.com>,
Christophe Leroy <christophe.leroy@csgroup.eu>,
Nicholas Piggin <npiggin@gmail.com>,
netdev@vger.kernel.org, wireguard@lists.zx2c4.com,
linux-kernel@vger.kernel.org, ecryptfs@vger.kernel.org,
Neil Brown <neilb@suse.de>, Olga Kornievskaia <kolga@netapp.com>,
Dai Ngo <Dai.Ngo@oracle.com>, Tom Talpey <tom@talpey.com>,
linux-nfs@vger.kernel.org, linux-can@vger.kernel.org,
Lai Jiangshan <jiangshanlai@gmail.com>,
netfilter-devel@vger.kernel.org, coreteam@netfilter.org,
kasan-dev <kasan-dev@googlegroups.com>
Subject: Re: [PATCH 00/14] replace call_rcu by kfree_rcu for simple kmem_cache_free callback
Date: Wed, 19 Jun 2024 13:22:12 +0200 [thread overview]
Message-ID: <ZnK_ZLlFM6MrdEah@pc636> (raw)
In-Reply-To: <c208e95d-9aa9-476f-9dee-0242a2d6a24f@suse.cz>
On Wed, Jun 19, 2024 at 11:56:44AM +0200, Vlastimil Babka wrote:
> On 6/19/24 11:51 AM, Uladzislau Rezki wrote:
> > On Tue, Jun 18, 2024 at 09:48:49AM -0700, Paul E. McKenney wrote:
> >> On Tue, Jun 18, 2024 at 11:31:00AM +0200, Uladzislau Rezki wrote:
> >> > > On 6/17/24 8:42 PM, Uladzislau Rezki wrote:
> >> > > >> +
> >> > > >> + s = container_of(work, struct kmem_cache, async_destroy_work);
> >> > > >> +
> >> > > >> + // XXX use the real kmem_cache_free_barrier() or similar thing here
> >> > > > It implies that we need to introduce kfree_rcu_barrier(), a new API, which i
> >> > > > wanted to avoid initially.
> >> > >
> >> > > I wanted to avoid new API or flags for kfree_rcu() users and this would
> >> > > be achieved. The barrier is used internally so I don't consider that an
> >> > > API to avoid. How difficult is the implementation is another question,
> >> > > depending on how the current batching works. Once (if) we have sheaves
> >> > > proven to work and move kfree_rcu() fully into SLUB, the barrier might
> >> > > also look different and hopefully easier. So maybe it's not worth to
> >> > > invest too much into that barrier and just go for the potentially
> >> > > longer, but easier to implement?
> >> > >
> >> > Right. I agree here. If the cache is not empty, OK, we just defer the
> >> > work, even we can use a big 21 seconds delay, after that we just "warn"
> >> > if it is still not empty and leave it as it is, i.e. emit a warning and
> >> > we are done.
> >> >
> >> > Destroying the cache is not something that must happen right away.
> >>
> >> OK, I have to ask...
> >>
> >> Suppose that the cache is created and destroyed by a module and
> >> init/cleanup time, respectively. Suppose that this module is rmmod'ed
> >> then very quickly insmod'ed.
> >>
> >> Do we need to fail the insmod if the kmem_cache has not yet been fully
> >> cleaned up? If not, do we have two versions of the same kmem_cache in
> >> /proc during the overlap time?
> >>
> > No fail :) If same cache is created several times, its s->refcount gets
> > increased, so, it does not create two entries in the "slabinfo". But i
> > agree that your point is good! We need to be carefully with removing and
> > simultaneous creating.
>
> Note that this merging may be disabled or not happen due to various flags on
> the cache being incompatible with it. And I want to actually make sure it
> never happens for caches being already destroyed as that would lead to
> use-after-free (the workfn doesn't recheck the refcount in case a merge
> would happen during the grace period)
>
> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -150,9 +150,10 @@ int slab_unmergeable(struct kmem_cache *s)
> #endif
>
> /*
> - * We may have set a slab to be unmergeable during bootstrap.
> + * We may have set a cache to be unmergeable during bootstrap.
> + * 0 is for cache being destroyed asynchronously
> */
> - if (s->refcount < 0)
> + if (s->refcount <= 0)
> return 1;
>
> return 0;
>
OK, i see such flags, SLAB_NO_MERGE. Then i was wrong, it can create two
different slabs.
Thanks!
--
Uladzislau Rezki
WARNING: multiple messages have this Message-ID (diff)
From: Uladzislau Rezki <urezki@gmail.com>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: "Jason A. Donenfeld" <Jason@zx2c4.com>,
kvm@vger.kernel.org, Neil Brown <neilb@suse.de>,
kernel-janitors@vger.kernel.org,
Olga Kornievskaia <kolga@netapp.com>,
kasan-dev <kasan-dev@googlegroups.com>,
Dai Ngo <Dai.Ngo@oracle.com>,
Christophe Leroy <christophe.leroy@csgroup.eu>,
coreteam@netfilter.org,
"Naveen N. Rao" <naveen.n.rao@linux.ibm.com>,
Jakub Kicinski <kuba@kernel.org>,
linux-trace-kernel@vger.kernel.org,
"Paul E. McKenney" <paulmck@kernel.org>,
bridge@lists.linux.dev, ecryptfs@vger.kernel.org,
Nicholas Piggin <npiggin@gmail.com>,
linux-can@vger.kernel.org, linux-block@vger.kernel.org,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Tom Talpey <tom@talpey.com>,
linux-nfs@vger.kernel.org, netdev@vger.kernel.org,
Lai Jiangshan <jiangshanlai@gmail.com>,
linux-kernel@vger.kernel.org,
Julia Lawall <Julia.Lawall@inria.fr>,
Uladzislau Rezki <urezki@gmail.com>,
netfilter-devel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
wireguard@lists.zx2c4.com
Subject: Re: [PATCH 00/14] replace call_rcu by kfree_rcu for simple kmem_cache_free callback
Date: Wed, 19 Jun 2024 13:22:12 +0200 [thread overview]
Message-ID: <ZnK_ZLlFM6MrdEah@pc636> (raw)
In-Reply-To: <c208e95d-9aa9-476f-9dee-0242a2d6a24f@suse.cz>
On Wed, Jun 19, 2024 at 11:56:44AM +0200, Vlastimil Babka wrote:
> On 6/19/24 11:51 AM, Uladzislau Rezki wrote:
> > On Tue, Jun 18, 2024 at 09:48:49AM -0700, Paul E. McKenney wrote:
> >> On Tue, Jun 18, 2024 at 11:31:00AM +0200, Uladzislau Rezki wrote:
> >> > > On 6/17/24 8:42 PM, Uladzislau Rezki wrote:
> >> > > >> +
> >> > > >> + s = container_of(work, struct kmem_cache, async_destroy_work);
> >> > > >> +
> >> > > >> + // XXX use the real kmem_cache_free_barrier() or similar thing here
> >> > > > It implies that we need to introduce kfree_rcu_barrier(), a new API, which i
> >> > > > wanted to avoid initially.
> >> > >
> >> > > I wanted to avoid new API or flags for kfree_rcu() users and this would
> >> > > be achieved. The barrier is used internally so I don't consider that an
> >> > > API to avoid. How difficult is the implementation is another question,
> >> > > depending on how the current batching works. Once (if) we have sheaves
> >> > > proven to work and move kfree_rcu() fully into SLUB, the barrier might
> >> > > also look different and hopefully easier. So maybe it's not worth to
> >> > > invest too much into that barrier and just go for the potentially
> >> > > longer, but easier to implement?
> >> > >
> >> > Right. I agree here. If the cache is not empty, OK, we just defer the
> >> > work, even we can use a big 21 seconds delay, after that we just "warn"
> >> > if it is still not empty and leave it as it is, i.e. emit a warning and
> >> > we are done.
> >> >
> >> > Destroying the cache is not something that must happen right away.
> >>
> >> OK, I have to ask...
> >>
> >> Suppose that the cache is created and destroyed by a module and
> >> init/cleanup time, respectively. Suppose that this module is rmmod'ed
> >> then very quickly insmod'ed.
> >>
> >> Do we need to fail the insmod if the kmem_cache has not yet been fully
> >> cleaned up? If not, do we have two versions of the same kmem_cache in
> >> /proc during the overlap time?
> >>
> > No fail :) If same cache is created several times, its s->refcount gets
> > increased, so, it does not create two entries in the "slabinfo". But i
> > agree that your point is good! We need to be carefully with removing and
> > simultaneous creating.
>
> Note that this merging may be disabled or not happen due to various flags on
> the cache being incompatible with it. And I want to actually make sure it
> never happens for caches being already destroyed as that would lead to
> use-after-free (the workfn doesn't recheck the refcount in case a merge
> would happen during the grace period)
>
> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -150,9 +150,10 @@ int slab_unmergeable(struct kmem_cache *s)
> #endif
>
> /*
> - * We may have set a slab to be unmergeable during bootstrap.
> + * We may have set a cache to be unmergeable during bootstrap.
> + * 0 is for cache being destroyed asynchronously
> */
> - if (s->refcount < 0)
> + if (s->refcount <= 0)
> return 1;
>
> return 0;
>
OK, i see such flags, SLAB_NO_MERGE. Then i was wrong, it can create two
different slabs.
Thanks!
--
Uladzislau Rezki
next prev parent reply other threads:[~2024-06-19 11:22 UTC|newest]
Thread overview: 158+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-09 8:27 [PATCH 00/14] replace call_rcu by kfree_rcu for simple kmem_cache_free callback Julia Lawall
2024-06-09 8:27 ` Julia Lawall
2024-06-09 8:27 ` [PATCH 01/14] wireguard: allowedips: " Julia Lawall
2024-06-09 14:32 ` Jason A. Donenfeld
2024-06-09 14:36 ` Julia Lawall
2024-06-10 20:38 ` Vlastimil Babka
2024-06-10 20:59 ` Jason A. Donenfeld
2024-06-09 8:27 ` [PATCH 02/14] net: " Julia Lawall
2024-06-09 8:27 ` [PATCH 03/14] KVM: PPC: " Julia Lawall
2024-06-09 8:27 ` Julia Lawall
2024-06-09 8:27 ` [PATCH 04/14] xfrm6_tunnel: " Julia Lawall
2024-06-09 8:27 ` [PATCH 05/14] tracefs: " Julia Lawall
2024-06-10 15:22 ` Steven Rostedt
2024-06-10 15:46 ` Paul E. McKenney
2024-06-10 20:36 ` Steven Rostedt
2024-06-10 21:40 ` Vlastimil Babka
2024-06-11 6:23 ` Greg KH
2024-06-11 8:42 ` Vlastimil Babka
2024-06-11 9:05 ` Thorsten Leemhuis
2024-06-11 14:14 ` Steven Rostedt
2024-06-12 14:09 ` Jason A. Donenfeld
2024-06-12 16:04 ` Steven Rostedt
2024-06-11 14:12 ` Steven Rostedt
2024-06-10 20:42 ` Vlastimil Babka
2024-06-10 21:18 ` Steven Rostedt
2024-06-09 8:27 ` [PATCH 06/14] eCryptfs: " Julia Lawall
2024-06-09 8:27 ` [PATCH 07/14] net: bridge: " Julia Lawall
2024-06-09 9:04 ` Nikolay Aleksandrov
2024-06-09 8:27 ` [PATCH 08/14] nfsd: " Julia Lawall
2024-06-09 10:53 ` Jeff Layton
2024-06-09 15:43 ` Chuck Lever
2024-06-09 8:27 ` [PATCH 09/14] block: " Julia Lawall
2024-06-09 8:27 ` [PATCH 10/14] can: gw: " Julia Lawall
2024-06-10 12:46 ` Oliver Hartkopp
2024-06-09 8:27 ` [PATCH 11/14] posix-timers: " Julia Lawall
2024-06-09 8:27 ` [PATCH 12/14] workqueue: " Julia Lawall
2024-06-10 20:31 ` Tejun Heo
2024-06-09 8:27 ` [PATCH 13/14] kcm: " Julia Lawall
2024-06-09 8:27 ` [PATCH 14/14] netfilter: " Julia Lawall
2024-06-12 21:33 ` [PATCH 00/14] " Jakub Kicinski
2024-06-12 21:33 ` Jakub Kicinski
2024-06-12 22:37 ` Paul E. McKenney
2024-06-12 22:37 ` Paul E. McKenney
2024-06-12 22:46 ` Jakub Kicinski
2024-06-12 22:46 ` Jakub Kicinski
2024-06-12 22:52 ` Jens Axboe
2024-06-12 22:52 ` Jens Axboe
2024-06-12 23:04 ` Paul E. McKenney
2024-06-12 23:04 ` Paul E. McKenney
2024-06-12 23:31 ` Jason A. Donenfeld
2024-06-12 23:31 ` Jason A. Donenfeld
2024-06-13 0:31 ` Jason A. Donenfeld
2024-06-13 0:31 ` Jason A. Donenfeld
2024-06-13 3:38 ` Paul E. McKenney
2024-06-13 3:38 ` Paul E. McKenney
2024-06-13 12:22 ` Jason A. Donenfeld
2024-06-13 12:22 ` Jason A. Donenfeld
2024-06-13 12:46 ` Paul E. McKenney
2024-06-13 12:46 ` Paul E. McKenney
2024-06-13 14:11 ` Jason A. Donenfeld
2024-06-13 14:11 ` Jason A. Donenfeld
2024-06-13 15:12 ` Paul E. McKenney
2024-06-13 15:12 ` Paul E. McKenney
2024-06-17 15:10 ` Vlastimil Babka
2024-06-17 15:10 ` Vlastimil Babka
2024-06-17 16:12 ` Paul E. McKenney
2024-06-17 16:12 ` Paul E. McKenney
2024-06-17 17:23 ` Vlastimil Babka
2024-06-17 17:23 ` Vlastimil Babka
2024-06-17 18:42 ` Uladzislau Rezki
2024-06-17 18:42 ` Uladzislau Rezki
2024-06-17 21:08 ` Vlastimil Babka
2024-06-17 21:08 ` Vlastimil Babka
2024-06-18 9:31 ` Uladzislau Rezki
2024-06-18 9:31 ` Uladzislau Rezki
2024-06-18 16:48 ` Paul E. McKenney
2024-06-18 16:48 ` Paul E. McKenney
2024-06-18 17:21 ` Vlastimil Babka
2024-06-18 17:21 ` Vlastimil Babka
2024-06-18 17:53 ` Paul E. McKenney
2024-06-18 17:53 ` Paul E. McKenney
2024-06-19 9:28 ` Vlastimil Babka
2024-06-19 9:28 ` Vlastimil Babka
2024-06-19 16:46 ` Paul E. McKenney
2024-06-19 16:46 ` Paul E. McKenney
2024-06-21 9:32 ` Uladzislau Rezki
2024-06-21 9:32 ` Uladzislau Rezki
2024-07-15 20:39 ` Vlastimil Babka
2024-07-15 20:39 ` Vlastimil Babka
2024-07-24 13:53 ` Paul E. McKenney
2024-07-24 13:53 ` Paul E. McKenney
2024-07-24 14:40 ` Vlastimil Babka
2024-07-24 14:40 ` Vlastimil Babka
2024-10-08 16:41 ` Vlastimil Babka
2024-10-08 20:02 ` Paul E. McKenney
2024-10-09 17:08 ` Julia Lawall
2024-10-09 21:02 ` Paul E. McKenney
2024-06-19 9:51 ` Uladzislau Rezki
2024-06-19 9:51 ` Uladzislau Rezki
2024-06-19 9:56 ` Vlastimil Babka
2024-06-19 9:56 ` Vlastimil Babka
2024-06-19 11:22 ` Uladzislau Rezki [this message]
2024-06-19 11:22 ` Uladzislau Rezki
2024-06-17 18:54 ` Paul E. McKenney
2024-06-17 18:54 ` Paul E. McKenney
2024-06-17 21:34 ` Vlastimil Babka
2024-06-17 21:34 ` Vlastimil Babka
2024-06-13 14:17 ` Jakub Kicinski
2024-06-13 14:17 ` Jakub Kicinski
2024-06-13 14:53 ` Paul E. McKenney
2024-06-13 14:53 ` Paul E. McKenney
2024-06-13 11:58 ` Jason A. Donenfeld
2024-06-13 11:58 ` Jason A. Donenfeld
2024-06-13 12:47 ` Paul E. McKenney
2024-06-13 12:47 ` Paul E. McKenney
2024-06-13 13:06 ` Uladzislau Rezki
2024-06-13 13:06 ` Uladzislau Rezki
2024-06-13 15:06 ` Paul E. McKenney
2024-06-13 15:06 ` Paul E. McKenney
2024-06-13 17:38 ` Uladzislau Rezki
2024-06-13 17:38 ` Uladzislau Rezki
2024-06-13 17:45 ` Paul E. McKenney
2024-06-13 17:45 ` Paul E. McKenney
2024-06-13 17:58 ` Uladzislau Rezki
2024-06-13 17:58 ` Uladzislau Rezki
2024-06-13 18:13 ` Paul E. McKenney
2024-06-13 18:13 ` Paul E. McKenney
2024-06-14 12:35 ` Uladzislau Rezki
2024-06-14 12:35 ` Uladzislau Rezki
2024-06-14 14:17 ` Paul E. McKenney
2024-06-14 14:17 ` Paul E. McKenney
2024-06-14 14:50 ` Uladzislau Rezki
2024-06-14 14:50 ` Uladzislau Rezki
2024-06-14 19:33 ` Jason A. Donenfeld
2024-06-14 19:33 ` Jason A. Donenfeld
2024-06-17 13:50 ` Uladzislau Rezki
2024-06-17 13:50 ` Uladzislau Rezki
2024-06-17 14:56 ` Jason A. Donenfeld
2024-06-17 14:56 ` Jason A. Donenfeld
2024-06-17 16:30 ` Uladzislau Rezki
2024-06-17 16:30 ` Uladzislau Rezki
2024-06-17 16:33 ` Jason A. Donenfeld
2024-06-17 16:33 ` Jason A. Donenfeld
2024-06-17 16:38 ` Vlastimil Babka
2024-06-17 16:38 ` Vlastimil Babka
2024-06-17 17:04 ` Jason A. Donenfeld
2024-06-17 17:04 ` Jason A. Donenfeld
2024-06-17 21:19 ` Vlastimil Babka
2024-06-17 21:19 ` Vlastimil Babka
2024-06-17 16:42 ` Uladzislau Rezki
2024-06-17 16:42 ` Uladzislau Rezki
2024-06-17 16:57 ` Jason A. Donenfeld
2024-06-17 16:57 ` Jason A. Donenfeld
2024-06-17 17:19 ` Uladzislau Rezki
2024-06-17 17:19 ` Uladzislau Rezki
2024-06-17 14:37 ` Vlastimil Babka
2024-06-17 14:37 ` Vlastimil Babka
2024-10-08 16:36 ` Vlastimil Babka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZnK_ZLlFM6MrdEah@pc636 \
--to=urezki@gmail.com \
--cc=Dai.Ngo@oracle.com \
--cc=Jason@zx2c4.com \
--cc=Julia.Lawall@inria.fr \
--cc=bridge@lists.linux.dev \
--cc=christophe.leroy@csgroup.eu \
--cc=coreteam@netfilter.org \
--cc=ecryptfs@vger.kernel.org \
--cc=jiangshanlai@gmail.com \
--cc=kasan-dev@googlegroups.com \
--cc=kernel-janitors@vger.kernel.org \
--cc=kolga@netapp.com \
--cc=kuba@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-can@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=naveen.n.rao@linux.ibm.com \
--cc=neilb@suse.de \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=npiggin@gmail.com \
--cc=paulmck@kernel.org \
--cc=tom@talpey.com \
--cc=vbabka@suse.cz \
--cc=wireguard@lists.zx2c4.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.