diff options
| author | Ingo Molnar <mingo@elte.hu> | 2011-01-14 09:30:16 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2011-01-14 09:30:16 -0500 |
| commit | 1161ec944916069ceec21c487e30247d9ff22857 (patch) | |
| tree | 741385cbfde51286f502790cdfb77b1af2953944 /kernel | |
| parent | f123c98e7f168e949b283690693695f988332c3d (diff) | |
| parent | b24efdfdf679cf9b05947c531971905fc727dd40 (diff) | |
Merge branch 'rcu/next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-2.6-rcu into core/urgent
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/rcutiny.c | 3 | ||||
| -rw-r--r-- | kernel/srcu.c | 15 |
2 files changed, 15 insertions, 3 deletions
diff --git a/kernel/rcutiny.c b/kernel/rcutiny.c index 034493724749..0c343b9a46d5 100644 --- a/kernel/rcutiny.c +++ b/kernel/rcutiny.c | |||
| @@ -189,7 +189,8 @@ static int rcu_kthread(void *arg) | |||
| 189 | unsigned long flags; | 189 | unsigned long flags; |
| 190 | 190 | ||
| 191 | for (;;) { | 191 | for (;;) { |
| 192 | wait_event(rcu_kthread_wq, have_rcu_kthread_work != 0); | 192 | wait_event_interruptible(rcu_kthread_wq, |
| 193 | have_rcu_kthread_work != 0); | ||
| 193 | morework = rcu_boost(); | 194 | morework = rcu_boost(); |
| 194 | local_irq_save(flags); | 195 | local_irq_save(flags); |
| 195 | work = have_rcu_kthread_work; | 196 | work = have_rcu_kthread_work; |
diff --git a/kernel/srcu.c b/kernel/srcu.c index 98d8c1e80edb..73ce23feaea9 100644 --- a/kernel/srcu.c +++ b/kernel/srcu.c | |||
| @@ -156,6 +156,16 @@ void __srcu_read_unlock(struct srcu_struct *sp, int idx) | |||
| 156 | EXPORT_SYMBOL_GPL(__srcu_read_unlock); | 156 | EXPORT_SYMBOL_GPL(__srcu_read_unlock); |
| 157 | 157 | ||
| 158 | /* | 158 | /* |
| 159 | * We use an adaptive strategy for synchronize_srcu() and especially for | ||
| 160 | * synchronize_srcu_expedited(). We spin for a fixed time period | ||
| 161 | * (defined below) to allow SRCU readers to exit their read-side critical | ||
| 162 | * sections. If there are still some readers after 10 microseconds, | ||
| 163 | * we repeatedly block for 1-millisecond time periods. This approach | ||
| 164 | * has done well in testing, so there is no need for a config parameter. | ||
| 165 | */ | ||
| 166 | #define SYNCHRONIZE_SRCU_READER_DELAY 10 | ||
| 167 | |||
| 168 | /* | ||
| 159 | * Helper function for synchronize_srcu() and synchronize_srcu_expedited(). | 169 | * Helper function for synchronize_srcu() and synchronize_srcu_expedited(). |
| 160 | */ | 170 | */ |
| 161 | static void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) | 171 | static void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) |
| @@ -207,11 +217,12 @@ static void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) | |||
| 207 | * will have finished executing. We initially give readers | 217 | * will have finished executing. We initially give readers |
| 208 | * an arbitrarily chosen 10 microseconds to get out of their | 218 | * an arbitrarily chosen 10 microseconds to get out of their |
| 209 | * SRCU read-side critical sections, then loop waiting 1/HZ | 219 | * SRCU read-side critical sections, then loop waiting 1/HZ |
| 210 | * seconds per iteration. | 220 | * seconds per iteration. The 10-microsecond value has done |
| 221 | * very well in testing. | ||
| 211 | */ | 222 | */ |
| 212 | 223 | ||
| 213 | if (srcu_readers_active_idx(sp, idx)) | 224 | if (srcu_readers_active_idx(sp, idx)) |
| 214 | udelay(CONFIG_SRCU_SYNCHRONIZE_DELAY); | 225 | udelay(SYNCHRONIZE_SRCU_READER_DELAY); |
| 215 | while (srcu_readers_active_idx(sp, idx)) | 226 | while (srcu_readers_active_idx(sp, idx)) |
| 216 | schedule_timeout_interruptible(1); | 227 | schedule_timeout_interruptible(1); |
| 217 | 228 | ||
