padata: Disable BH when taking works lock on MT path
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 3 Apr 2024 09:36:18 +0000 (17:36 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 12 Apr 2024 07:07:51 +0000 (15:07 +0800)
As the old padata code can execute in softirq context, disable
softirqs for the new padata_do_mutithreaded code too as otherwise
lockdep will get antsy.

Reported-by: syzbot+0cb5bb0f4bf9e79db3b3@syzkaller.appspotmail.com
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Acked-by: Daniel Jordan <daniel.m.jordan@oracle.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
kernel/padata.c

index e3f639ff16707a98e5c5a98d23432cd3cc28f684..53f4bc9127127c287bad71da7d870cbb42c51d6a 100644 (file)
@@ -106,7 +106,7 @@ static int __init padata_work_alloc_mt(int nworks, void *data,
 {
        int i;
 
-       spin_lock(&padata_works_lock);
+       spin_lock_bh(&padata_works_lock);
        /* Start at 1 because the current task participates in the job. */
        for (i = 1; i < nworks; ++i) {
                struct padata_work *pw = padata_work_alloc();
@@ -116,7 +116,7 @@ static int __init padata_work_alloc_mt(int nworks, void *data,
                padata_work_init(pw, padata_mt_helper, data, 0);
                list_add(&pw->pw_list, head);
        }
-       spin_unlock(&padata_works_lock);
+       spin_unlock_bh(&padata_works_lock);
 
        return i;
 }
@@ -134,12 +134,12 @@ static void __init padata_works_free(struct list_head *works)
        if (list_empty(works))
                return;
 
-       spin_lock(&padata_works_lock);
+       spin_lock_bh(&padata_works_lock);
        list_for_each_entry_safe(cur, next, works, pw_list) {
                list_del(&cur->pw_list);
                padata_work_free(cur);
        }
-       spin_unlock(&padata_works_lock);
+       spin_unlock_bh(&padata_works_lock);
 }
 
 static void padata_parallel_worker(struct work_struct *parallel_work)