X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fpercpu_counter.c;h=393a0e915c23b252b747c62645beb463e25843ed;hb=69a2ce72a4efe0653479a5d69fc86b5726e83219;hp=3a59d84b2d1e14ef96c4ef6f51e939cdc88e574c;hpb=833f4077bf7c2dcff6e31526e03ec2ad91c88581;p=linux-2.6 diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c index 3a59d84b2d..393a0e915c 100644 --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c @@ -68,6 +68,8 @@ s64 __percpu_counter_sum(struct percpu_counter *fbc) } EXPORT_SYMBOL(__percpu_counter_sum); +static struct lock_class_key percpu_counter_irqsafe; + int percpu_counter_init(struct percpu_counter *fbc, s64 amount) { spin_lock_init(&fbc->lock); @@ -84,6 +86,16 @@ int percpu_counter_init(struct percpu_counter *fbc, s64 amount) } EXPORT_SYMBOL(percpu_counter_init); +int percpu_counter_init_irq(struct percpu_counter *fbc, s64 amount) +{ + int err; + + err = percpu_counter_init(fbc, amount); + if (!err) + lockdep_set_class(&fbc->lock, &percpu_counter_irqsafe); + return err; +} + void percpu_counter_destroy(struct percpu_counter *fbc) { if (!fbc->counters) @@ -112,12 +124,13 @@ static int __cpuinit percpu_counter_hotcpu_callback(struct notifier_block *nb, mutex_lock(&percpu_counters_lock); list_for_each_entry(fbc, &percpu_counters, list) { s32 *pcount; + unsigned long flags; - spin_lock(&fbc->lock); + spin_lock_irqsave(&fbc->lock, flags); pcount = per_cpu_ptr(fbc->counters, cpu); fbc->count += *pcount; *pcount = 0; - spin_unlock(&fbc->lock); + spin_unlock_irqrestore(&fbc->lock, flags); } mutex_unlock(&percpu_counters_lock); return NOTIFY_OK;