diff options
| -rw-r--r-- | arch/um/drivers/mconsole_kern.c | 1 | ||||
| -rw-r--r-- | include/linux/rcupdate.h | 1 | ||||
| -rw-r--r-- | include/linux/rcutiny.h | 6 | ||||
| -rw-r--r-- | include/linux/sched.h | 10 | ||||
| -rw-r--r-- | kernel/rcutree.c | 1 | ||||
| -rw-r--r-- | kernel/rcutree.h | 1 | ||||
| -rw-r--r-- | kernel/rcutree_plugin.h | 14 | ||||
| -rw-r--r-- | kernel/sched/core.c | 1 |
8 files changed, 19 insertions, 16 deletions
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index 88e466b159dc..43b39d61b538 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
| @@ -705,7 +705,6 @@ static void stack_proc(void *arg) | |||
| 705 | struct task_struct *from = current, *to = arg; | 705 | struct task_struct *from = current, *to = arg; |
| 706 | 706 | ||
| 707 | to->thread.saved_task = from; | 707 | to->thread.saved_task = from; |
| 708 | rcu_switch_from(from); | ||
| 709 | switch_to(from, to, from); | 708 | switch_to(from, to, from); |
| 710 | } | 709 | } |
| 711 | 710 | ||
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 26d1a47591f1..9cac722b169c 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
| @@ -184,7 +184,6 @@ static inline int rcu_preempt_depth(void) | |||
| 184 | /* Internal to kernel */ | 184 | /* Internal to kernel */ |
| 185 | extern void rcu_sched_qs(int cpu); | 185 | extern void rcu_sched_qs(int cpu); |
| 186 | extern void rcu_bh_qs(int cpu); | 186 | extern void rcu_bh_qs(int cpu); |
| 187 | extern void rcu_preempt_note_context_switch(void); | ||
| 188 | extern void rcu_check_callbacks(int cpu, int user); | 187 | extern void rcu_check_callbacks(int cpu, int user); |
| 189 | struct notifier_block; | 188 | struct notifier_block; |
| 190 | extern void rcu_idle_enter(void); | 189 | extern void rcu_idle_enter(void); |
diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h index 854dc4c5c271..4e56a9c69a35 100644 --- a/include/linux/rcutiny.h +++ b/include/linux/rcutiny.h | |||
| @@ -87,6 +87,10 @@ static inline void kfree_call_rcu(struct rcu_head *head, | |||
| 87 | 87 | ||
| 88 | #ifdef CONFIG_TINY_RCU | 88 | #ifdef CONFIG_TINY_RCU |
| 89 | 89 | ||
| 90 | static inline void rcu_preempt_note_context_switch(void) | ||
| 91 | { | ||
| 92 | } | ||
| 93 | |||
| 90 | static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) | 94 | static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) |
| 91 | { | 95 | { |
| 92 | *delta_jiffies = ULONG_MAX; | 96 | *delta_jiffies = ULONG_MAX; |
| @@ -95,6 +99,7 @@ static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) | |||
| 95 | 99 | ||
| 96 | #else /* #ifdef CONFIG_TINY_RCU */ | 100 | #else /* #ifdef CONFIG_TINY_RCU */ |
| 97 | 101 | ||
| 102 | void rcu_preempt_note_context_switch(void); | ||
| 98 | int rcu_preempt_needs_cpu(void); | 103 | int rcu_preempt_needs_cpu(void); |
| 99 | 104 | ||
| 100 | static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) | 105 | static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) |
| @@ -108,6 +113,7 @@ static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) | |||
| 108 | static inline void rcu_note_context_switch(int cpu) | 113 | static inline void rcu_note_context_switch(int cpu) |
| 109 | { | 114 | { |
| 110 | rcu_sched_qs(cpu); | 115 | rcu_sched_qs(cpu); |
| 116 | rcu_preempt_note_context_switch(); | ||
| 111 | } | 117 | } |
| 112 | 118 | ||
| 113 | /* | 119 | /* |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 4059c0f33f07..06a4c5f4f55c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1871,22 +1871,12 @@ static inline void rcu_copy_process(struct task_struct *p) | |||
| 1871 | INIT_LIST_HEAD(&p->rcu_node_entry); | 1871 | INIT_LIST_HEAD(&p->rcu_node_entry); |
| 1872 | } | 1872 | } |
| 1873 | 1873 | ||
| 1874 | static inline void rcu_switch_from(struct task_struct *prev) | ||
| 1875 | { | ||
| 1876 | if (prev->rcu_read_lock_nesting != 0) | ||
| 1877 | rcu_preempt_note_context_switch(); | ||
| 1878 | } | ||
| 1879 | |||
| 1880 | #else | 1874 | #else |
| 1881 | 1875 | ||
| 1882 | static inline void rcu_copy_process(struct task_struct *p) | 1876 | static inline void rcu_copy_process(struct task_struct *p) |
| 1883 | { | 1877 | { |
| 1884 | } | 1878 | } |
| 1885 | 1879 | ||
| 1886 | static inline void rcu_switch_from(struct task_struct *prev) | ||
| 1887 | { | ||
| 1888 | } | ||
| 1889 | |||
| 1890 | #endif | 1880 | #endif |
| 1891 | 1881 | ||
| 1892 | #ifdef CONFIG_SMP | 1882 | #ifdef CONFIG_SMP |
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 38ecdda3f55f..4b97bba7396e 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
| @@ -201,6 +201,7 @@ void rcu_note_context_switch(int cpu) | |||
| 201 | { | 201 | { |
| 202 | trace_rcu_utilization("Start context switch"); | 202 | trace_rcu_utilization("Start context switch"); |
| 203 | rcu_sched_qs(cpu); | 203 | rcu_sched_qs(cpu); |
| 204 | rcu_preempt_note_context_switch(cpu); | ||
| 204 | trace_rcu_utilization("End context switch"); | 205 | trace_rcu_utilization("End context switch"); |
| 205 | } | 206 | } |
| 206 | EXPORT_SYMBOL_GPL(rcu_note_context_switch); | 207 | EXPORT_SYMBOL_GPL(rcu_note_context_switch); |
diff --git a/kernel/rcutree.h b/kernel/rcutree.h index ea056495783e..19b61ac1079f 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h | |||
| @@ -444,6 +444,7 @@ DECLARE_PER_CPU(char, rcu_cpu_has_work); | |||
| 444 | /* Forward declarations for rcutree_plugin.h */ | 444 | /* Forward declarations for rcutree_plugin.h */ |
| 445 | static void rcu_bootup_announce(void); | 445 | static void rcu_bootup_announce(void); |
| 446 | long rcu_batches_completed(void); | 446 | long rcu_batches_completed(void); |
| 447 | static void rcu_preempt_note_context_switch(int cpu); | ||
| 447 | static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp); | 448 | static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp); |
| 448 | #ifdef CONFIG_HOTPLUG_CPU | 449 | #ifdef CONFIG_HOTPLUG_CPU |
| 449 | static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, | 450 | static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, |
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index 5271a020887e..3e4899459f3d 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
| @@ -153,7 +153,7 @@ static void rcu_preempt_qs(int cpu) | |||
| 153 | * | 153 | * |
| 154 | * Caller must disable preemption. | 154 | * Caller must disable preemption. |
| 155 | */ | 155 | */ |
| 156 | void rcu_preempt_note_context_switch(void) | 156 | static void rcu_preempt_note_context_switch(int cpu) |
| 157 | { | 157 | { |
| 158 | struct task_struct *t = current; | 158 | struct task_struct *t = current; |
| 159 | unsigned long flags; | 159 | unsigned long flags; |
| @@ -164,7 +164,7 @@ void rcu_preempt_note_context_switch(void) | |||
| 164 | (t->rcu_read_unlock_special & RCU_READ_UNLOCK_BLOCKED) == 0) { | 164 | (t->rcu_read_unlock_special & RCU_READ_UNLOCK_BLOCKED) == 0) { |
| 165 | 165 | ||
| 166 | /* Possibly blocking in an RCU read-side critical section. */ | 166 | /* Possibly blocking in an RCU read-side critical section. */ |
| 167 | rdp = __this_cpu_ptr(rcu_preempt_state.rda); | 167 | rdp = per_cpu_ptr(rcu_preempt_state.rda, cpu); |
| 168 | rnp = rdp->mynode; | 168 | rnp = rdp->mynode; |
| 169 | raw_spin_lock_irqsave(&rnp->lock, flags); | 169 | raw_spin_lock_irqsave(&rnp->lock, flags); |
| 170 | t->rcu_read_unlock_special |= RCU_READ_UNLOCK_BLOCKED; | 170 | t->rcu_read_unlock_special |= RCU_READ_UNLOCK_BLOCKED; |
| @@ -228,7 +228,7 @@ void rcu_preempt_note_context_switch(void) | |||
| 228 | * means that we continue to block the current grace period. | 228 | * means that we continue to block the current grace period. |
| 229 | */ | 229 | */ |
| 230 | local_irq_save(flags); | 230 | local_irq_save(flags); |
| 231 | rcu_preempt_qs(smp_processor_id()); | 231 | rcu_preempt_qs(cpu); |
| 232 | local_irq_restore(flags); | 232 | local_irq_restore(flags); |
| 233 | } | 233 | } |
| 234 | 234 | ||
| @@ -1002,6 +1002,14 @@ void rcu_force_quiescent_state(void) | |||
| 1002 | EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); | 1002 | EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); |
| 1003 | 1003 | ||
| 1004 | /* | 1004 | /* |
| 1005 | * Because preemptible RCU does not exist, we never have to check for | ||
| 1006 | * CPUs being in quiescent states. | ||
| 1007 | */ | ||
| 1008 | static void rcu_preempt_note_context_switch(int cpu) | ||
| 1009 | { | ||
| 1010 | } | ||
| 1011 | |||
| 1012 | /* | ||
| 1005 | * Because preemptible RCU does not exist, there are never any preempted | 1013 | * Because preemptible RCU does not exist, there are never any preempted |
| 1006 | * RCU readers. | 1014 | * RCU readers. |
| 1007 | */ | 1015 | */ |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index d5594a4268d4..eaead2df6aa8 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -2081,7 +2081,6 @@ context_switch(struct rq *rq, struct task_struct *prev, | |||
| 2081 | #endif | 2081 | #endif |
| 2082 | 2082 | ||
| 2083 | /* Here we just switch the register state and the stack. */ | 2083 | /* Here we just switch the register state and the stack. */ |
| 2084 | rcu_switch_from(prev); | ||
| 2085 | switch_to(prev, next, prev); | 2084 | switch_to(prev, next, prev); |
| 2086 | 2085 | ||
| 2087 | barrier(); | 2086 | barrier(); |
