Don't allow a paravirt CPU to be used while looking for a CPU to use.

Push task mechanism uses stopper thread which going to call
select_fallback_rq and use this mechanism to avoid picking a paravirt CPU.

Signed-off-by: Shrikanth Hegde <[email protected]>
---
 kernel/sched/core.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 40db5e659994..90fc04d84b74 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2397,8 +2397,13 @@ static inline bool is_cpu_allowed(struct task_struct *p, 
int cpu)
                return cpu_online(cpu);
 
        /* Non kernel threads are not allowed during either online or offline. 
*/
-       if (!(p->flags & PF_KTHREAD))
-               return cpu_active(cpu);
+       if (!(p->flags & PF_KTHREAD)) {
+               /* A user thread shouldn't be allowed on a paravirt cpu */
+               if (cpu_paravirt(cpu))
+                       return false;
+               else
+                       return cpu_active(cpu);
+       }
 
        /* KTHREAD_IS_PER_CPU is always allowed. */
        if (kthread_is_per_cpu(p))
@@ -2408,6 +2413,10 @@ static inline bool is_cpu_allowed(struct task_struct *p, 
int cpu)
        if (cpu_dying(cpu))
                return false;
 
+       /* Non percpu kthreads should stay away from paravirt cpu*/
+       if (cpu_paravirt(cpu))
+               return false;
+
        /* But are allowed during online. */
        return cpu_online(cpu);
 }
-- 
2.47.3


Reply via email to