History

Merge tag 'sched_urgent_for_5.8_rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull scheduler fixes from Borislav Petkov: "The most anticipated fix in this pull request is probably the horrible build fix for the RANDSTRUCT fail that didn't make -rc2. Also included is the cleanup that removes those BUILD_BUG_ON()s and replaces it with ugly unions. Also included is the try_to_wake_up() race fix that was first triggered by Paul's RCU-torture runs, but was independently hit by Dave Chinner's fstest runs as well" * tag 'sched_urgent_for_5.8_rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: sched/cfs: change initial value of runnable_avg smp, irq_work: Continue smp_call_function*() and irq_work*() integration sched/core: s/WF_ON_RQ/WQ_ON_CPU/ sched/core: Fix ttwu() race sched/core: Fix PI boosting between RT and DEADLINE tasks sched/deadline: Initialize ->dl_boosted sched/core: Check cpus_mask, not cpus_ptr in __set_cpus_allowed_ptr(), to fix mask corruption sched/core: Fix CONFIG_GCC_PLUGIN_RANDSTRUCT build fail

Linus Torvalds committed 6 years ago

Commit 91a9a902 parents 098c793 e21cf439 files · +120 −65Browse files

Unified · Split

9 files
  1. include/linux/irq_work.h +8 −18
  2. include/linux/sched.h +1 −2
  3. include/linux/smp.h +8 −15
  4. include/linux/smp_types.h +66 −0
  5. kernel/sched/core.c +34 −10
  6. kernel/sched/deadline.c +1 −0
  7. kernel/sched/fair.c +1 −1
  8. kernel/sched/sched.h +1 −1
  9. kernel/smp.c +0 −18
