diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-15 12:02:01 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-15 12:02:01 -0500 |
commit | 8f0ddf91f2aeb09602373e400cf8b403e9017210 (patch) | |
tree | b907c35c79caadafff6ad46a91614e30afd2f967 /kernel/smp.c | |
parent | 050cbb09dac0402672edeaeac06094ef8ff1749a (diff) | |
parent | b5f91da0a6973bb6f9ff3b91b0e92c0773a458f3 (diff) |
Merge branch 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (26 commits)
clockevents: Convert to raw_spinlock
clockevents: Make tick_device_lock static
debugobjects: Convert to raw_spinlocks
perf_event: Convert to raw_spinlock
hrtimers: Convert to raw_spinlocks
genirq: Convert irq_desc.lock to raw_spinlock
smp: Convert smplocks to raw_spinlocks
rtmutes: Convert rtmutex.lock to raw_spinlock
sched: Convert pi_lock to raw_spinlock
sched: Convert cpupri lock to raw_spinlock
sched: Convert rt_runtime_lock to raw_spinlock
sched: Convert rq->lock to raw_spinlock
plist: Make plist debugging raw_spinlock aware
bkl: Fixup core_lock fallout
locking: Cleanup the name space completely
locking: Further name space cleanups
alpha: Fix fallout from locking changes
locking: Implement new raw_spinlock
locking: Convert raw_rwlock functions to arch_rwlock
locking: Convert raw_rwlock to arch_rwlock
...
Diffstat (limited to 'kernel/smp.c')
-rw-r--r-- | kernel/smp.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/kernel/smp.c b/kernel/smp.c index 00a1d0ede532..de735a6637d0 100644 --- a/kernel/smp.c +++ b/kernel/smp.c | |||
@@ -16,11 +16,11 @@ static DEFINE_PER_CPU(struct call_single_queue, call_single_queue); | |||
16 | 16 | ||
17 | static struct { | 17 | static struct { |
18 | struct list_head queue; | 18 | struct list_head queue; |
19 | spinlock_t lock; | 19 | raw_spinlock_t lock; |
20 | } call_function __cacheline_aligned_in_smp = | 20 | } call_function __cacheline_aligned_in_smp = |
21 | { | 21 | { |
22 | .queue = LIST_HEAD_INIT(call_function.queue), | 22 | .queue = LIST_HEAD_INIT(call_function.queue), |
23 | .lock = __SPIN_LOCK_UNLOCKED(call_function.lock), | 23 | .lock = __RAW_SPIN_LOCK_UNLOCKED(call_function.lock), |
24 | }; | 24 | }; |
25 | 25 | ||
26 | enum { | 26 | enum { |
@@ -35,7 +35,7 @@ struct call_function_data { | |||
35 | 35 | ||
36 | struct call_single_queue { | 36 | struct call_single_queue { |
37 | struct list_head list; | 37 | struct list_head list; |
38 | spinlock_t lock; | 38 | raw_spinlock_t lock; |
39 | }; | 39 | }; |
40 | 40 | ||
41 | static DEFINE_PER_CPU(struct call_function_data, cfd_data); | 41 | static DEFINE_PER_CPU(struct call_function_data, cfd_data); |
@@ -80,7 +80,7 @@ static int __cpuinit init_call_single_data(void) | |||
80 | for_each_possible_cpu(i) { | 80 | for_each_possible_cpu(i) { |
81 | struct call_single_queue *q = &per_cpu(call_single_queue, i); | 81 | struct call_single_queue *q = &per_cpu(call_single_queue, i); |
82 | 82 | ||
83 | spin_lock_init(&q->lock); | 83 | raw_spin_lock_init(&q->lock); |
84 | INIT_LIST_HEAD(&q->list); | 84 | INIT_LIST_HEAD(&q->list); |
85 | } | 85 | } |
86 | 86 | ||
@@ -141,10 +141,10 @@ void generic_exec_single(int cpu, struct call_single_data *data, int wait) | |||
141 | unsigned long flags; | 141 | unsigned long flags; |
142 | int ipi; | 142 | int ipi; |
143 | 143 | ||
144 | spin_lock_irqsave(&dst->lock, flags); | 144 | raw_spin_lock_irqsave(&dst->lock, flags); |
145 | ipi = list_empty(&dst->list); | 145 | ipi = list_empty(&dst->list); |
146 | list_add_tail(&data->list, &dst->list); | 146 | list_add_tail(&data->list, &dst->list); |
147 | spin_unlock_irqrestore(&dst->lock, flags); | 147 | raw_spin_unlock_irqrestore(&dst->lock, flags); |
148 | 148 | ||
149 | /* | 149 | /* |
150 | * The list addition should be visible before sending the IPI | 150 | * The list addition should be visible before sending the IPI |
@@ -201,9 +201,9 @@ void generic_smp_call_function_interrupt(void) | |||
201 | refs = atomic_dec_return(&data->refs); | 201 | refs = atomic_dec_return(&data->refs); |
202 | WARN_ON(refs < 0); | 202 | WARN_ON(refs < 0); |
203 | if (!refs) { | 203 | if (!refs) { |
204 | spin_lock(&call_function.lock); | 204 | raw_spin_lock(&call_function.lock); |
205 | list_del_rcu(&data->csd.list); | 205 | list_del_rcu(&data->csd.list); |
206 | spin_unlock(&call_function.lock); | 206 | raw_spin_unlock(&call_function.lock); |
207 | } | 207 | } |
208 | 208 | ||
209 | if (refs) | 209 | if (refs) |
@@ -229,9 +229,9 @@ void generic_smp_call_function_single_interrupt(void) | |||
229 | */ | 229 | */ |
230 | WARN_ON_ONCE(!cpu_online(smp_processor_id())); | 230 | WARN_ON_ONCE(!cpu_online(smp_processor_id())); |
231 | 231 | ||
232 | spin_lock(&q->lock); | 232 | raw_spin_lock(&q->lock); |
233 | list_replace_init(&q->list, &list); | 233 | list_replace_init(&q->list, &list); |
234 | spin_unlock(&q->lock); | 234 | raw_spin_unlock(&q->lock); |
235 | 235 | ||
236 | while (!list_empty(&list)) { | 236 | while (!list_empty(&list)) { |
237 | struct call_single_data *data; | 237 | struct call_single_data *data; |
@@ -448,14 +448,14 @@ void smp_call_function_many(const struct cpumask *mask, | |||
448 | cpumask_clear_cpu(this_cpu, data->cpumask); | 448 | cpumask_clear_cpu(this_cpu, data->cpumask); |
449 | atomic_set(&data->refs, cpumask_weight(data->cpumask)); | 449 | atomic_set(&data->refs, cpumask_weight(data->cpumask)); |
450 | 450 | ||
451 | spin_lock_irqsave(&call_function.lock, flags); | 451 | raw_spin_lock_irqsave(&call_function.lock, flags); |
452 | /* | 452 | /* |
453 | * Place entry at the _HEAD_ of the list, so that any cpu still | 453 | * Place entry at the _HEAD_ of the list, so that any cpu still |
454 | * observing the entry in generic_smp_call_function_interrupt() | 454 | * observing the entry in generic_smp_call_function_interrupt() |
455 | * will not miss any other list entries: | 455 | * will not miss any other list entries: |
456 | */ | 456 | */ |
457 | list_add_rcu(&data->csd.list, &call_function.queue); | 457 | list_add_rcu(&data->csd.list, &call_function.queue); |
458 | spin_unlock_irqrestore(&call_function.lock, flags); | 458 | raw_spin_unlock_irqrestore(&call_function.lock, flags); |
459 | 459 | ||
460 | /* | 460 | /* |
461 | * Make the list addition visible before sending the ipi. | 461 | * Make the list addition visible before sending the ipi. |
@@ -500,20 +500,20 @@ EXPORT_SYMBOL(smp_call_function); | |||
500 | 500 | ||
501 | void ipi_call_lock(void) | 501 | void ipi_call_lock(void) |
502 | { | 502 | { |
503 | spin_lock(&call_function.lock); | 503 | raw_spin_lock(&call_function.lock); |
504 | } | 504 | } |
505 | 505 | ||
506 | void ipi_call_unlock(void) | 506 | void ipi_call_unlock(void) |
507 | { | 507 | { |
508 | spin_unlock(&call_function.lock); | 508 | raw_spin_unlock(&call_function.lock); |
509 | } | 509 | } |
510 | 510 | ||
511 | void ipi_call_lock_irq(void) | 511 | void ipi_call_lock_irq(void) |
512 | { | 512 | { |
513 | spin_lock_irq(&call_function.lock); | 513 | raw_spin_lock_irq(&call_function.lock); |
514 | } | 514 | } |
515 | 515 | ||
516 | void ipi_call_unlock_irq(void) | 516 | void ipi_call_unlock_irq(void) |
517 | { | 517 | { |
518 | spin_unlock_irq(&call_function.lock); | 518 | raw_spin_unlock_irq(&call_function.lock); |
519 | } | 519 | } |