From: Sasha Levin Date: Tue, 11 Aug 2020 16:50:30 +0000 (-0400) Subject: Fixes for 5.8 X-Git-Tag: v4.19.140~70 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=eab5c3b33947101fc741df78d00346b6e3f855a3;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.8 Signed-off-by: Sasha Levin --- diff --git a/queue-5.8/io_uring-abstract-out-task-work-running.patch b/queue-5.8/io_uring-abstract-out-task-work-running.patch new file mode 100644 index 00000000000..fe1cffcdf86 --- /dev/null +++ b/queue-5.8/io_uring-abstract-out-task-work-running.patch @@ -0,0 +1,125 @@ +From 66696b15634af1d0cbfec1f3ee27388ea5ad3151 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 11 Aug 2020 12:48:13 -0400 +Subject: io_uring: abstract out task work running + +From: Jens Axboe + +[ Upstream commit 4c6e277c4cc4a6b3b2b9c66a7b014787ae757cc1 ] + +Provide a helper to run task_work instead of checking and running +manually in a bunch of different spots. While doing so, also move the +task run state setting where we run the task work. Then we can move it +out of the callback helpers. This also helps ensure we only do this once +per task_work list run, not per task_work item. + +Suggested-by: Oleg Nesterov +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 32 +++++++++++++++++++------------- + 1 file changed, 19 insertions(+), 13 deletions(-) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 493e5047e67c9..95bacab047ddb 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -1747,6 +1747,17 @@ static int io_put_kbuf(struct io_kiocb *req) + return cflags; + } + ++static inline bool io_run_task_work(void) ++{ ++ if (current->task_works) { ++ __set_current_state(TASK_RUNNING); ++ task_work_run(); ++ return true; ++ } ++ ++ return false; ++} ++ + static void io_iopoll_queue(struct list_head *again) + { + struct io_kiocb *req; +@@ -1936,6 +1947,7 @@ static int io_iopoll_check(struct io_ring_ctx *ctx, unsigned *nr_events, + */ + if (!(++iters & 7)) { + mutex_unlock(&ctx->uring_lock); ++ io_run_task_work(); + mutex_lock(&ctx->uring_lock); + } + +@@ -4356,7 +4368,6 @@ static void io_async_task_func(struct callback_head *cb) + kfree(apoll); + + if (!canceled) { +- __set_current_state(TASK_RUNNING); + if (io_sq_thread_acquire_mm(ctx, req)) { + io_cqring_add_event(req, -EFAULT); + goto end_req; +@@ -6082,8 +6093,7 @@ static int io_sq_thread(void *data) + if (!list_empty(&ctx->poll_list) || need_resched() || + (!time_after(jiffies, timeout) && ret != -EBUSY && + !percpu_ref_is_dying(&ctx->refs))) { +- if (current->task_works) +- task_work_run(); ++ io_run_task_work(); + cond_resched(); + continue; + } +@@ -6115,8 +6125,7 @@ static int io_sq_thread(void *data) + finish_wait(&ctx->sqo_wait, &wait); + break; + } +- if (current->task_works) { +- task_work_run(); ++ if (io_run_task_work()) { + finish_wait(&ctx->sqo_wait, &wait); + continue; + } +@@ -6145,8 +6154,7 @@ static int io_sq_thread(void *data) + timeout = jiffies + ctx->sq_thread_idle; + } + +- if (current->task_works) +- task_work_run(); ++ io_run_task_work(); + + io_sq_thread_drop_mm(ctx); + revert_creds(old_cred); +@@ -6211,9 +6219,8 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, + do { + if (io_cqring_events(ctx, false) >= min_events) + return 0; +- if (!current->task_works) ++ if (!io_run_task_work()) + break; +- task_work_run(); + } while (1); + + if (sig) { +@@ -6235,8 +6242,8 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, + prepare_to_wait_exclusive(&ctx->wait, &iowq.wq, + TASK_INTERRUPTIBLE); + /* make sure we run task_work before checking for signals */ +- if (current->task_works) +- task_work_run(); ++ if (io_run_task_work()) ++ continue; + if (signal_pending(current)) { + if (current->jobctl & JOBCTL_TASK_WORK) { + spin_lock_irq(¤t->sighand->siglock); +@@ -7655,8 +7662,7 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit, + int submitted = 0; + struct fd f; + +- if (current->task_works) +- task_work_run(); ++ io_run_task_work(); + + if (flags & ~(IORING_ENTER_GETEVENTS | IORING_ENTER_SQ_WAKEUP)) + return -EINVAL; +-- +2.25.1 + diff --git a/queue-5.8/kunit-capture-stderr-on-all-make-subprocess-calls.patch b/queue-5.8/kunit-capture-stderr-on-all-make-subprocess-calls.patch new file mode 100644 index 00000000000..3bfeaa5a102 --- /dev/null +++ b/queue-5.8/kunit-capture-stderr-on-all-make-subprocess-calls.patch @@ -0,0 +1,65 @@ +From 477b86610e58a7a0406253b19ab8d6578666892f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jul 2020 14:35:43 -0700 +Subject: kunit: capture stderr on all make subprocess calls + +From: Will Chen + +[ Upstream commit 5a9fcad71caa970f30aef99134a1cd19bc4b8eea ] + +Direct stderr to subprocess.STDOUT so error messages get included in the +subprocess.CalledProcessError exceptions output field. This results in +more meaningful error messages for the user. + +This is already being done in the make_allyesconfig method. Do the same +for make_mrproper, make_olddefconfig, and make methods. + +With this, failures on unclean trees [1] will give users an error +message that includes: +"The source tree is not clean, please run 'make ARCH=um mrproper'" + +[1] https://bugzilla.kernel.org/show_bug.cgi?id=205219 + +Signed-off-by: Will Chen +Reviewed-by: Brendan Higgins +Tested-by: Brendan Higgins +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/kunit/kunit_kernel.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/tools/testing/kunit/kunit_kernel.py b/tools/testing/kunit/kunit_kernel.py +index 63dbda2d029f6..e20e2056cb380 100644 +--- a/tools/testing/kunit/kunit_kernel.py ++++ b/tools/testing/kunit/kunit_kernel.py +@@ -34,7 +34,7 @@ class LinuxSourceTreeOperations(object): + + def make_mrproper(self): + try: +- subprocess.check_output(['make', 'mrproper']) ++ subprocess.check_output(['make', 'mrproper'], stderr=subprocess.STDOUT) + except OSError as e: + raise ConfigError('Could not call make command: ' + e) + except subprocess.CalledProcessError as e: +@@ -47,7 +47,7 @@ class LinuxSourceTreeOperations(object): + if build_dir: + command += ['O=' + build_dir] + try: +- subprocess.check_output(command, stderr=subprocess.PIPE) ++ subprocess.check_output(command, stderr=subprocess.STDOUT) + except OSError as e: + raise ConfigError('Could not call make command: ' + e) + except subprocess.CalledProcessError as e: +@@ -77,7 +77,7 @@ class LinuxSourceTreeOperations(object): + if build_dir: + command += ['O=' + build_dir] + try: +- subprocess.check_output(command) ++ subprocess.check_output(command, stderr=subprocess.STDOUT) + except OSError as e: + raise BuildError('Could not call execute make: ' + e) + except subprocess.CalledProcessError as e: +-- +2.25.1 + diff --git a/queue-5.8/series b/queue-5.8/series index 1c44f8a6f0a..d7b4b50df3a 100644 --- a/queue-5.8/series +++ b/queue-5.8/series @@ -1 +1,3 @@ tracepoint-mark-__tracepoint_string-s-__used.patch +kunit-capture-stderr-on-all-make-subprocess-calls.patch +io_uring-abstract-out-task-work-running.patch