include/linux/irq_work.h+8−18
@@ -2,7 +2,7 @@ · 1 unmodified line
2#ifndef _LINUX_IRQ_WORK_H2#ifndef _LINUX_IRQ_WORK_H
3#define _LINUX_IRQ_WORK_H3#define _LINUX_IRQ_WORK_H
4 4
5#include <linux/llist.h>5#include <linux/smp_types.h>
6 6
7/*7/*
8 * An entry can be in one of four states:8 * An entry can be in one of four states:
@@ -13,24 +13,14 @@ · 4 unmodified lines
13 * busy NULL, 2 -> {free, claimed} : callback in progress, can be claimed13 * busy NULL, 2 -> {free, claimed} : callback in progress, can be claimed
14 */14 */
15 15
16/* flags share CSD_FLAG_ space */
17
18#define IRQ_WORK_PENDING BIT(0)
19#define IRQ_WORK_BUSY BIT(1)
20
21/* Doesn't want IPI, wait for tick: */
22#define IRQ_WORK_LAZY BIT(2)
23/* Run hard IRQ context, even on RT */
24#define IRQ_WORK_HARD_IRQ BIT(3)
25
26#define IRQ_WORK_CLAIMED (IRQ_WORK_PENDING | IRQ_WORK_BUSY)
27
28/*
29 * structure shares layout with single_call_data_t.
30 */
31struct irq_work {16struct irq_work {
32 struct llist_node llnode;17 union {
33 atomic_t flags;18 struct __call_single_node node;
19 struct {
20 struct llist_node llnode;
21 atomic_t flags;
22 };
23 };
34 void (*func)(struct irq_work *);24 void (*func)(struct irq_work *);
35};25};
36 26
include/linux/sched.h+1−2
@@ -654,9 +654,8 @@ struct task_struct { · 653 unmodified lines
654 unsigned int ptrace;654 unsigned int ptrace;
655 655
656#ifdef CONFIG_SMP656#ifdef CONFIG_SMP
657 struct llist_node wake_entry;
658 unsigned int wake_entry_type;
659 int on_cpu;657 int on_cpu;
658 struct __call_single_node wake_entry;
660#ifdef CONFIG_THREAD_INFO_IN_TASK659#ifdef CONFIG_THREAD_INFO_IN_TASK
661 /* Current CPU: */660 /* Current CPU: */
662 unsigned int cpu;661 unsigned int cpu;
include/linux/smp.h+8−15
@@ -12,29 +12,22 @@ · 11 unmodified lines
12#include <linux/list.h>12#include <linux/list.h>
13#include <linux/cpumask.h>13#include <linux/cpumask.h>
14#include <linux/init.h>14#include <linux/init.h>
15#include <linux/llist.h>15#include <linux/smp_types.h>
16 16
17typedef void (*smp_call_func_t)(void *info);17typedef void (*smp_call_func_t)(void *info);
18typedef bool (*smp_cond_func_t)(int cpu, void *info);18typedef bool (*smp_cond_func_t)(int cpu, void *info);
19 19
20enum {
21 CSD_FLAG_LOCK = 0x01,
22
23 /* IRQ_WORK_flags */
24
25 CSD_TYPE_ASYNC = 0x00,
26 CSD_TYPE_SYNC = 0x10,
27 CSD_TYPE_IRQ_WORK = 0x20,
28 CSD_TYPE_TTWU = 0x30,
29 CSD_FLAG_TYPE_MASK = 0xF0,
30};
31
32/*20/*
33 * structure shares (partial) layout with struct irq_work21 * structure shares (partial) layout with struct irq_work
34 */22 */
35struct __call_single_data {23struct __call_single_data {
36 struct llist_node llist;24 union {
37 unsigned int flags;25 struct __call_single_node node;
26 struct {
27 struct llist_node llist;
28 unsigned int flags;
29 };
30 };
38 smp_call_func_t func;31 smp_call_func_t func;
39 void *info;32 void *info;
40};33};
include/linux/smp_types.h+66−0
@@ -0,0 +1,66 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __LINUX_SMP_TYPES_H
3#define __LINUX_SMP_TYPES_H
4
5#include <linux/llist.h>
6
7enum {
8 CSD_FLAG_LOCK = 0x01,
9
10 IRQ_WORK_PENDING = 0x01,
11 IRQ_WORK_BUSY = 0x02,
12 IRQ_WORK_LAZY = 0x04, /* No IPI, wait for tick */
13 IRQ_WORK_HARD_IRQ = 0x08, /* IRQ context on PREEMPT_RT */
14
15 IRQ_WORK_CLAIMED = (IRQ_WORK_PENDING | IRQ_WORK_BUSY),
16
17 CSD_TYPE_ASYNC = 0x00,
18 CSD_TYPE_SYNC = 0x10,
19 CSD_TYPE_IRQ_WORK = 0x20,
20 CSD_TYPE_TTWU = 0x30,
21
22 CSD_FLAG_TYPE_MASK = 0xF0,
23};
24
25/*
26 * struct __call_single_node is the primary type on
27 * smp.c:call_single_queue.
28 *
29 * flush_smp_call_function_queue() only reads the type from
30 * __call_single_node::u_flags as a regular load, the above
31 * (anonymous) enum defines all the bits of this word.
32 *
33 * Other bits are not modified until the type is known.
34 *
35 * CSD_TYPE_SYNC/ASYNC:
36 * struct {
37 * struct llist_node node;
38 * unsigned int flags;
39 * smp_call_func_t func;
40 * void *info;
41 * };
42 *
43 * CSD_TYPE_IRQ_WORK:
44 * struct {
45 * struct llist_node node;
46 * atomic_t flags;
47 * void (*func)(struct irq_work *);
48 * };
49 *
50 * CSD_TYPE_TTWU:
51 * struct {
52 * struct llist_node node;
53 * unsigned int flags;
54 * };
55 *
56 */
57
58struct __call_single_node {
59 struct llist_node llist;
60 union {
61 unsigned int u_flags;
62 atomic_t a_flags;
63 };
64};
65
66#endif /* __LINUX_SMP_TYPES_H */
kernel/sched/core.c+34−10
@@ -1637,7 +1637,7 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, · 1636 unmodified lines
1637 goto out;1637 goto out;
1638 }1638 }
1639 1639
1640 if (cpumask_equal(p->cpus_ptr, new_mask))1640 if (cpumask_equal(&p->cpus_mask, new_mask))
1641 goto out;1641 goto out;
1642 1642
1643 /*1643 /*
@@ -2293,8 +2293,15 @@ void sched_ttwu_pending(void *arg) · 649 unmodified lines
2293 rq_lock_irqsave(rq, &rf);2293 rq_lock_irqsave(rq, &rf);
2294 update_rq_clock(rq);2294 update_rq_clock(rq);
2295 2295
2296 llist_for_each_entry_safe(p, t, llist, wake_entry)2296 llist_for_each_entry_safe(p, t, llist, wake_entry.llist) {
2297 if (WARN_ON_ONCE(p->on_cpu))
2298 smp_cond_load_acquire(&p->on_cpu, !VAL);
2299
2300 if (WARN_ON_ONCE(task_cpu(p) != cpu_of(rq)))
2301 set_task_cpu(p, cpu_of(rq));
2302
2297 ttwu_do_activate(rq, p, p->sched_remote_wakeup ? WF_MIGRATED : 0, &rf);2303 ttwu_do_activate(rq, p, p->sched_remote_wakeup ? WF_MIGRATED : 0, &rf);
2304 }
2298 2305
2299 rq_unlock_irqrestore(rq, &rf);2306 rq_unlock_irqrestore(rq, &rf);
2300}2307}
@@ -2322,7 +2329,7 @@ static void __ttwu_queue_wakelist(struct task_struct *p, int cpu, int wake_flags · 21 unmodified lines
2322 p->sched_remote_wakeup = !!(wake_flags & WF_MIGRATED);2329 p->sched_remote_wakeup = !!(wake_flags & WF_MIGRATED);
2323 2330
2324 WRITE_ONCE(rq->ttwu_pending, 1);2331 WRITE_ONCE(rq->ttwu_pending, 1);
2325 __smp_call_single_queue(cpu, &p->wake_entry);2332 __smp_call_single_queue(cpu, &p->wake_entry.llist);
2326}2333}
2327 2334
2328void wake_up_if_idle(int cpu)2335void wake_up_if_idle(int cpu)
@@ -2369,7 +2376,7 @@ static inline bool ttwu_queue_cond(int cpu, int wake_flags) · 40 unmodified lines
2369 * the soon-to-be-idle CPU as the current CPU is likely busy.2376 * the soon-to-be-idle CPU as the current CPU is likely busy.
2370 * nr_running is checked to avoid unnecessary task stacking.2377 * nr_running is checked to avoid unnecessary task stacking.
2371 */2378 */
2372 if ((wake_flags & WF_ON_RQ) && cpu_rq(cpu)->nr_running <= 1)2379 if ((wake_flags & WF_ON_CPU) && cpu_rq(cpu)->nr_running <= 1)
2373 return true;2380 return true;
2374 2381
2375 return false;2382 return false;
@@ -2378,6 +2385,9 @@ static inline bool ttwu_queue_cond(int cpu, int wake_flags) · 2 unmodified lines
2378static bool ttwu_queue_wakelist(struct task_struct *p, int cpu, int wake_flags)2385static bool ttwu_queue_wakelist(struct task_struct *p, int cpu, int wake_flags)
2379{2386{
2380 if (sched_feat(TTWU_QUEUE) && ttwu_queue_cond(cpu, wake_flags)) {2387 if (sched_feat(TTWU_QUEUE) && ttwu_queue_cond(cpu, wake_flags)) {
2388 if (WARN_ON_ONCE(cpu == smp_processor_id()))
2389 return false;
2390
2381 sched_clock_cpu(cpu); /* Sync clocks across CPUs */2391 sched_clock_cpu(cpu); /* Sync clocks across CPUs */
2382 __ttwu_queue_wakelist(p, cpu, wake_flags);2392 __ttwu_queue_wakelist(p, cpu, wake_flags);
2383 return true;2393 return true;
@@ -2528,7 +2538,6 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) · 144 unmodified lines
2528 goto out;2538 goto out;
2529 2539
2530 success = 1;2540 success = 1;
2531 cpu = task_cpu(p);
2532 trace_sched_waking(p);2541 trace_sched_waking(p);
2533 p->state = TASK_RUNNING;2542 p->state = TASK_RUNNING;
2534 trace_sched_wakeup(p);2543 trace_sched_wakeup(p);
@@ -2550,7 +2559,6 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) · 15 unmodified lines
2550 2559
2551 /* We're going to change ->state: */2560 /* We're going to change ->state: */
2552 success = 1;2561 success = 1;
2553 cpu = task_cpu(p);
2554 2562
2555 /*2563 /*
2556 * Ensure we load p->on_rq _after_ p->state, otherwise it would2564 * Ensure we load p->on_rq _after_ p->state, otherwise it would
@@ -2614,8 +2622,21 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) · 57 unmodified lines
2614 * which potentially sends an IPI instead of spinning on p->on_cpu to2622 * which potentially sends an IPI instead of spinning on p->on_cpu to
2615 * let the waker make forward progress. This is safe because IRQs are2623 * let the waker make forward progress. This is safe because IRQs are
2616 * disabled and the IPI will deliver after on_cpu is cleared.2624 * disabled and the IPI will deliver after on_cpu is cleared.
2625 *
2626 * Ensure we load task_cpu(p) after p->on_cpu:
2627 *
2628 * set_task_cpu(p, cpu);
2629 * STORE p->cpu = @cpu
2630 * __schedule() (switch to task 'p')
2631 * LOCK rq->lock
2632 * smp_mb__after_spin_lock() smp_cond_load_acquire(&p->on_cpu)
2633 * STORE p->on_cpu = 1 LOAD p->cpu
2634 *
2635 * to ensure we observe the correct CPU on which the task is currently
2636 * scheduling.
2617 */2637 */
2618 if (READ_ONCE(p->on_cpu) && ttwu_queue_wakelist(p, cpu, wake_flags | WF_ON_RQ))2638 if (smp_load_acquire(&p->on_cpu) &&
2639 ttwu_queue_wakelist(p, task_cpu(p), wake_flags | WF_ON_CPU))
2619 goto unlock;2640 goto unlock;
2620 2641
2621 /*2642 /*
@@ -2635,6 +2656,8 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) · 13 unmodified lines
2635 psi_ttwu_dequeue(p);2656 psi_ttwu_dequeue(p);
2636 set_task_cpu(p, cpu);2657 set_task_cpu(p, cpu);
2637 }2658 }
2659#else
2660 cpu = task_cpu(p);
2638#endif /* CONFIG_SMP */2661#endif /* CONFIG_SMP */
2639 2662
2640 ttwu_queue(p, cpu, wake_flags);2663 ttwu_queue(p, cpu, wake_flags);
@@ -2642,7 +2665,7 @@ unlock: · 1 unmodified line
2642 raw_spin_unlock_irqrestore(&p->pi_lock, flags);2665 raw_spin_unlock_irqrestore(&p->pi_lock, flags);
2643out:2666out:
2644 if (success)2667 if (success)
2645 ttwu_stat(p, cpu, wake_flags);2668 ttwu_stat(p, task_cpu(p), wake_flags);
2646 preempt_enable();2669 preempt_enable();
2647 2670
2648 return success;2671 return success;
@@ -2763,7 +2786,7 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) · 114 unmodified lines
2763#endif2786#endif
2764 init_numa_balancing(clone_flags, p);2787 init_numa_balancing(clone_flags, p);
2765#ifdef CONFIG_SMP2788#ifdef CONFIG_SMP
2766 p->wake_entry_type = CSD_TYPE_TTWU;2789 p->wake_entry.u_flags = CSD_TYPE_TTWU;
2767#endif2790#endif
2768}2791}
2769 2792
@@ -4533,7 +4556,8 @@ void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task) · 1763 unmodified lines
4533 */4556 */
4534 if (dl_prio(prio)) {4557 if (dl_prio(prio)) {
4535 if (!dl_prio(p->normal_prio) ||4558 if (!dl_prio(p->normal_prio) ||
4536 (pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) {4559 (pi_task && dl_prio(pi_task->prio) &&
4560 dl_entity_preempt(&pi_task->dl, &p->dl))) {
4537 p->dl.dl_boosted = 1;4561 p->dl.dl_boosted = 1;
4538 queue_flag |= ENQUEUE_REPLENISH;4562 queue_flag |= ENQUEUE_REPLENISH;
4539 } else4563 } else
kernel/sched/deadline.c+1−0
@@ -2692,6 +2692,7 @@ void __dl_clear_params(struct task_struct *p) · 2691 unmodified lines
2692 dl_se->dl_bw = 0;2692 dl_se->dl_bw = 0;
2693 dl_se->dl_density = 0;2693 dl_se->dl_density = 0;
2694 2694
2695 dl_se->dl_boosted = 0;
2695 dl_se->dl_throttled = 0;2696 dl_se->dl_throttled = 0;
2696 dl_se->dl_yielded = 0;2697 dl_se->dl_yielded = 0;
2697 dl_se->dl_non_contending = 0;2698 dl_se->dl_non_contending = 0;
kernel/sched/fair.c+1−1
@@ -806,7 +806,7 @@ void post_init_entity_util_avg(struct task_struct *p) · 805 unmodified lines
806 }806 }
807 }807 }
808 808
809 sa->runnable_avg = cpu_scale;809 sa->runnable_avg = sa->util_avg;
810 810
811 if (p->sched_class != &fair_sched_class) {811 if (p->sched_class != &fair_sched_class) {
812 /*812 /*
kernel/sched/sched.h+1−1
@@ -1682,7 +1682,7 @@ static inline int task_on_rq_migrating(struct task_struct *p) · 1681 unmodified lines
1682#define WF_SYNC 0x01 /* Waker goes to sleep after wakeup */1682#define WF_SYNC 0x01 /* Waker goes to sleep after wakeup */
1683#define WF_FORK 0x02 /* Child wakeup after fork */1683#define WF_FORK 0x02 /* Child wakeup after fork */
1684#define WF_MIGRATED 0x04 /* Internal use, task got migrated */1684#define WF_MIGRATED 0x04 /* Internal use, task got migrated */
1685#define WF_ON_RQ 0x08 /* Wakee is on_rq */1685#define WF_ON_CPU 0x08 /* Wakee is on_cpu */
1686 1686
1687/*1687/*
1688 * To aid in avoiding the subversion of "niceness" due to uneven distribution1688 * To aid in avoiding the subversion of "niceness" due to uneven distribution
kernel/smp.c+0−18
@@ -669,24 +669,6 @@ void __init smp_init(void) · 668 unmodified lines
669{669{
670 int num_nodes, num_cpus;670 int num_nodes, num_cpus;
671 671
672 /*
673 * Ensure struct irq_work layout matches so that
674 * flush_smp_call_function_queue() can do horrible things.
675 */
676 BUILD_BUG_ON(offsetof(struct irq_work, llnode) !=
677 offsetof(struct __call_single_data, llist));
678 BUILD_BUG_ON(offsetof(struct irq_work, func) !=
679 offsetof(struct __call_single_data, func));
680 BUILD_BUG_ON(offsetof(struct irq_work, flags) !=
681 offsetof(struct __call_single_data, flags));
682
683 /*
684 * Assert the CSD_TYPE_TTWU layout is similar enough
685 * for task_struct to be on the @call_single_queue.
686 */
687 BUILD_BUG_ON(offsetof(struct task_struct, wake_entry_type) - offsetof(struct task_struct, wake_entry) !=
688 offsetof(struct __call_single_data, flags) - offsetof(struct __call_single_data, llist));
689
690 idle_threads_init();672 idle_threads_init();
691 cpuhp_threads_init();673 cpuhp_threads_init();
692 674

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t