diff options
Diffstat (limited to 'debian/patches-rt/0029-mm-scatterlist-Replace-the-preemptible-warning-in-sg.patch')
-rw-r--r-- | debian/patches-rt/0029-mm-scatterlist-Replace-the-preemptible-warning-in-sg.patch | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/debian/patches-rt/0029-mm-scatterlist-Replace-the-preemptible-warning-in-sg.patch b/debian/patches-rt/0029-mm-scatterlist-Replace-the-preemptible-warning-in-sg.patch new file mode 100644 index 000000000..9c3501e75 --- /dev/null +++ b/debian/patches-rt/0029-mm-scatterlist-Replace-the-preemptible-warning-in-sg.patch @@ -0,0 +1,93 @@ +From c0eaff4633facf5c6b6c214eaefb20a35a09dc86 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner <tglx@linutronix.de> +Date: Fri, 15 Oct 2021 23:14:09 +0200 +Subject: [PATCH 029/158] mm/scatterlist: Replace the !preemptible warning in + sg_miter_stop() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.15/older/patches-5.15.10-rt24.tar.xz + +sg_miter_stop() checks for disabled preemption before unmapping a page +via kunmap_atomic(). The kernel doc mentions under context that +preemption must be disabled if SG_MITER_ATOMIC is set. + +There is no active requirement for the caller to have preemption +disabled before invoking sg_mitter_stop(). The sg_mitter_*() +implementation itself has no such requirement. +In fact, preemption is disabled by kmap_atomic() as part of +sg_miter_next() and remains disabled as long as there is an active +SG_MITER_ATOMIC mapping. This is a consequence of kmap_atomic() and not +a requirement for sg_mitter_*() itself. +The user chooses SG_MITER_ATOMIC because it uses the API in a context +where blocking is not possible or blocking is possible but he chooses a +lower weight mapping which is not available on all CPUs and so it might +need less overhead to setup at a price that now preemption will be +disabled. + +The kmap_atomic() implementation on PREEMPT_RT does not disable +preemption. It simply disables CPU migration to ensure that the task +remains on the same CPU while the caller remains preemptible. This in +turn triggers the warning in sg_miter_stop() because preemption is +allowed. + +The PREEMPT_RT and !PREEMPT_RT implementation of kmap_atomic() disable +pagefaults as a requirement. It is sufficient to check for this instead +of disabled preemption. + +Check for disabled pagefault handler in the SG_MITER_ATOMIC case. Remove +the "preemption disabled" part from the kernel doc as the sg_milter*() +implementation does not care. + +[bigeasy: commit description. ] + +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Link: https://lore.kernel.org/r/20211015211409.cqopacv3pxdwn2ty@linutronix.de +--- + lib/scatterlist.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +diff --git a/lib/scatterlist.c b/lib/scatterlist.c +index abb3432ed744..d5e82e4a57ad 100644 +--- a/lib/scatterlist.c ++++ b/lib/scatterlist.c +@@ -828,8 +828,7 @@ static bool sg_miter_get_next_page(struct sg_mapping_iter *miter) + * stops @miter. + * + * Context: +- * Don't care if @miter is stopped, or not proceeded yet. +- * Otherwise, preemption disabled if the SG_MITER_ATOMIC is set. ++ * Don't care. + * + * Returns: + * true if @miter contains the valid mapping. false if end of sg +@@ -865,8 +864,7 @@ EXPORT_SYMBOL(sg_miter_skip); + * @miter->addr and @miter->length point to the current mapping. + * + * Context: +- * Preemption disabled if SG_MITER_ATOMIC. Preemption must stay disabled +- * till @miter is stopped. May sleep if !SG_MITER_ATOMIC. ++ * May sleep if !SG_MITER_ATOMIC. + * + * Returns: + * true if @miter contains the next mapping. false if end of sg +@@ -906,8 +904,7 @@ EXPORT_SYMBOL(sg_miter_next); + * need to be released during iteration. + * + * Context: +- * Preemption disabled if the SG_MITER_ATOMIC is set. Don't care +- * otherwise. ++ * Don't care otherwise. + */ + void sg_miter_stop(struct sg_mapping_iter *miter) + { +@@ -922,7 +919,7 @@ void sg_miter_stop(struct sg_mapping_iter *miter) + flush_dcache_page(miter->page); + + if (miter->__flags & SG_MITER_ATOMIC) { +- WARN_ON_ONCE(preemptible()); ++ WARN_ON_ONCE(!pagefault_disabled()); + kunmap_atomic(miter->addr); + } else + kunmap(miter->page); +-- +2.33.1 + |