workqueue: Use the kmem_cache_free() instead of kfree() to release pwq
authorZqiang <qiang.zhang1211@gmail.com>
Wed, 11 Oct 2023 08:27:59 +0000 (16:27 +0800)
committerTejun Heo <tj@kernel.org>
Thu, 12 Oct 2023 17:34:07 +0000 (07:34 -1000)
Currently, the kfree() be used for pwq objects allocated with
kmem_cache_alloc() in alloc_and_link_pwqs(), this isn't wrong.
but usually, use "trace_kmem_cache_alloc/trace_kmem_cache_free"
to track memory allocation and free. this commit therefore use
kmem_cache_free() instead of kfree() in alloc_and_link_pwqs()
and also consistent with release of the pwq in rcu_free_pwq().

Signed-off-by: Zqiang <qiang.zhang1211@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/workqueue.c

index ebe24a5e143510b56724a7507ed69d21ac8aeda1..6f74cab2bd5af360649e0ce1925c8f5ae8d20b9a 100644 (file)
@@ -4610,8 +4610,12 @@ static int alloc_and_link_pwqs(struct workqueue_struct *wq)
 
 enomem:
        if (wq->cpu_pwq) {
-               for_each_possible_cpu(cpu)
-                       kfree(*per_cpu_ptr(wq->cpu_pwq, cpu));
+               for_each_possible_cpu(cpu) {
+                       struct pool_workqueue *pwq = *per_cpu_ptr(wq->cpu_pwq, cpu);
+
+                       if (pwq)
+                               kmem_cache_free(pwq_cache, pwq);
+               }
                free_percpu(wq->cpu_pwq);
                wq->cpu_pwq = NULL;
        }