dm verity: have verify_wq use WQ_HIGHPRI if "try_verify_in_tasklet"
authorMike Snitzer <snitzer@kernel.org>
Thu, 4 Aug 2022 19:55:57 +0000 (15:55 -0400)
committerMike Snitzer <snitzer@kernel.org>
Thu, 4 Aug 2022 19:59:52 +0000 (15:59 -0400)
Allow verify_wq to preempt softirq since verification in tasklet will
fall-back to using it for error handling (or if the bufio cache
doesn't have required hashes).

Suggested-by: Nathan Huckleberry <nhuck@google.com>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
drivers/md/dm-verity-target.c

index 9b87db8..981821f 100644 (file)
@@ -1151,6 +1151,7 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
        struct dm_verity_sig_opts verify_args = {0};
        struct dm_arg_set as;
        unsigned int num;
+       unsigned int wq_flags;
        unsigned long long num_ll;
        int r;
        int i;
@@ -1388,7 +1389,16 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
        }
 
        /* WQ_UNBOUND greatly improves performance when running on ramdisk */
-       v->verify_wq = alloc_workqueue("kverityd", WQ_MEM_RECLAIM | WQ_UNBOUND, num_online_cpus());
+       wq_flags = WQ_MEM_RECLAIM | WQ_UNBOUND;
+       if (v->use_tasklet) {
+               /*
+                * Allow verify_wq to preempt softirq since verification in
+                * tasklet will fall-back to using it for error handling
+                * (or if the bufio cache doesn't have required hashes).
+                */
+               wq_flags |= WQ_HIGHPRI;
+       }
+       v->verify_wq = alloc_workqueue("kverityd", wq_flags, num_online_cpus());
        if (!v->verify_wq) {
                ti->error = "Cannot allocate workqueue";
                r = -ENOMEM;