diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-16 20:56:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-16 20:56:39 -0400 |
commit | 4d831f53ddd5c0117ff40f841cf330c78d242e82 (patch) | |
tree | 29bca9f045f22af41a7a059afba85f5eb74ab267 /kernel | |
parent | 20d9207849d5abe60461841b3c3724f6e7c9d33e (diff) | |
parent | 79d381c9f2354b594dcab9b04dfcc0debf7294fe (diff) |
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
kernel/softirq.c: fix sparse warning
rcu: Make hierarchical RCU less IPI-happy
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rcutree.c | 19 | ||||
-rw-r--r-- | kernel/rcutree_trace.c | 14 | ||||
-rw-r--r-- | kernel/softirq.c | 4 |
3 files changed, 11 insertions, 26 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 7f3266922572..d2a372fb0b9b 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -530,8 +530,6 @@ static void note_new_gpnum(struct rcu_state *rsp, struct rcu_data *rdp) | |||
530 | rdp->qs_pending = 1; | 530 | rdp->qs_pending = 1; |
531 | rdp->passed_quiesc = 0; | 531 | rdp->passed_quiesc = 0; |
532 | rdp->gpnum = rsp->gpnum; | 532 | rdp->gpnum = rsp->gpnum; |
533 | rdp->n_rcu_pending_force_qs = rdp->n_rcu_pending + | ||
534 | RCU_JIFFIES_TILL_FORCE_QS; | ||
535 | } | 533 | } |
536 | 534 | ||
537 | /* | 535 | /* |
@@ -578,8 +576,6 @@ rcu_start_gp(struct rcu_state *rsp, unsigned long flags) | |||
578 | rsp->gpnum++; | 576 | rsp->gpnum++; |
579 | rsp->signaled = RCU_GP_INIT; /* Hold off force_quiescent_state. */ | 577 | rsp->signaled = RCU_GP_INIT; /* Hold off force_quiescent_state. */ |
580 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; | 578 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; |
581 | rdp->n_rcu_pending_force_qs = rdp->n_rcu_pending + | ||
582 | RCU_JIFFIES_TILL_FORCE_QS; | ||
583 | record_gp_stall_check_time(rsp); | 579 | record_gp_stall_check_time(rsp); |
584 | dyntick_record_completed(rsp, rsp->completed - 1); | 580 | dyntick_record_completed(rsp, rsp->completed - 1); |
585 | note_new_gpnum(rsp, rdp); | 581 | note_new_gpnum(rsp, rdp); |
@@ -1055,7 +1051,6 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
1055 | { | 1051 | { |
1056 | unsigned long flags; | 1052 | unsigned long flags; |
1057 | long lastcomp; | 1053 | long lastcomp; |
1058 | struct rcu_data *rdp = rsp->rda[smp_processor_id()]; | ||
1059 | struct rcu_node *rnp = rcu_get_root(rsp); | 1054 | struct rcu_node *rnp = rcu_get_root(rsp); |
1060 | u8 signaled; | 1055 | u8 signaled; |
1061 | 1056 | ||
@@ -1066,16 +1061,13 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
1066 | return; /* Someone else is already on the job. */ | 1061 | return; /* Someone else is already on the job. */ |
1067 | } | 1062 | } |
1068 | if (relaxed && | 1063 | if (relaxed && |
1069 | (long)(rsp->jiffies_force_qs - jiffies) >= 0 && | 1064 | (long)(rsp->jiffies_force_qs - jiffies) >= 0) |
1070 | (rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending) >= 0) | ||
1071 | goto unlock_ret; /* no emergency and done recently. */ | 1065 | goto unlock_ret; /* no emergency and done recently. */ |
1072 | rsp->n_force_qs++; | 1066 | rsp->n_force_qs++; |
1073 | spin_lock(&rnp->lock); | 1067 | spin_lock(&rnp->lock); |
1074 | lastcomp = rsp->completed; | 1068 | lastcomp = rsp->completed; |
1075 | signaled = rsp->signaled; | 1069 | signaled = rsp->signaled; |
1076 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; | 1070 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; |
1077 | rdp->n_rcu_pending_force_qs = rdp->n_rcu_pending + | ||
1078 | RCU_JIFFIES_TILL_FORCE_QS; | ||
1079 | if (lastcomp == rsp->gpnum) { | 1071 | if (lastcomp == rsp->gpnum) { |
1080 | rsp->n_force_qs_ngp++; | 1072 | rsp->n_force_qs_ngp++; |
1081 | spin_unlock(&rnp->lock); | 1073 | spin_unlock(&rnp->lock); |
@@ -1144,8 +1136,7 @@ __rcu_process_callbacks(struct rcu_state *rsp, struct rcu_data *rdp) | |||
1144 | * If an RCU GP has gone long enough, go check for dyntick | 1136 | * If an RCU GP has gone long enough, go check for dyntick |
1145 | * idle CPUs and, if needed, send resched IPIs. | 1137 | * idle CPUs and, if needed, send resched IPIs. |
1146 | */ | 1138 | */ |
1147 | if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0 || | 1139 | if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0) |
1148 | (rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending) < 0) | ||
1149 | force_quiescent_state(rsp, 1); | 1140 | force_quiescent_state(rsp, 1); |
1150 | 1141 | ||
1151 | /* | 1142 | /* |
@@ -1230,8 +1221,7 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu), | |||
1230 | if (unlikely(++rdp->qlen > qhimark)) { | 1221 | if (unlikely(++rdp->qlen > qhimark)) { |
1231 | rdp->blimit = LONG_MAX; | 1222 | rdp->blimit = LONG_MAX; |
1232 | force_quiescent_state(rsp, 0); | 1223 | force_quiescent_state(rsp, 0); |
1233 | } else if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0 || | 1224 | } else if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0) |
1234 | (rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending) < 0) | ||
1235 | force_quiescent_state(rsp, 1); | 1225 | force_quiescent_state(rsp, 1); |
1236 | local_irq_restore(flags); | 1226 | local_irq_restore(flags); |
1237 | } | 1227 | } |
@@ -1290,8 +1280,7 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) | |||
1290 | 1280 | ||
1291 | /* Has an RCU GP gone long enough to send resched IPIs &c? */ | 1281 | /* Has an RCU GP gone long enough to send resched IPIs &c? */ |
1292 | if (ACCESS_ONCE(rsp->completed) != ACCESS_ONCE(rsp->gpnum) && | 1282 | if (ACCESS_ONCE(rsp->completed) != ACCESS_ONCE(rsp->gpnum) && |
1293 | ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0 || | 1283 | ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0)) |
1294 | (rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending) < 0)) | ||
1295 | return 1; | 1284 | return 1; |
1296 | 1285 | ||
1297 | /* nothing to do */ | 1286 | /* nothing to do */ |
diff --git a/kernel/rcutree_trace.c b/kernel/rcutree_trace.c index 4ee954f6a8d5..4b1875ba9404 100644 --- a/kernel/rcutree_trace.c +++ b/kernel/rcutree_trace.c | |||
@@ -49,14 +49,12 @@ static void print_one_rcu_data(struct seq_file *m, struct rcu_data *rdp) | |||
49 | { | 49 | { |
50 | if (!rdp->beenonline) | 50 | if (!rdp->beenonline) |
51 | return; | 51 | return; |
52 | seq_printf(m, "%3d%cc=%ld g=%ld pq=%d pqc=%ld qp=%d rpfq=%ld rp=%x", | 52 | seq_printf(m, "%3d%cc=%ld g=%ld pq=%d pqc=%ld qp=%d", |
53 | rdp->cpu, | 53 | rdp->cpu, |
54 | cpu_is_offline(rdp->cpu) ? '!' : ' ', | 54 | cpu_is_offline(rdp->cpu) ? '!' : ' ', |
55 | rdp->completed, rdp->gpnum, | 55 | rdp->completed, rdp->gpnum, |
56 | rdp->passed_quiesc, rdp->passed_quiesc_completed, | 56 | rdp->passed_quiesc, rdp->passed_quiesc_completed, |
57 | rdp->qs_pending, | 57 | rdp->qs_pending); |
58 | rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending, | ||
59 | (int)(rdp->n_rcu_pending & 0xffff)); | ||
60 | #ifdef CONFIG_NO_HZ | 58 | #ifdef CONFIG_NO_HZ |
61 | seq_printf(m, " dt=%d/%d dn=%d df=%lu", | 59 | seq_printf(m, " dt=%d/%d dn=%d df=%lu", |
62 | rdp->dynticks->dynticks, | 60 | rdp->dynticks->dynticks, |
@@ -102,14 +100,12 @@ static void print_one_rcu_data_csv(struct seq_file *m, struct rcu_data *rdp) | |||
102 | { | 100 | { |
103 | if (!rdp->beenonline) | 101 | if (!rdp->beenonline) |
104 | return; | 102 | return; |
105 | seq_printf(m, "%d,%s,%ld,%ld,%d,%ld,%d,%ld,%ld", | 103 | seq_printf(m, "%d,%s,%ld,%ld,%d,%ld,%d", |
106 | rdp->cpu, | 104 | rdp->cpu, |
107 | cpu_is_offline(rdp->cpu) ? "\"Y\"" : "\"N\"", | 105 | cpu_is_offline(rdp->cpu) ? "\"Y\"" : "\"N\"", |
108 | rdp->completed, rdp->gpnum, | 106 | rdp->completed, rdp->gpnum, |
109 | rdp->passed_quiesc, rdp->passed_quiesc_completed, | 107 | rdp->passed_quiesc, rdp->passed_quiesc_completed, |
110 | rdp->qs_pending, | 108 | rdp->qs_pending); |
111 | rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending, | ||
112 | rdp->n_rcu_pending); | ||
113 | #ifdef CONFIG_NO_HZ | 109 | #ifdef CONFIG_NO_HZ |
114 | seq_printf(m, ",%d,%d,%d,%lu", | 110 | seq_printf(m, ",%d,%d,%d,%lu", |
115 | rdp->dynticks->dynticks, | 111 | rdp->dynticks->dynticks, |
@@ -123,7 +119,7 @@ static void print_one_rcu_data_csv(struct seq_file *m, struct rcu_data *rdp) | |||
123 | 119 | ||
124 | static int show_rcudata_csv(struct seq_file *m, void *unused) | 120 | static int show_rcudata_csv(struct seq_file *m, void *unused) |
125 | { | 121 | { |
126 | seq_puts(m, "\"CPU\",\"Online?\",\"c\",\"g\",\"pq\",\"pqc\",\"pq\",\"rpfq\",\"rp\","); | 122 | seq_puts(m, "\"CPU\",\"Online?\",\"c\",\"g\",\"pq\",\"pqc\",\"pq\","); |
127 | #ifdef CONFIG_NO_HZ | 123 | #ifdef CONFIG_NO_HZ |
128 | seq_puts(m, "\"dt\",\"dt nesting\",\"dn\",\"df\","); | 124 | seq_puts(m, "\"dt\",\"dt nesting\",\"dn\",\"df\","); |
129 | #endif /* #ifdef CONFIG_NO_HZ */ | 125 | #endif /* #ifdef CONFIG_NO_HZ */ |
diff --git a/kernel/softirq.c b/kernel/softirq.c index 2fecefacdc5b..b525dd348511 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -472,9 +472,9 @@ void tasklet_kill(struct tasklet_struct *t) | |||
472 | printk("Attempt to kill tasklet from interrupt\n"); | 472 | printk("Attempt to kill tasklet from interrupt\n"); |
473 | 473 | ||
474 | while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { | 474 | while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { |
475 | do | 475 | do { |
476 | yield(); | 476 | yield(); |
477 | while (test_bit(TASKLET_STATE_SCHED, &t->state)); | 477 | } while (test_bit(TASKLET_STATE_SCHED, &t->state)); |
478 | } | 478 | } |
479 | tasklet_unlock_wait(t); | 479 | tasklet_unlock_wait(t); |
480 | clear_bit(TASKLET_STATE_SCHED, &t->state); | 480 | clear_bit(TASKLET_STATE_SCHED, &t->state); |