Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were done using the following Coccinelle semantic patch. This semantic patch is designed to ignore cases where the callback function is used in another way.
// <smpl> #spatch --all-includes --include-headers
@r@ expression e; local idexpression e2; identifier cb,f,g; position p; @@
( call_rcu(...,e2) | call_rcu(&e->f,cb@p) | call_rcu(&e->f.g,cb@p) )
@r1@ type T,T1; identifier x,r.cb; @@
cb(...) { ( kmem_cache_free(...); | T x = ...; kmem_cache_free(...,(T1)x); | T x; x = ...; kmem_cache_free(...,(T1)x); ) }
@s depends on r1@ position p != r.p; identifier r.cb; @@
cb@p
@script:ocaml@ cb << r.cb; p << s.p; @@
Printf.eprintf "Other use of %s at %s:%d\n" cb (List.hd p).file (List.hd p).line
@depends on r1 && !s@ expression e; identifier r.cb,f,g; position r.p; @@
( - call_rcu(&e->f,cb@p) + kfree_rcu(e,f) | - call_rcu(&e->f.g,cb@p) + kfree_rcu(e,f.g) )
@r1a depends on !s@ type T,T1; identifier x,r.cb; @@
- cb(...) { ( - kmem_cache_free(...); | - T x = ...; - kmem_cache_free(...,(T1)x); | - T x; - x = ...; - kmem_cache_free(...,(T1)x); ) - }
@r2 depends on !r1@ identifier r.cb; @@
cb(...) { ... }
@script:ocaml depends on !r1 && !r2@ cb << r.cb; @@
Printf.eprintf "need definition for %s\n" cb // </smpl>
---
arch/powerpc/kvm/book3s_mmu_hpte.c | 8 ------ block/blk-ioc.c | 9 ------ drivers/net/wireguard/allowedips.c | 9 +----- fs/ecryptfs/dentry.c | 8 ------ fs/nfsd/nfs4state.c | 9 ------ kernel/time/posix-timers.c | 9 ------ net/batman-adv/translation-table.c | 47 ++---------------------------------- net/bridge/br_fdb.c | 9 ------ net/can/gw.c | 13 ++------- net/ipv4/fib_trie.c | 8 ------ net/ipv4/inetpeer.c | 9 +----- net/ipv6/ip6_fib.c | 9 ------ net/ipv6/xfrm6_tunnel.c | 8 ------ net/kcm/kcmsock.c | 10 ------- net/netfilter/nf_conncount.c | 10 ------- net/netfilter/nf_conntrack_expect.c | 10 ------- net/netfilter/xt_hashlimit.c | 9 ------ 17 files changed, 23 insertions(+), 171 deletions(-)
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were made using Coccinelle.
Signed-off-by: Julia Lawall Julia.Lawall@inria.fr
--- net/batman-adv/translation-table.c | 47 ++----------------------------------- 1 file changed, 3 insertions(+), 44 deletions(-)
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index 2243cec18ecc..b21ff3c36b07 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c @@ -208,20 +208,6 @@ batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const u8 *addr, return tt_global_entry; }
-/** - * batadv_tt_local_entry_free_rcu() - free the tt_local_entry - * @rcu: rcu pointer of the tt_local_entry - */ -static void batadv_tt_local_entry_free_rcu(struct rcu_head *rcu) -{ - struct batadv_tt_local_entry *tt_local_entry; - - tt_local_entry = container_of(rcu, struct batadv_tt_local_entry, - common.rcu); - - kmem_cache_free(batadv_tl_cache, tt_local_entry); -} - /** * batadv_tt_local_entry_release() - release tt_local_entry from lists and queue * for free after rcu grace period @@ -236,7 +222,7 @@ static void batadv_tt_local_entry_release(struct kref *ref)
batadv_softif_vlan_put(tt_local_entry->vlan);
- call_rcu(&tt_local_entry->common.rcu, batadv_tt_local_entry_free_rcu); + kfree_rcu(tt_local_entry, common.rcu); }
/** @@ -254,20 +240,6 @@ batadv_tt_local_entry_put(struct batadv_tt_local_entry *tt_local_entry) batadv_tt_local_entry_release); }
-/** - * batadv_tt_global_entry_free_rcu() - free the tt_global_entry - * @rcu: rcu pointer of the tt_global_entry - */ -static void batadv_tt_global_entry_free_rcu(struct rcu_head *rcu) -{ - struct batadv_tt_global_entry *tt_global_entry; - - tt_global_entry = container_of(rcu, struct batadv_tt_global_entry, - common.rcu); - - kmem_cache_free(batadv_tg_cache, tt_global_entry); -} - /** * batadv_tt_global_entry_release() - release tt_global_entry from lists and * queue for free after rcu grace period @@ -282,7 +254,7 @@ void batadv_tt_global_entry_release(struct kref *ref)
batadv_tt_global_del_orig_list(tt_global_entry);
- call_rcu(&tt_global_entry->common.rcu, batadv_tt_global_entry_free_rcu); + kfree_rcu(tt_global_entry, common.rcu); }
/** @@ -407,19 +379,6 @@ static void batadv_tt_global_size_dec(struct batadv_orig_node *orig_node, batadv_tt_global_size_mod(orig_node, vid, -1); }
-/** - * batadv_tt_orig_list_entry_free_rcu() - free the orig_entry - * @rcu: rcu pointer of the orig_entry - */ -static void batadv_tt_orig_list_entry_free_rcu(struct rcu_head *rcu) -{ - struct batadv_tt_orig_list_entry *orig_entry; - - orig_entry = container_of(rcu, struct batadv_tt_orig_list_entry, rcu); - - kmem_cache_free(batadv_tt_orig_cache, orig_entry); -} - /** * batadv_tt_orig_list_entry_release() - release tt orig entry from lists and * queue for free after rcu grace period @@ -433,7 +392,7 @@ static void batadv_tt_orig_list_entry_release(struct kref *ref) refcount);
batadv_orig_node_put(orig_entry->orig_node); - call_rcu(&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu); + kfree_rcu(orig_entry, rcu); }
/**
On Sunday, 13 October 2024 22:16:53 CEST Julia Lawall wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were made using Coccinelle.
Signed-off-by: Julia Lawall Julia.Lawall@inria.fr
net/batman-adv/translation-table.c | 47 ++----------------------------------- 1 file changed, 3 insertions(+), 44 deletions(-)
This was tried and we noticed that it is not safe [1]. So, I would get confirmation that commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()") is fixing the problem which we had at that time. The commit message sounds like it but I just want to be sure.
Kind regards, Sven
[1] https://lore.kernel.org/r/20240612133357.2596-1-linus.luessing@c0d3.blue
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index 2243cec18ecc..b21ff3c36b07 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c @@ -208,20 +208,6 @@ batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const u8 *addr, return tt_global_entry; }
-/**
- batadv_tt_local_entry_free_rcu() - free the tt_local_entry
- @rcu: rcu pointer of the tt_local_entry
- */
-static void batadv_tt_local_entry_free_rcu(struct rcu_head *rcu) -{
- struct batadv_tt_local_entry *tt_local_entry;
- tt_local_entry = container_of(rcu, struct batadv_tt_local_entry,
common.rcu);
- kmem_cache_free(batadv_tl_cache, tt_local_entry);
-}
/**
- batadv_tt_local_entry_release() - release tt_local_entry from lists and queue
- for free after rcu grace period
@@ -236,7 +222,7 @@ static void batadv_tt_local_entry_release(struct kref *ref)
batadv_softif_vlan_put(tt_local_entry->vlan);
- call_rcu(&tt_local_entry->common.rcu, batadv_tt_local_entry_free_rcu);
- kfree_rcu(tt_local_entry, common.rcu);
}
/** @@ -254,20 +240,6 @@ batadv_tt_local_entry_put(struct batadv_tt_local_entry *tt_local_entry) batadv_tt_local_entry_release); }
-/**
- batadv_tt_global_entry_free_rcu() - free the tt_global_entry
- @rcu: rcu pointer of the tt_global_entry
- */
-static void batadv_tt_global_entry_free_rcu(struct rcu_head *rcu) -{
- struct batadv_tt_global_entry *tt_global_entry;
- tt_global_entry = container_of(rcu, struct batadv_tt_global_entry,
common.rcu);
- kmem_cache_free(batadv_tg_cache, tt_global_entry);
-}
/**
- batadv_tt_global_entry_release() - release tt_global_entry from lists and
- queue for free after rcu grace period
@@ -282,7 +254,7 @@ void batadv_tt_global_entry_release(struct kref *ref)
batadv_tt_global_del_orig_list(tt_global_entry);
- call_rcu(&tt_global_entry->common.rcu, batadv_tt_global_entry_free_rcu);
- kfree_rcu(tt_global_entry, common.rcu);
}
/** @@ -407,19 +379,6 @@ static void batadv_tt_global_size_dec(struct batadv_orig_node *orig_node, batadv_tt_global_size_mod(orig_node, vid, -1); }
-/**
- batadv_tt_orig_list_entry_free_rcu() - free the orig_entry
- @rcu: rcu pointer of the orig_entry
- */
-static void batadv_tt_orig_list_entry_free_rcu(struct rcu_head *rcu) -{
- struct batadv_tt_orig_list_entry *orig_entry;
- orig_entry = container_of(rcu, struct batadv_tt_orig_list_entry, rcu);
- kmem_cache_free(batadv_tt_orig_cache, orig_entry);
-}
/**
- batadv_tt_orig_list_entry_release() - release tt orig entry from lists and
- queue for free after rcu grace period
@@ -433,7 +392,7 @@ static void batadv_tt_orig_list_entry_release(struct kref *ref) refcount);
batadv_orig_node_put(orig_entry->orig_node);
- call_rcu(&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu);
- kfree_rcu(orig_entry, rcu);
}
/**
On Mon, 14 Oct 2024, Sven Eckelmann wrote:
On Sunday, 13 October 2024 22:16:53 CEST Julia Lawall wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were made using Coccinelle.
Signed-off-by: Julia Lawall Julia.Lawall@inria.fr
net/batman-adv/translation-table.c | 47 ++----------------------------------- 1 file changed, 3 insertions(+), 44 deletions(-)
This was tried and we noticed that it is not safe [1]. So, I would get confirmation that commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()") is fixing the problem which we had at that time. The commit message sounds like it but I just want to be sure.
Thanks for the feedback. I think that Vlastimil Babka can help with that.
julia
Kind regards, Sven
[1] https://lore.kernel.org/r/20240612133357.2596-1-linus.luessing@c0d3.blue
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index 2243cec18ecc..b21ff3c36b07 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c @@ -208,20 +208,6 @@ batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const u8 *addr, return tt_global_entry; }
-/**
- batadv_tt_local_entry_free_rcu() - free the tt_local_entry
- @rcu: rcu pointer of the tt_local_entry
- */
-static void batadv_tt_local_entry_free_rcu(struct rcu_head *rcu) -{
- struct batadv_tt_local_entry *tt_local_entry;
- tt_local_entry = container_of(rcu, struct batadv_tt_local_entry,
common.rcu);
- kmem_cache_free(batadv_tl_cache, tt_local_entry);
-}
/**
- batadv_tt_local_entry_release() - release tt_local_entry from lists and queue
- for free after rcu grace period
@@ -236,7 +222,7 @@ static void batadv_tt_local_entry_release(struct kref *ref)
batadv_softif_vlan_put(tt_local_entry->vlan);
- call_rcu(&tt_local_entry->common.rcu, batadv_tt_local_entry_free_rcu);
- kfree_rcu(tt_local_entry, common.rcu);
}
/** @@ -254,20 +240,6 @@ batadv_tt_local_entry_put(struct batadv_tt_local_entry *tt_local_entry) batadv_tt_local_entry_release); }
-/**
- batadv_tt_global_entry_free_rcu() - free the tt_global_entry
- @rcu: rcu pointer of the tt_global_entry
- */
-static void batadv_tt_global_entry_free_rcu(struct rcu_head *rcu) -{
- struct batadv_tt_global_entry *tt_global_entry;
- tt_global_entry = container_of(rcu, struct batadv_tt_global_entry,
common.rcu);
- kmem_cache_free(batadv_tg_cache, tt_global_entry);
-}
/**
- batadv_tt_global_entry_release() - release tt_global_entry from lists and
- queue for free after rcu grace period
@@ -282,7 +254,7 @@ void batadv_tt_global_entry_release(struct kref *ref)
batadv_tt_global_del_orig_list(tt_global_entry);
- call_rcu(&tt_global_entry->common.rcu, batadv_tt_global_entry_free_rcu);
- kfree_rcu(tt_global_entry, common.rcu);
}
/** @@ -407,19 +379,6 @@ static void batadv_tt_global_size_dec(struct batadv_orig_node *orig_node, batadv_tt_global_size_mod(orig_node, vid, -1); }
-/**
- batadv_tt_orig_list_entry_free_rcu() - free the orig_entry
- @rcu: rcu pointer of the orig_entry
- */
-static void batadv_tt_orig_list_entry_free_rcu(struct rcu_head *rcu) -{
- struct batadv_tt_orig_list_entry *orig_entry;
- orig_entry = container_of(rcu, struct batadv_tt_orig_list_entry, rcu);
- kmem_cache_free(batadv_tt_orig_cache, orig_entry);
-}
/**
- batadv_tt_orig_list_entry_release() - release tt orig entry from lists and
- queue for free after rcu grace period
@@ -433,7 +392,7 @@ static void batadv_tt_orig_list_entry_release(struct kref *ref) refcount);
batadv_orig_node_put(orig_entry->orig_node);
- call_rcu(&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu);
- kfree_rcu(orig_entry, rcu);
}
/**
On 10/14/24 09:08, Julia Lawall wrote:
On Mon, 14 Oct 2024, Sven Eckelmann wrote:
On Sunday, 13 October 2024 22:16:53 CEST Julia Lawall wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were made using Coccinelle.
Signed-off-by: Julia Lawall Julia.Lawall@inria.fr
net/batman-adv/translation-table.c | 47 ++----------------------------------- 1 file changed, 3 insertions(+), 44 deletions(-)
This was tried and we noticed that it is not safe [1]. So, I would get confirmation that commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()") is fixing the problem which we had at that time. The commit message sounds like it but I just want to be sure.
Thanks for the feedback. I think that Vlastimil Babka can help with that.
Hi, yeah the batman-adv issue was how we learned about the problem and the series of commits leading to and including 6c6c47b063b5 was done exactly to address the kmem_cache_destroy() on module unload issue, and unblock the conversion to kfree_rcu().
Thanks, Vlastimil
julia
On Sun, 13 Oct 2024 22:16:53 +0200, Julia Lawall wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were made using Coccinelle.
[...]
Applied, thanks!
[06/17] batman-adv: replace call_rcu by kfree_rcu for simple kmem_cache_free callback commit: 356c81b6c494a359ed6e25087931acc78c518fb9
Best regards,
On Sun, 13 Oct 2024 22:16:47 +0200, Julia Lawall wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were done using the following Coccinelle semantic patch. This semantic patch is designed to ignore cases where the callback function is used in another way.
[...]
Applied, thanks!
[09/17] block: replace call_rcu by kfree_rcu for simple kmem_cache_free callback commit: 7a9b197adbafa9d6d1a79a0633607b78b1adef82
Best regards,
On Sun, Oct 13, 2024 at 10:16:47PM +0200, Julia Lawall wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were done using the following Coccinelle semantic patch. This semantic patch is designed to ignore cases where the callback function is used in another way.
For the series:
Acked-by: Paul E. McKenney paulmck@kernel.org
// <smpl> #spatch --all-includes --include-headers
@r@ expression e; local idexpression e2; identifier cb,f,g; position p; @@
( call_rcu(...,e2) | call_rcu(&e->f,cb@p) | call_rcu(&e->f.g,cb@p) )
@r1@ type T,T1; identifier x,r.cb; @@
cb(...) { ( kmem_cache_free(...); | T x = ...; kmem_cache_free(...,(T1)x); | T x; x = ...; kmem_cache_free(...,(T1)x); ) }
@s depends on r1@ position p != r.p; identifier r.cb; @@
cb@p
@script:ocaml@ cb << r.cb; p << s.p; @@
Printf.eprintf "Other use of %s at %s:%d\n" cb (List.hd p).file (List.hd p).line
@depends on r1 && !s@ expression e; identifier r.cb,f,g; position r.p; @@
(
- call_rcu(&e->f,cb@p)
- kfree_rcu(e,f)
|
- call_rcu(&e->f.g,cb@p)
- kfree_rcu(e,f.g)
)
@r1a depends on !s@ type T,T1; identifier x,r.cb; @@
- cb(...) {
(
- kmem_cache_free(...);
|
- T x = ...;
- kmem_cache_free(...,(T1)x);
|
- T x;
- x = ...;
- kmem_cache_free(...,(T1)x);
)
- }
@r2 depends on !r1@ identifier r.cb; @@
cb(...) { ... }
@script:ocaml depends on !r1 && !r2@ cb << r.cb; @@
Printf.eprintf "need definition for %s\n" cb // </smpl>
arch/powerpc/kvm/book3s_mmu_hpte.c | 8 ------ block/blk-ioc.c | 9 ------ drivers/net/wireguard/allowedips.c | 9 +----- fs/ecryptfs/dentry.c | 8 ------ fs/nfsd/nfs4state.c | 9 ------ kernel/time/posix-timers.c | 9 ------ net/batman-adv/translation-table.c | 47 ++---------------------------------- net/bridge/br_fdb.c | 9 ------ net/can/gw.c | 13 ++------- net/ipv4/fib_trie.c | 8 ------ net/ipv4/inetpeer.c | 9 +----- net/ipv6/ip6_fib.c | 9 ------ net/ipv6/xfrm6_tunnel.c | 8 ------ net/kcm/kcmsock.c | 10 ------- net/netfilter/nf_conncount.c | 10 ------- net/netfilter/nf_conntrack_expect.c | 10 ------- net/netfilter/xt_hashlimit.c | 9 ------ 17 files changed, 23 insertions(+), 171 deletions(-)
On 10/13/24 22:16, Julia Lawall wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were done using the following Coccinelle semantic patch. This semantic patch is designed to ignore cases where the callback function is used in another way.
Thanks, LGTM!
For the series:
Acked-by: Vlastimil Babka vbabka@suse.cz
On Sun, Oct 13, 2024 at 10:16:47PM +0200, Julia Lawall wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
Applied and squashed into single patch for netfilter these patches:
[17/17] netfilter: xt_hashlimit: replace call_rcu by kfree_rcu for simple kmem_cache_free callback [16/17] netfilter: expect: replace call_rcu by kfree_rcu for simple kmem_cache_free callback [15/17] netfilter: nf_conncount: replace call_rcu by kfree_rcu for simple kmem_cache_free callback
this update is now flying to net-next.
Thanks
Hello:
This series was applied to netdev/net-next.git (main) by Simon Wunderlich sw@simonwunderlich.de:
On Sun, 13 Oct 2024 22:16:47 +0200 you wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were done using the following Coccinelle semantic patch. This semantic patch is designed to ignore cases where the callback function is used in another way.
[...]
Here is the summary with links: - [01/17] wireguard: allowedips: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [02/17] ipv4: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [03/17] inetpeer: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [04/17] ipv6: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [05/17] xfrm6_tunnel: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [06/17] batman-adv: replace call_rcu by kfree_rcu for simple kmem_cache_free callback https://git.kernel.org/netdev/net-next/c/356c81b6c494 - [08/17] net: bridge: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [10/17] can: gw: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [14/17] kcm: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [15/17] netfilter: nf_conncount: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [16/17] netfilter: expect: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [17/17] netfilter: xt_hashlimit: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit)
You are awesome, thank you!
Hello:
This series was applied to netdev/net-next.git (main) by Jakub Kicinski kuba@kernel.org:
On Sun, 13 Oct 2024 22:16:47 +0200 you wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were done using the following Coccinelle semantic patch. This semantic patch is designed to ignore cases where the callback function is used in another way.
[...]
Here is the summary with links: - [01/17] wireguard: allowedips: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [02/17] ipv4: replace call_rcu by kfree_rcu for simple kmem_cache_free callback https://git.kernel.org/netdev/net-next/c/497e17d80759 - [03/17] inetpeer: replace call_rcu by kfree_rcu for simple kmem_cache_free callback https://git.kernel.org/netdev/net-next/c/bb5810d4236b - [04/17] ipv6: replace call_rcu by kfree_rcu for simple kmem_cache_free callback https://git.kernel.org/netdev/net-next/c/85e48bcf294c - [05/17] xfrm6_tunnel: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [06/17] batman-adv: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [08/17] net: bridge: replace call_rcu by kfree_rcu for simple kmem_cache_free callback https://git.kernel.org/netdev/net-next/c/4ac64e570c33 - [10/17] can: gw: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [14/17] kcm: replace call_rcu by kfree_rcu for simple kmem_cache_free callback https://git.kernel.org/netdev/net-next/c/7bb3ecbc2b6b - [15/17] netfilter: nf_conncount: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [16/17] netfilter: expect: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit) - [17/17] netfilter: xt_hashlimit: replace call_rcu by kfree_rcu for simple kmem_cache_free callback (no matching commit)
You are awesome, thank you!
On Sun, 13 Oct 2024 22:16:47 +0200, Julia Lawall wrote:
Since SLOB was removed and since commit 6c6c47b063b5 ("mm, slab: call kvfree_rcu_barrier() from kmem_cache_destroy()"), it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
The changes were done using the following Coccinelle semantic patch. This semantic patch is designed to ignore cases where the callback function is used in another way.
[...]
Applied to powerpc/topic/ppc-kvm.
[13/17] KVM: PPC: replace call_rcu by kfree_rcu for simple kmem_cache_free callback https://git.kernel.org/powerpc/c/1db6a4e8a3fc8ccaa4690272935e02831dc6d40d
cheers
b.a.t.m.a.n@lists.open-mesh.org