Re: [PATCH 00/14] replace call_rcu by kfree_rcu for simple kmem_cache_free callback
From: Vlastimil Babka <hidden>
Date: 2024-10-08 16:36:13
Also in:
bridge, kernel-janitors, kvm, linux-block, linux-can, linux-nfs, linux-trace-kernel, lkml, netdev, netfilter-devel
On 6/9/24 10:27, Julia Lawall wrote:
Since SLOB was removed, it is not necessary to use call_rcu when the callback only performs kmem_cache_free. Use kfree_rcu() directly.
FYI, as of 6.12-rc1 - commit 6c6c47b063b5 ("mm, slab: call
kvfree_rcu_barrier() from kmem_cache_destroy()")
it should be possible to restart this effort for the remaining cases which
had to be postponed until kmem_cache_destroy() / module unload is sorted out.
Thanks,
Vlastimil
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>
@r@
expression e;
local idexpression e2;
identifier cb,f;
position p;
@@
(
call_rcu(...,e2)
|
call_rcu(&e->f,cb@p)
)
@r1@
type T;
identifier x,r.cb;
@@
cb(...) {
(
kmem_cache_free(...);
|
T x = ...;
kmem_cache_free(...,x);
|
T x;
x = ...;
kmem_cache_free(...,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;
position r.p;
@@
- call_rcu(&e->f,cb@p)
+ kfree_rcu(e,f)
@r1a depends on !s@
type T;
identifier x,r.cb;
@@
- cb(...) {
(
- kmem_cache_free(...);
|
- T x = ...;
- kmem_cache_free(...,x);
|
- T x;
- x = ...;
- kmem_cache_free(...,x);
)
- }
// </smpl>
Signed-off-by: Julia Lawall <Julia.Lawall@inria.fr>
Reviewed-by: Paul E. McKenney <paulmck@kernel.org>
Reviewed-by: Vlastimil Babka <redacted>
---
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 +--------
fs/tracefs/inode.c | 10 +---------
kernel/time/posix-timers.c | 9 +--------
kernel/workqueue.c | 8 +-------
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 +--------
18 files changed, 22 insertions(+), 143 deletions(-)