]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Aug 2020 07:23:15 +0000 (09:23 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Aug 2020 07:23:15 +0000 (09:23 +0200)
added patches:
kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch

queue-5.4/kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch [new file with mode: 0644]
queue-5.4/series

diff --git a/queue-5.4/kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch b/queue-5.4/kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch
new file mode 100644 (file)
index 0000000..a643f23
--- /dev/null
@@ -0,0 +1,76 @@
+From 26c7295be0c5e6da3fa45970e9748be983175b1b Mon Sep 17 00:00:00 2001
+From: Liang Chen <cl@rock-chips.com>
+Date: Fri, 6 Mar 2020 15:01:33 +0800
+Subject: kthread: Do not preempt current task if it is going to call schedule()
+
+From: Liang Chen <cl@rock-chips.com>
+
+commit 26c7295be0c5e6da3fa45970e9748be983175b1b upstream.
+
+when we create a kthread with ktrhead_create_on_cpu(),the child thread
+entry is ktread.c:ktrhead() which will be preempted by the parent after
+call complete(done) while schedule() is not called yet,then the parent
+will call wait_task_inactive(child) but the child is still on the runqueue,
+so the parent will schedule_hrtimeout() for 1 jiffy,it will waste a lot of
+time,especially on startup.
+
+  parent                             child
+ktrhead_create_on_cpu()
+  wait_fo_completion(&done) -----> ktread.c:ktrhead()
+                             |----- complete(done);--wakeup and preempted by parent
+ kthread_bind() <------------|  |-> schedule();--dequeue here
+  wait_task_inactive(child)     |
+   schedule_hrtimeout(1 jiffy) -|
+
+So we hope the child just wakeup parent but not preempted by parent, and the
+child is going to call schedule() soon,then the parent will not call
+schedule_hrtimeout(1 jiffy) as the child is already dequeue.
+
+The same issue for ktrhead_park()&&kthread_parkme().
+This patch can save 120ms on rk312x startup with CONFIG_HZ=300.
+
+Signed-off-by: Liang Chen <cl@rock-chips.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+Link: https://lkml.kernel.org/r/20200306070133.18335-2-cl@rock-chips.com
+Signed-off-by: Chanho Park <chanho61.park@samsung.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ kernel/kthread.c |   17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+--- a/kernel/kthread.c
++++ b/kernel/kthread.c
+@@ -199,8 +199,15 @@ static void __kthread_parkme(struct kthr
+               if (!test_bit(KTHREAD_SHOULD_PARK, &self->flags))
+                       break;
++              /*
++               * Thread is going to call schedule(), do not preempt it,
++               * or the caller of kthread_park() may spend more time in
++               * wait_task_inactive().
++               */
++              preempt_disable();
+               complete(&self->parked);
+-              schedule();
++              schedule_preempt_disabled();
++              preempt_enable();
+       }
+       __set_current_state(TASK_RUNNING);
+ }
+@@ -245,8 +252,14 @@ static int kthread(void *_create)
+       /* OK, tell user we're spawned, wait for stop or wakeup */
+       __set_current_state(TASK_UNINTERRUPTIBLE);
+       create->result = current;
++      /*
++       * Thread is going to call schedule(), do not preempt it,
++       * or the creator may spend more time in wait_task_inactive().
++       */
++      preempt_disable();
+       complete(done);
+-      schedule();
++      schedule_preempt_disabled();
++      preempt_enable();
+       ret = -EINTR;
+       if (!test_bit(KTHREAD_SHOULD_STOP, &self->flags)) {
index d23e5c3f18db82abdc159f8e4792058a9ead3d9a..9e39a6dc010a911b8191fe1e59e359463970b487 100644 (file)
@@ -36,6 +36,7 @@ mm-memory.c-skip-spurious-tlb-flush-for-retried-page-fault.patch
 drm-amdgpu-display-use-gfp_atomic-in-dcn20_validate_bandwidth_internal.patch
 drm-amd-display-fix-edid-parsing-after-resume-from-suspend.patch
 drm-amd-display-fix-pow-crashing-when-given-base-0.patch
+kthread-do-not-preempt-current-task-if-it-is-going-to-call-schedule.patch
 opp-enable-resources-again-if-they-were-disabled-ear.patch
 scsi-ufs-add-delay_before_lpm-quirk-for-micron-devic.patch
 scsi-target-tcmu-fix-crash-in-tcmu_flush_dcache_rang.patch