UPSTREAM: sched: introduce this_rq_lock_irq()
authorJohannes Weiner <hannes@cmpxchg.org>
Fri, 26 Oct 2018 22:06:23 +0000 (15:06 -0700)
committerwangwang <wangwang1@lenovo.com>
Wed, 13 Nov 2019 02:34:42 +0000 (10:34 +0800)
do_sched_yield() disables IRQs, looks up this_rq() and locks it.  The next
patch is adding another site with the same pattern, so provide a
convenience function for it.

Link: http://lkml.kernel.org/r/20180828172258.3185-8-hannes@cmpxchg.org
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: Suren Baghdasaryan <surenb@google.com>
Tested-by: Daniel Drake <drake@endlessm.com>
Cc: Christopher Lameter <cl@linux.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Johannes Weiner <jweiner@fb.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Enderborg <peter.enderborg@sony.com>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Shakeel Butt <shakeelb@google.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Vinayak Menon <vinmenon@codeaurora.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
(cherry picked from commit 246b3b3342c9b0a2e24cda2178be87bc36e1c874)

Bug: 127712811
Test: lmkd in PSI mode
Change-Id: I24b42cff1624c80633f116b7cb485564f53a30a7
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
kernel/sched/core.c
kernel/sched/sched.h

index 75db2c6a63c731e19c16421529933b1dbf3e8542..7c7952aa535ab0a3a6268a5d083f880c526c4178 100644 (file)
@@ -4893,9 +4893,7 @@ SYSCALL_DEFINE0(sched_yield)
        struct rq_flags rf;
        struct rq *rq;
 
-       local_irq_disable();
-       rq = this_rq();
-       rq_lock(rq, &rf);
+       rq = this_rq_lock_irq(&rf);
 
        schedstat_inc(rq->yld_count);
        current->sched_class->yield_task(rq);
index c8342cb6d5189303bf70aa1dfead9475168177d8..851d08a33ba674875572fecbfa593ba583b98108 100644 (file)
@@ -1137,6 +1137,18 @@ rq_unlock(struct rq *rq, struct rq_flags *rf)
        raw_spin_unlock(&rq->lock);
 }
 
+static inline struct rq *
+this_rq_lock_irq(struct rq_flags *rf)
+       __acquires(rq->lock)
+{
+       struct rq *rq;
+
+       local_irq_disable();
+       rq = this_rq();
+       rq_lock(rq, rf);
+       return rq;
+}
+
 #ifdef CONFIG_NUMA
 enum numa_topology_type {
        NUMA_DIRECT,