diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 420e80e56e55..9fea72f19d85 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -156,11 +156,11 @@ TRACE_EVENT(sched_switch, TP_fast_assign( memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN); __entry->prev_pid = prev->pid; - __entry->prev_prio = prev->prio; + __entry->prev_prio = prev->prio == -1 ? 150 : prev->prio; __entry->prev_state = __trace_sched_switch_state(preempt, prev); memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN); __entry->next_pid = next->pid; - __entry->next_prio = next->prio; + __entry->next_prio = next->prio == -1 ? 150 : next->prio; /* XXX SCHED_DEADLINE */ ), diff --git a/kernel/cpu.c b/kernel/cpu.c index 41b259b8be9d..8512a3d690cd 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #define CREATE_TRACE_POINTS @@ -1052,6 +1053,18 @@ static int do_cpu_down(unsigned int cpu, enum cpuhp_state target) { int err; + /* + * When cpusets are enabled, the rebuilding of the scheduling + * domains is deferred to a workqueue context. Make sure + * that the work is completed before proceeding to the next + * hotplug. Otherwise scheduler observes an inconsistent + * view of online and offline CPUs in the root domain. If + * the online CPUs are still stuck in the offline (default) + * domain, those CPUs would not be visible when scheduling + * happens on from other CPUs in the root domain. + */ + cpuset_wait_for_hotplug(); + cpu_maps_update_begin(); err = cpu_down_maps_locked(cpu, target); cpu_maps_update_done(); @@ -1215,6 +1228,8 @@ static int do_cpu_up(unsigned int cpu, enum cpuhp_state target) return -EINVAL; } + cpuset_wait_for_hotplug(); + switch_err = switch_to_rt_policy(); if (switch_err < 0) return switch_err;