FROMGIT: dm-verity: use softirq context only when !need_resched()

Further limit verification in softirq (a.k.a. BH) context to cases where
rescheduling of the interrupted task is not pending.

This helps prevent the CPU from spending too long in softirq context.

Note that handle_softirqs() in kernel/softirq.c already stops running
softirqs in this same case.  However, that check is too coarse-grained,
since many I/O requests can be processed in a single BLOCK_SOFTIRQ.

cherry-picked from commit f9ed31214e2ac43cd38d1e517e774050b613b8da https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/ dm-6.16
https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/commit/?h=dm-6.16&id=f9ed31214e2ac43cd38d1e517e774050b613b8da

Bug: 404475600
Bug: 401036538

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Change-Id: I015d99c9dfdcf3b601cd76a4c04ed03757edf681
This commit is contained in:
Eric Biggers
2025-04-22 13:22:05 -07:00
committed by Treehugger Robot
parent a8027abd1e
commit 05c9b03f4c

View File

@@ -752,7 +752,8 @@ static void verity_bh_work(struct work_struct *w)
static inline bool verity_use_bh(unsigned int bytes, unsigned short ioprio)
{
return ioprio <= IOPRIO_CLASS_IDLE &&
bytes <= READ_ONCE(dm_verity_use_bh_bytes[ioprio]);
bytes <= READ_ONCE(dm_verity_use_bh_bytes[ioprio]) &&
!need_resched();
}
static void verity_end_io(struct bio *bio)