Loading kernel/sched/core.c +15 −25 Original line number Diff line number Diff line Loading @@ -3985,15 +3985,20 @@ static void do_balance_callbacks(struct rq *rq, struct callback_head *head) } } static void balance_push(struct rq *rq); struct callback_head balance_push_callback = { .next = NULL, .func = (void (*)(struct callback_head *))balance_push, }; static inline struct callback_head *splice_balance_callbacks(struct rq *rq) { struct callback_head *head = rq->balance_callback; lockdep_assert_held(&rq->lock); if (head) { if (head) rq->balance_callback = NULL; rq->balance_flags &= ~BALANCE_WORK; } return head; } Loading @@ -4014,21 +4019,6 @@ static inline void balance_callbacks(struct rq *rq, struct callback_head *head) } } static void balance_push(struct rq *rq); static inline void balance_switch(struct rq *rq) { if (likely(!rq->balance_flags)) return; if (rq->balance_flags & BALANCE_PUSH) { balance_push(rq); return; } __balance_callbacks(rq); } #else static inline void __balance_callbacks(struct rq *rq) Loading @@ -4044,10 +4034,6 @@ static inline void balance_callbacks(struct rq *rq, struct callback_head *head) { } static inline void balance_switch(struct rq *rq) { } #endif static inline void Loading Loading @@ -4075,7 +4061,7 @@ static inline void finish_lock_switch(struct rq *rq) * prev into current: */ spin_acquire(&rq->lock.dep_map, 0, 0, _THIS_IP_); balance_switch(rq); __balance_callbacks(rq); raw_spin_unlock_irq(&rq->lock); } Loading Loading @@ -7282,6 +7268,10 @@ static void balance_push(struct rq *rq) lockdep_assert_held(&rq->lock); SCHED_WARN_ON(rq->cpu != smp_processor_id()); /* * Ensure the thing is persistent until balance_push_set(.on = false); */ rq->balance_callback = &balance_push_callback; /* * Both the cpu-hotplug and stop task are in this case and are Loading Loading @@ -7331,9 +7321,9 @@ static void balance_push_set(int cpu, bool on) rq_lock_irqsave(rq, &rf); if (on) rq->balance_flags |= BALANCE_PUSH; rq->balance_callback = &balance_push_callback; else rq->balance_flags &= ~BALANCE_PUSH; rq->balance_callback = NULL; rq_unlock_irqrestore(rq, &rf); } Loading kernel/sched/sched.h +5 −8 Original line number Diff line number Diff line Loading @@ -975,7 +975,6 @@ struct rq { unsigned long cpu_capacity_orig; struct callback_head *balance_callback; unsigned char balance_flags; unsigned char nohz_idle_balance; unsigned char idle_balance; Loading Loading @@ -1226,6 +1225,8 @@ struct rq_flags { #endif }; extern struct callback_head balance_push_callback; /* * Lockdep annotation that avoids accidental unlocks; it's like a * sticky/continuous lockdep_assert_held(). Loading @@ -1243,9 +1244,9 @@ static inline void rq_pin_lock(struct rq *rq, struct rq_flags *rf) #ifdef CONFIG_SCHED_DEBUG rq->clock_update_flags &= (RQCF_REQ_SKIP|RQCF_ACT_SKIP); rf->clock_update_flags = 0; #endif #ifdef CONFIG_SMP SCHED_WARN_ON(rq->balance_callback); SCHED_WARN_ON(rq->balance_callback && rq->balance_callback != &balance_push_callback); #endif #endif } Loading Loading @@ -1408,9 +1409,6 @@ init_numa_balancing(unsigned long clone_flags, struct task_struct *p) #ifdef CONFIG_SMP #define BALANCE_WORK 0x01 #define BALANCE_PUSH 0x02 static inline void queue_balance_callback(struct rq *rq, struct callback_head *head, Loading @@ -1418,13 +1416,12 @@ queue_balance_callback(struct rq *rq, { lockdep_assert_held(&rq->lock); if (unlikely(head->next || (rq->balance_flags & BALANCE_PUSH))) if (unlikely(head->next || rq->balance_callback == &balance_push_callback)) return; head->func = (void (*)(struct callback_head *))func; head->next = rq->balance_callback; rq->balance_callback = head; rq->balance_flags |= BALANCE_WORK; } #define rcu_dereference_check_sched_domain(p) \ Loading Loading
kernel/sched/core.c +15 −25 Original line number Diff line number Diff line Loading @@ -3985,15 +3985,20 @@ static void do_balance_callbacks(struct rq *rq, struct callback_head *head) } } static void balance_push(struct rq *rq); struct callback_head balance_push_callback = { .next = NULL, .func = (void (*)(struct callback_head *))balance_push, }; static inline struct callback_head *splice_balance_callbacks(struct rq *rq) { struct callback_head *head = rq->balance_callback; lockdep_assert_held(&rq->lock); if (head) { if (head) rq->balance_callback = NULL; rq->balance_flags &= ~BALANCE_WORK; } return head; } Loading @@ -4014,21 +4019,6 @@ static inline void balance_callbacks(struct rq *rq, struct callback_head *head) } } static void balance_push(struct rq *rq); static inline void balance_switch(struct rq *rq) { if (likely(!rq->balance_flags)) return; if (rq->balance_flags & BALANCE_PUSH) { balance_push(rq); return; } __balance_callbacks(rq); } #else static inline void __balance_callbacks(struct rq *rq) Loading @@ -4044,10 +4034,6 @@ static inline void balance_callbacks(struct rq *rq, struct callback_head *head) { } static inline void balance_switch(struct rq *rq) { } #endif static inline void Loading Loading @@ -4075,7 +4061,7 @@ static inline void finish_lock_switch(struct rq *rq) * prev into current: */ spin_acquire(&rq->lock.dep_map, 0, 0, _THIS_IP_); balance_switch(rq); __balance_callbacks(rq); raw_spin_unlock_irq(&rq->lock); } Loading Loading @@ -7282,6 +7268,10 @@ static void balance_push(struct rq *rq) lockdep_assert_held(&rq->lock); SCHED_WARN_ON(rq->cpu != smp_processor_id()); /* * Ensure the thing is persistent until balance_push_set(.on = false); */ rq->balance_callback = &balance_push_callback; /* * Both the cpu-hotplug and stop task are in this case and are Loading Loading @@ -7331,9 +7321,9 @@ static void balance_push_set(int cpu, bool on) rq_lock_irqsave(rq, &rf); if (on) rq->balance_flags |= BALANCE_PUSH; rq->balance_callback = &balance_push_callback; else rq->balance_flags &= ~BALANCE_PUSH; rq->balance_callback = NULL; rq_unlock_irqrestore(rq, &rf); } Loading
kernel/sched/sched.h +5 −8 Original line number Diff line number Diff line Loading @@ -975,7 +975,6 @@ struct rq { unsigned long cpu_capacity_orig; struct callback_head *balance_callback; unsigned char balance_flags; unsigned char nohz_idle_balance; unsigned char idle_balance; Loading Loading @@ -1226,6 +1225,8 @@ struct rq_flags { #endif }; extern struct callback_head balance_push_callback; /* * Lockdep annotation that avoids accidental unlocks; it's like a * sticky/continuous lockdep_assert_held(). Loading @@ -1243,9 +1244,9 @@ static inline void rq_pin_lock(struct rq *rq, struct rq_flags *rf) #ifdef CONFIG_SCHED_DEBUG rq->clock_update_flags &= (RQCF_REQ_SKIP|RQCF_ACT_SKIP); rf->clock_update_flags = 0; #endif #ifdef CONFIG_SMP SCHED_WARN_ON(rq->balance_callback); SCHED_WARN_ON(rq->balance_callback && rq->balance_callback != &balance_push_callback); #endif #endif } Loading Loading @@ -1408,9 +1409,6 @@ init_numa_balancing(unsigned long clone_flags, struct task_struct *p) #ifdef CONFIG_SMP #define BALANCE_WORK 0x01 #define BALANCE_PUSH 0x02 static inline void queue_balance_callback(struct rq *rq, struct callback_head *head, Loading @@ -1418,13 +1416,12 @@ queue_balance_callback(struct rq *rq, { lockdep_assert_held(&rq->lock); if (unlikely(head->next || (rq->balance_flags & BALANCE_PUSH))) if (unlikely(head->next || rq->balance_callback == &balance_push_callback)) return; head->func = (void (*)(struct callback_head *))func; head->next = rq->balance_callback; rq->balance_callback = head; rq->balance_flags |= BALANCE_WORK; } #define rcu_dereference_check_sched_domain(p) \ Loading