Skip to content

Commit 37c2277

Browse files
JuliaLawallhtejun
authored andcommitted
workqueue: replace call_rcu by kfree_rcu for simple kmem_cache_free callback
Since SLOB was removed, 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> @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 <[email protected]> Reviewed-by: Paul E. McKenney <[email protected]> Reviewed-by: Vlastimil Babka <[email protected]> Signed-off-by: Tejun Heo <[email protected]>
1 parent 7ccc215 commit 37c2277

File tree

1 file changed

+1
-7
lines changed

1 file changed

+1
-7
lines changed

kernel/workqueue.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5022,12 +5022,6 @@ static struct worker_pool *get_unbound_pool(const struct workqueue_attrs *attrs)
50225022
return NULL;
50235023
}
50245024

5025-
static void rcu_free_pwq(struct rcu_head *rcu)
5026-
{
5027-
kmem_cache_free(pwq_cache,
5028-
container_of(rcu, struct pool_workqueue, rcu));
5029-
}
5030-
50315025
/*
50325026
* Scheduled on pwq_release_worker by put_pwq() when an unbound pwq hits zero
50335027
* refcnt and needs to be destroyed.
@@ -5073,7 +5067,7 @@ static void pwq_release_workfn(struct kthread_work *work)
50735067
raw_spin_unlock_irq(&nna->lock);
50745068
}
50755069

5076-
call_rcu(&pwq->rcu, rcu_free_pwq);
5070+
kfree_rcu(pwq, rcu);
50775071

50785072
/*
50795073
* If we're the last pwq going away, @wq is already dead and no one

0 commit comments

Comments
 (0)