[PATCH] mm: yield on fatal signal/cond_sched() in vector_madvise()

From: Lorenzo Stoakes
Date: Fri Oct 25 2024 - 13:05:48 EST


While we have to treat -ERESTARTNOINTR specially here as we are looping
through a vector of operations and can't simply restart the entire
operation, we mustn't hold up fatal signals or RT kernels.
---
mm/madvise.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/mm/madvise.c b/mm/madvise.c
index 48eba25e25fe..127aa5d86656 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -1713,8 +1713,14 @@ static ssize_t vector_madvise(struct mm_struct *mm, struct iov_iter *iter,
* we have already rescinded locks, it should be no problem to
* simply try again.
*/
- if (ret == -ERESTARTNOINTR)
+ if (ret == -ERESTARTNOINTR) {
+ if (fatal_signal_pending(current)) {
+ ret = -EINTR;
+ break;
+ }
+ cond_resched();
continue;
+ }
if (ret < 0)
break;
iov_iter_advance(iter, iter_iov_len(iter));
--
2.47.0