io-wq: don't retry task_work creation failure on fatal conditions io_uring-5.16-2021-12-03
authorJens Axboe <axboe@kernel.dk>
Fri, 3 Dec 2021 02:40:15 +0000 (19:40 -0700)
committerJens Axboe <axboe@kernel.dk>
Fri, 3 Dec 2021 13:27:32 +0000 (06:27 -0700)
We don't want to be retrying task_work creation failure if there's
an actual signal pending for the parent task. If we do, then we can
enter an infinite loop of perpetually retrying and each retry failing
with -ERESTARTNOINTR because a signal is pending.

Fixes: 3146cba99aa2 ("io-wq: make worker creation resilient against signals")
Reported-by: Florian Fischer <florian.fl.fischer@fau.de>
Link: https://lore.kernel.org/io-uring/20211202165606.mqryio4yzubl7ms5@pasture/
Tested-by: Florian Fischer <florian.fl.fischer@fau.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io-wq.c

index 88202de519f6d1755103f435ae6b2eea14e55adb..50cf9f92da3613f22da54392dcbba54e3d20e8a3 100644 (file)
@@ -714,6 +714,13 @@ static bool io_wq_work_match_all(struct io_wq_work *work, void *data)
 
 static inline bool io_should_retry_thread(long err)
 {
+       /*
+        * Prevent perpetual task_work retry, if the task (or its group) is
+        * exiting.
+        */
+       if (fatal_signal_pending(current))
+               return false;
+
        switch (err) {
        case -EAGAIN:
        case -ERESTARTSYS: