summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0029-mm-scatterlist-Replace-the-preemptible-warning-in-sg.patch
diff options
context:
space:
mode:
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.patch93
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
+