Commit 1014cfe2 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'core-locking-for-linus' of...

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:
  lockdep: Reduce stack_trace usage
  lockdep: No need to disable preemption in debug atomic ops
  lockdep: Actually _dec_ in debug_atomic_dec
  lockdep: Provide off case for redundant_hardirqs_on increment
  lockdep: Simplify debug atomic ops
  lockdep: Fix redundant_hardirqs_on incremented with irqs enabled
  lockstat: Make lockstat counting per cpu
  i8253: Convert i8253_lock to raw_spinlock
parents 8123d8f1 4726f2a6
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#define PIT_CH0 0x40 #define PIT_CH0 0x40
#define PIT_CH2 0x42 #define PIT_CH2 0x42
extern spinlock_t i8253_lock; extern raw_spinlock_t i8253_lock;
extern void setup_pit_timer(void); extern void setup_pit_timer(void);
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/time.h> #include <asm/time.h>
DEFINE_SPINLOCK(i8253_lock); DEFINE_RAW_SPINLOCK(i8253_lock);
EXPORT_SYMBOL(i8253_lock); EXPORT_SYMBOL(i8253_lock);
/* /*
...@@ -26,7 +26,7 @@ EXPORT_SYMBOL(i8253_lock); ...@@ -26,7 +26,7 @@ EXPORT_SYMBOL(i8253_lock);
static void init_pit_timer(enum clock_event_mode mode, static void init_pit_timer(enum clock_event_mode mode,
struct clock_event_device *evt) struct clock_event_device *evt)
{ {
spin_lock(&i8253_lock); raw_spin_lock(&i8253_lock);
switch(mode) { switch(mode) {
case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_PERIODIC:
...@@ -55,7 +55,7 @@ static void init_pit_timer(enum clock_event_mode mode, ...@@ -55,7 +55,7 @@ static void init_pit_timer(enum clock_event_mode mode,
/* Nothing to do here */ /* Nothing to do here */
break; break;
} }
spin_unlock(&i8253_lock); raw_spin_unlock(&i8253_lock);
} }
/* /*
...@@ -65,10 +65,10 @@ static void init_pit_timer(enum clock_event_mode mode, ...@@ -65,10 +65,10 @@ static void init_pit_timer(enum clock_event_mode mode,
*/ */
static int pit_next_event(unsigned long delta, struct clock_event_device *evt) static int pit_next_event(unsigned long delta, struct clock_event_device *evt)
{ {
spin_lock(&i8253_lock); raw_spin_lock(&i8253_lock);
outb_p(delta & 0xff , PIT_CH0); /* LSB */ outb_p(delta & 0xff , PIT_CH0); /* LSB */
outb(delta >> 8 , PIT_CH0); /* MSB */ outb(delta >> 8 , PIT_CH0); /* MSB */
spin_unlock(&i8253_lock); raw_spin_unlock(&i8253_lock);
return 0; return 0;
} }
...@@ -137,7 +137,7 @@ static cycle_t pit_read(struct clocksource *cs) ...@@ -137,7 +137,7 @@ static cycle_t pit_read(struct clocksource *cs)
static int old_count; static int old_count;
static u32 old_jifs; static u32 old_jifs;
spin_lock_irqsave(&i8253_lock, flags); raw_spin_lock_irqsave(&i8253_lock, flags);
/* /*
* Although our caller may have the read side of xtime_lock, * Although our caller may have the read side of xtime_lock,
* this is now a seqlock, and we are cheating in this routine * this is now a seqlock, and we are cheating in this routine
...@@ -183,7 +183,7 @@ static cycle_t pit_read(struct clocksource *cs) ...@@ -183,7 +183,7 @@ static cycle_t pit_read(struct clocksource *cs)
old_count = count; old_count = count;
old_jifs = jifs; old_jifs = jifs;
spin_unlock_irqrestore(&i8253_lock, flags); raw_spin_unlock_irqrestore(&i8253_lock, flags);
count = (LATCH - 1) - count; count = (LATCH - 1) - count;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#define PIT_CH0 0x40 #define PIT_CH0 0x40
#define PIT_CH2 0x42 #define PIT_CH2 0x42
extern spinlock_t i8253_lock; extern raw_spinlock_t i8253_lock;
extern struct clock_event_device *global_clock_event; extern struct clock_event_device *global_clock_event;
......
...@@ -1224,7 +1224,7 @@ static void reinit_timer(void) ...@@ -1224,7 +1224,7 @@ static void reinit_timer(void)
#ifdef INIT_TIMER_AFTER_SUSPEND #ifdef INIT_TIMER_AFTER_SUSPEND
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&i8253_lock, flags); raw_spin_lock_irqsave(&i8253_lock, flags);
/* set the clock to HZ */ /* set the clock to HZ */
outb_pit(0x34, PIT_MODE); /* binary, mode 2, LSB/MSB, ch 0 */ outb_pit(0x34, PIT_MODE); /* binary, mode 2, LSB/MSB, ch 0 */
udelay(10); udelay(10);
...@@ -1232,7 +1232,7 @@ static void reinit_timer(void) ...@@ -1232,7 +1232,7 @@ static void reinit_timer(void)
udelay(10); udelay(10);
outb_pit(LATCH >> 8, PIT_CH0); /* MSB */ outb_pit(LATCH >> 8, PIT_CH0); /* MSB */
udelay(10); udelay(10);
spin_unlock_irqrestore(&i8253_lock, flags); raw_spin_unlock_irqrestore(&i8253_lock, flags);
#endif #endif
} }
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include <asm/hpet.h> #include <asm/hpet.h>
#include <asm/smp.h> #include <asm/smp.h>
DEFINE_SPINLOCK(i8253_lock); DEFINE_RAW_SPINLOCK(i8253_lock);
EXPORT_SYMBOL(i8253_lock); EXPORT_SYMBOL(i8253_lock);
/* /*
...@@ -33,7 +33,7 @@ struct clock_event_device *global_clock_event; ...@@ -33,7 +33,7 @@ struct clock_event_device *global_clock_event;
static void init_pit_timer(enum clock_event_mode mode, static void init_pit_timer(enum clock_event_mode mode,
struct clock_event_device *evt) struct clock_event_device *evt)
{ {
spin_lock(&i8253_lock); raw_spin_lock(&i8253_lock);
switch (mode) { switch (mode) {
case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_PERIODIC:
...@@ -62,7 +62,7 @@ static void init_pit_timer(enum clock_event_mode mode, ...@@ -62,7 +62,7 @@ static void init_pit_timer(enum clock_event_mode mode,
/* Nothing to do here */ /* Nothing to do here */
break; break;
} }
spin_unlock(&i8253_lock); raw_spin_unlock(&i8253_lock);
} }
/* /*
...@@ -72,10 +72,10 @@ static void init_pit_timer(enum clock_event_mode mode, ...@@ -72,10 +72,10 @@ static void init_pit_timer(enum clock_event_mode mode,
*/ */
static int pit_next_event(unsigned long delta, struct clock_event_device *evt) static int pit_next_event(unsigned long delta, struct clock_event_device *evt)
{ {
spin_lock(&i8253_lock); raw_spin_lock(&i8253_lock);
outb_pit(delta & 0xff , PIT_CH0); /* LSB */ outb_pit(delta & 0xff , PIT_CH0); /* LSB */
outb_pit(delta >> 8 , PIT_CH0); /* MSB */ outb_pit(delta >> 8 , PIT_CH0); /* MSB */
spin_unlock(&i8253_lock); raw_spin_unlock(&i8253_lock);
return 0; return 0;
} }
...@@ -130,7 +130,7 @@ static cycle_t pit_read(struct clocksource *cs) ...@@ -130,7 +130,7 @@ static cycle_t pit_read(struct clocksource *cs)
int count; int count;
u32 jifs; u32 jifs;
spin_lock_irqsave(&i8253_lock, flags); raw_spin_lock_irqsave(&i8253_lock, flags);
/* /*
* Although our caller may have the read side of xtime_lock, * Although our caller may have the read side of xtime_lock,
* this is now a seqlock, and we are cheating in this routine * this is now a seqlock, and we are cheating in this routine
...@@ -176,7 +176,7 @@ static cycle_t pit_read(struct clocksource *cs) ...@@ -176,7 +176,7 @@ static cycle_t pit_read(struct clocksource *cs)
old_count = count; old_count = count;
old_jifs = jifs; old_jifs = jifs;
spin_unlock_irqrestore(&i8253_lock, flags); raw_spin_unlock_irqrestore(&i8253_lock, flags);
count = (LATCH - 1) - count; count = (LATCH - 1) - count;
......
...@@ -164,12 +164,12 @@ unsigned long read_timer(void) ...@@ -164,12 +164,12 @@ unsigned long read_timer(void)
unsigned long t, flags; unsigned long t, flags;
int i; int i;
spin_lock_irqsave(&i8253_lock, flags); raw_spin_lock_irqsave(&i8253_lock, flags);
t = jiffies * 11932; t = jiffies * 11932;
outb_p(0, 0x43); outb_p(0, 0x43);
i = inb_p(0x40); i = inb_p(0x40);
i |= inb(0x40) << 8; i |= inb(0x40) << 8;
spin_unlock_irqrestore(&i8253_lock, flags); raw_spin_unlock_irqrestore(&i8253_lock, flags);
return(t - i); return(t - i);
} }
#endif #endif
......
...@@ -59,11 +59,11 @@ static unsigned int get_time_pit(void) ...@@ -59,11 +59,11 @@ static unsigned int get_time_pit(void)
unsigned long flags; unsigned long flags;
unsigned int count; unsigned int count;
spin_lock_irqsave(&i8253_lock, flags); raw_spin_lock_irqsave(&i8253_lock, flags);
outb_p(0x00, 0x43); outb_p(0x00, 0x43);
count = inb_p(0x40); count = inb_p(0x40);
count |= inb_p(0x40) << 8; count |= inb_p(0x40) << 8;
spin_unlock_irqrestore(&i8253_lock, flags); raw_spin_unlock_irqrestore(&i8253_lock, flags);
return count; return count;
} }
......
...@@ -146,11 +146,11 @@ static unsigned int get_time_pit(void) ...@@ -146,11 +146,11 @@ static unsigned int get_time_pit(void)
unsigned long flags; unsigned long flags;
unsigned int count; unsigned int count;
spin_lock_irqsave(&i8253_lock, flags); raw_spin_lock_irqsave(&i8253_lock, flags);
outb_p(0x00, 0x43); outb_p(0x00, 0x43);
count = inb_p(0x40); count = inb_p(0x40);
count |= inb_p(0x40) << 8; count |= inb_p(0x40) << 8;
spin_unlock_irqrestore(&i8253_lock, flags); raw_spin_unlock_irqrestore(&i8253_lock, flags);
return count; return count;
} }
......
...@@ -30,7 +30,7 @@ MODULE_ALIAS("platform:pcspkr"); ...@@ -30,7 +30,7 @@ MODULE_ALIAS("platform:pcspkr");
#include <asm/i8253.h> #include <asm/i8253.h>
#else #else
#include <asm/8253pit.h> #include <asm/8253pit.h>
static DEFINE_SPINLOCK(i8253_lock); static DEFINE_RAW_SPINLOCK(i8253_lock);
#endif #endif
static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
...@@ -50,7 +50,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c ...@@ -50,7 +50,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c
if (value > 20 && value < 32767) if (value > 20 && value < 32767)
count = PIT_TICK_RATE / value; count = PIT_TICK_RATE / value;
spin_lock_irqsave(&i8253_lock, flags); raw_spin_lock_irqsave(&i8253_lock, flags);
if (count) { if (count) {
/* set command for counter 2, 2 byte write */ /* set command for counter 2, 2 byte write */
...@@ -65,7 +65,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c ...@@ -65,7 +65,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c
outb(inb_p(0x61) & 0xFC, 0x61); outb(inb_p(0x61) & 0xFC, 0x61);
} }
spin_unlock_irqrestore(&i8253_lock, flags); raw_spin_unlock_irqrestore(&i8253_lock, flags);
return 0; return 0;
} }
......
...@@ -431,20 +431,7 @@ static struct stack_trace lockdep_init_trace = { ...@@ -431,20 +431,7 @@ static struct stack_trace lockdep_init_trace = {
/* /*
* Various lockdep statistics: * Various lockdep statistics:
*/ */
atomic_t chain_lookup_hits; DEFINE_PER_CPU(struct lockdep_stats, lockdep_stats);
atomic_t chain_lookup_misses;
atomic_t hardirqs_on_events;
atomic_t hardirqs_off_events;
atomic_t redundant_hardirqs_on;
atomic_t redundant_hardirqs_off;
atomic_t softirqs_on_events;
atomic_t softirqs_off_events;
atomic_t redundant_softirqs_on;
atomic_t redundant_softirqs_off;
atomic_t nr_unused_locks;
atomic_t nr_cyclic_checks;
atomic_t nr_find_usage_forwards_checks;
atomic_t nr_find_usage_backwards_checks;
#endif #endif
/* /*
...@@ -748,7 +735,7 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force) ...@@ -748,7 +735,7 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force)
return NULL; return NULL;
} }
class = lock_classes + nr_lock_classes++; class = lock_classes + nr_lock_classes++;
debug_atomic_inc(&nr_unused_locks); debug_atomic_inc(nr_unused_locks);
class->key = key; class->key = key;
class->name = lock->name; class->name = lock->name;
class->subclass = subclass; class->subclass = subclass;
...@@ -818,7 +805,8 @@ static struct lock_list *alloc_list_entry(void) ...@@ -818,7 +805,8 @@ static struct lock_list *alloc_list_entry(void)
* Add a new dependency to the head of the list: * Add a new dependency to the head of the list:
*/ */
static int add_lock_to_list(struct lock_class *class, struct lock_class *this, static int add_lock_to_list(struct lock_class *class, struct lock_class *this,
struct list_head *head, unsigned long ip, int distance) struct list_head *head, unsigned long ip,
int distance, struct stack_trace *trace)
{ {
struct lock_list *entry; struct lock_list *entry;
/* /*
...@@ -829,11 +817,9 @@ static int add_lock_to_list(struct lock_class *class, struct lock_class *this, ...@@ -829,11 +817,9 @@ static int add_lock_to_list(struct lock_class *class, struct lock_class *this,
if (!entry) if (!entry)
return 0; return 0;
if (!save_trace(&entry->trace))
return 0;
entry->class = this; entry->class = this;
entry->distance = distance; entry->distance = distance;
entry->trace = *trace;
/* /*
* Since we never remove from the dependency list, the list can * Since we never remove from the dependency list, the list can
* be walked lockless by other CPUs, it's only allocation * be walked lockless by other CPUs, it's only allocation
...@@ -1205,7 +1191,7 @@ check_noncircular(struct lock_list *root, struct lock_class *target, ...@@ -1205,7 +1191,7 @@ check_noncircular(struct lock_list *root, struct lock_class *target,
{ {
int result; int result;
debug_atomic_inc(&nr_cyclic_checks); debug_atomic_inc(nr_cyclic_checks);
result = __bfs_forwards(root, target, class_equal, target_entry); result = __bfs_forwards(root, target, class_equal, target_entry);
...@@ -1242,7 +1228,7 @@ find_usage_forwards(struct lock_list *root, enum lock_usage_bit bit, ...@@ -1242,7 +1228,7 @@ find_usage_forwards(struct lock_list *root, enum lock_usage_bit bit,
{ {
int result; int result;
debug_atomic_inc(&nr_find_usage_forwards_checks); debug_atomic_inc(nr_find_usage_forwards_checks);
result = __bfs_forwards(root, (void *)bit, usage_match, target_entry); result = __bfs_forwards(root, (void *)bit, usage_match, target_entry);
...@@ -1265,7 +1251,7 @@ find_usage_backwards(struct lock_list *root, enum lock_usage_bit bit, ...@@ -1265,7 +1251,7 @@ find_usage_backwards(struct lock_list *root, enum lock_usage_bit bit,
{ {
int result; int result;
debug_atomic_inc(&nr_find_usage_backwards_checks); debug_atomic_inc(nr_find_usage_backwards_checks);
result = __bfs_backwards(root, (void *)bit, usage_match, target_entry); result = __bfs_backwards(root, (void *)bit, usage_match, target_entry);
...@@ -1635,12 +1621,20 @@ check_deadlock(struct task_struct *curr, struct held_lock *next, ...@@ -1635,12 +1621,20 @@ check_deadlock(struct task_struct *curr, struct held_lock *next,
*/ */
static int static int
check_prev_add(struct task_struct *curr, struct held_lock *prev, check_prev_add(struct task_struct *curr, struct held_lock *prev,
struct held_lock *next, int distance) struct held_lock *next, int distance, int trylock_loop)
{ {
struct lock_list *entry; struct lock_list *entry;
int ret; int ret;
struct lock_list this; struct lock_list this;
struct lock_list *uninitialized_var(target_entry); struct lock_list *uninitialized_var(target_entry);
/*
* Static variable, serialized by the graph_lock().
*
* We use this static variable to save the stack trace in case
* we call into this function multiple times due to encountering
* trylocks in the held lock stack.
*/
static struct stack_trace trace;
/* /*
* Prove that the new <prev> -> <next> dependency would not * Prove that the new <prev> -> <next> dependency would not
...@@ -1688,20 +1682,23 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev, ...@@ -1688,20 +1682,23 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
} }
} }
if (!trylock_loop && !save_trace(&trace))
return 0;
/* /*
* Ok, all validations passed, add the new lock * Ok, all validations passed, add the new lock
* to the previous lock's dependency list: * to the previous lock's dependency list:
*/ */
ret = add_lock_to_list(hlock_class(prev), hlock_class(next), ret = add_lock_to_list(hlock_class(prev), hlock_class(next),
&hlock_class(prev)->locks_after, &hlock_class(prev)->locks_after,
next->acquire_ip, distance); next->acquire_ip, distance, &trace);
if (!ret) if (!ret)
return 0; return 0;
ret = add_lock_to_list(hlock_class(next), hlock_class(prev), ret = add_lock_to_list(hlock_class(next), hlock_class(prev),
&hlock_class(next)->locks_before, &hlock_class(next)->locks_before,
next->acquire_ip, distance); next->acquire_ip, distance, &trace);
if (!ret) if (!ret)
return 0; return 0;
...@@ -1731,6 +1728,7 @@ static int ...@@ -1731,6 +1728,7 @@ static int
check_prevs_add(struct task_struct *curr, struct held_lock *next) check_prevs_add(struct task_struct *curr, struct held_lock *next)
{ {
int depth = curr->lockdep_depth; int depth = curr->lockdep_depth;
int trylock_loop = 0;
struct held_lock *hlock; struct held_lock *hlock;
/* /*
...@@ -1756,7 +1754,8 @@ check_prevs_add(struct task_struct *curr, struct held_lock *next) ...@@ -1756,7 +1754,8 @@ check_prevs_add(struct task_struct *curr, struct held_lock *next)
* added: * added:
*/ */
if (hlock->read != 2) { if (hlock->read != 2) {
if (!check_prev_add(curr, hlock, next, distance)) if (!check_prev_add(curr, hlock, next,
distance, trylock_loop))
return 0; return 0;
/* /*
* Stop after the first non-trylock entry, * Stop after the first non-trylock entry,
...@@ -1779,6 +1778,7 @@ check_prevs_add(struct task_struct *curr, struct held_lock *next) ...@@ -1779,6 +1778,7 @@ check_prevs_add(struct task_struct *curr, struct held_lock *next)
if (curr->held_locks[depth].irq_context != if (curr->held_locks[depth].irq_context !=
curr->held_locks[depth-1].irq_context) curr->held_locks[depth-1].irq_context)
break; break;
trylock_loop = 1;
} }
return 1; return 1;
out_bug: out_bug:
...@@ -1825,7 +1825,7 @@ static inline int lookup_chain_cache(struct task_struct *curr, ...@@ -1825,7 +1825,7 @@ static inline int lookup_chain_cache(struct task_struct *curr,
list_for_each_entry(chain, hash_head, entry) { list_for_each_entry(chain, hash_head, entry) {
if (chain->chain_key == chain_key) { if (chain->chain_key == chain_key) {
cache_hit: cache_hit:
debug_atomic_inc(&chain_lookup_hits); debug_atomic_inc(chain_lookup_hits);
if (very_verbose(class)) if (very_verbose(class))
printk("\nhash chain already cached, key: " printk("\nhash chain already cached, key: "
"%016Lx tail class: [%p] %s\n", "%016Lx tail class: [%p] %s\n",
...@@ -1890,7 +1890,7 @@ static inline int lookup_chain_cache(struct task_struct *curr, ...@@ -1890,7 +1890,7 @@ static inline int lookup_chain_cache(struct task_struct *curr,
chain_hlocks[chain->base + j] = class - lock_classes; chain_hlocks[chain->base + j] = class - lock_classes;
} }
list_add_tail_rcu(&chain->entry, hash_head); list_add_tail_rcu(&chain->entry, hash_head);
debug_atomic_inc(&chain_lookup_misses); debug_atomic_inc(chain_lookup_misses);
inc_chains(); inc_chains();
return 1; return 1;
...@@ -2311,7 +2311,12 @@ void trace_hardirqs_on_caller(unsigned long ip) ...@@ -2311,7 +2311,12 @@ void trace_hardirqs_on_caller(unsigned long ip)
return; return;
if (unlikely(curr->hardirqs_enabled)) { if (unlikely(curr->hardirqs_enabled)) {
debug_atomic_inc(&redundant_hardirqs_on); /*
* Neither irq nor preemption are disabled here
* so this is racy by nature but loosing one hit
* in a stat is not a big deal.
*/
__debug_atomic_inc(redundant_hardirqs_on);
return; return;
} }
/* we'll do an OFF -> ON transition: */ /* we'll do an OFF -> ON transition: */
...@@ -2338,7 +2343,7 @@ void trace_hardirqs_on_caller(unsigned long ip) ...@@ -2338,7 +2343,7 @@ void trace_hardirqs_on_caller(unsigned long ip)
curr->hardirq_enable_ip = ip; curr->hardirq_enable_ip = ip;
curr->hardirq_enable_event = ++curr->irq_events; curr->hardirq_enable_event = ++curr->irq_events;
debug_atomic_inc(&hardirqs_on_events); debug_atomic_inc(hardirqs_on_events);
} }
EXPORT_SYMBOL(trace_hardirqs_on_caller); EXPORT_SYMBOL(trace_hardirqs_on_caller);
...@@ -2370,9 +2375,9 @@ void trace_hardirqs_off_caller(unsigned long ip) ...@@ -2370,9 +2375,9 @@ void trace_hardirqs_off_caller(unsigned long ip)
curr->hardirqs_enabled = 0; curr->hardirqs_enabled = 0;
curr->hardirq_disable_ip = ip; curr->hardirq_disable_ip = ip;
curr->hardirq_disable_event = ++curr->irq_events; curr->hardirq_disable_event = ++curr->irq_events;
debug_atomic_inc(&hardirqs_off_events); debug_atomic_inc(hardirqs_off_events);
} else } else
debug_atomic_inc(&redundant_hardirqs_off); debug_atomic_inc(redundant_hardirqs_off);
} }
EXPORT_SYMBOL(trace_hardirqs_off_caller); EXPORT_SYMBOL(trace_hardirqs_off_caller);
...@@ -2396,7 +2401,7 @@ void trace_softirqs_on(unsigned long ip) ...@@ -2396,7 +2401,7 @@ void trace_softirqs_on(unsigned long ip)
return; return;
if (curr->softirqs_enabled) { if (curr->softirqs_enabled) {
debug_atomic_inc(&redundant_softirqs_on); debug_atomic_inc(redundant_softirqs_on);
return; return;
} }
...@@ -2406,7 +2411,7 @@ void trace_softirqs_on(unsigned long ip) ...@@ -2406,7 +2411,7 @@ void trace_softirqs_on(unsigned long ip)
curr->softirqs_enabled = 1; curr->softirqs_enabled = 1;
curr->softirq_enable_ip = ip; curr->softirq_enable_ip = ip;
curr->softirq_enable_event = ++curr->irq_events; curr->softirq_enable_event = ++curr->irq_events;
debug_atomic_inc(&softirqs_on_events); debug_atomic_inc(softirqs_on_events);
/* /*
* We are going to turn softirqs on, so set the * We are going to turn softirqs on, so set the
* usage bit for all held locks, if hardirqs are * usage bit for all held locks, if hardirqs are
...@@ -2436,10 +2441,10 @@ void trace_softirqs_off(unsigned long ip) ...@@ -2436,10 +2441,10 @@ void trace_softirqs_off(unsigned long ip)
curr->softirqs_enabled = 0; curr->softirqs_enabled = 0;
curr->softirq_disable_ip = ip; curr->softirq_disable_ip = ip;
curr->softirq_disable_event = ++curr->irq_events; curr->softirq_disable_event = ++curr->irq_events;
debug_atomic_inc(&softirqs_off_events); debug_atomic_inc(softirqs_off_events);
DEBUG_LOCKS_WARN_ON(!softirq_count()); DEBUG_LOCKS_WARN_ON(!softirq_count());
} else } else
debug_atomic_inc(&redundant_softirqs_off); debug_atomic_inc(redundant_softirqs_off);
} }
static void __lockdep_trace_alloc(gfp_t gfp_mask, unsigned long flags) static void __lockdep_trace_alloc(gfp_t gfp_mask, unsigned long flags)
...@@ -2644,7 +2649,7 @@ static int mark_lock(struct task_struct *curr, struct held_lock *this, ...@@ -2644,7 +2649,7 @@ static int mark_lock(struct task_struct *curr, struct held_lock *this,
return 0; return 0;
break; break;
case LOCK_USED: case LOCK_USED:
debug_atomic_dec(&nr_unused_locks); debug_atomic_dec(nr_unused_locks);
break; break;
default: default:
if (!debug_locks_off_graph_unlock()) if (!debug_locks_off_graph_unlock())
...@@ -2750,7 +2755,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, ...@@ -2750,7 +2755,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
if (!class) if (!class)
return 0; return 0;
} }
debug_atomic_inc((atomic_t *)&class->ops); atomic_inc((atomic_t *)&class->ops);
if (very_verbose(class)) { if (very_verbose(class)) {
printk("\nacquire class [%p] %s", class->key, class->name); printk("\nacquire class [%p] %s", class->key, class->name);
if (class->name_version > 1) if (class->name_version > 1)
......
...@@ -110,30 +110,60 @@ lockdep_count_backward_deps(struct lock_class *class) ...@@ -110,30 +110,60 @@ lockdep_count_backward_deps(struct lock_class *class)
#endif #endif
#ifdef CONFIG_DEBUG_LOCKDEP #ifdef CONFIG_DEBUG_LOCKDEP
#include <asm/local.h>
/* /*
* Various lockdep statistics: * Various lockdep statistics.
* We want them per cpu as they are often accessed in fast path
* and we want to avoid too much cache bouncing.
*/ */
extern atomic_t chain_lookup_hits; struct lockdep_stats {
extern atomic_t chain_lookup_misses; int chain_lookup_hits;
extern atomic_t hardirqs_on_events; int chain_lookup_misses;
extern atomic_t hardirqs_off_events; int hardirqs_on_events;
extern atomic_t redundant_hardirqs_on; int hardirqs_off_events;
extern atomic_t redundant_hardirqs_off; int redundant_hardirqs_on;
extern atomic_t softirqs_on_events; int redundant_hardirqs_off;
extern atomic_t softirqs_off_events; int softirqs_on_events;
extern atomic_t redundant_softirqs_on; int softirqs_off_events;
extern atomic_t redundant_softirqs_off; int redundant_softirqs_on;
extern atomic_t nr_unused_locks; int redundant_softirqs_off;
extern atomic_t nr_cyclic_checks; int nr_unused_locks;
extern atomic_t nr_cyclic_check_recursions; int nr_cyclic_checks;
extern atomic_t nr_find_usage_forwards_checks; int nr_cyclic_check_recursions;
extern atomic_t nr_find_usage_forwards_recursions; int nr_find_usage_forwards_checks;
extern atomic_t nr_find_usage_backwards_checks; int nr_find_usage_forwards_recursions;
extern atomic_t nr_find_usage_backwards_recursions; int nr_find_usage_backwards_checks;
# define debug_atomic_inc(ptr) atomic_inc(ptr) int nr_find_usage_backwards_recursions;
# define debug_atomic_dec(ptr) atomic_dec(ptr) };
# define debug_atomic_read(ptr) atomic_read(ptr)
DECLARE_PER_CPU(struct lockdep_stats, lockdep_stats);
#define __debug_atomic_inc(ptr) \
this_cpu_inc(lockdep_stats.ptr);
#define debug_atomic_inc(ptr) { \
WARN_ON_ONCE(!irqs_disabled()); \
__this_cpu_inc(lockdep_stats.ptr); \
}
#define debug_atomic_dec(ptr) { \
WARN_ON_ONCE(!irqs_disabled()); \
__this_cpu_dec(lockdep_stats.ptr); \
}
#define debug_atomic_read(ptr) ({ \
struct lockdep_stats *__cpu_lockdep_stats; \
unsigned long long __total = 0; \
int __cpu; \
for_each_possible_cpu(__cpu) { \
__cpu_lockdep_stats = &per_cpu(lockdep_stats, __cpu); \
__total += __cpu_lockdep_stats->ptr; \
} \
__total; \
})
#else #else
# define __debug_atomic_inc(ptr) do { } while (0)
# define debug_atomic_inc(ptr) do { } while (0) # define debug_atomic_inc(ptr) do { } while (0)
# define debug_atomic_dec(ptr) do { } while (0) # define debug_atomic_dec(ptr) do { } while (0)
# define debug_atomic_read(ptr) 0 # define debug_atomic_read(ptr) 0
......
...@@ -184,34 +184,34 @@ static const struct file_operations proc_lockdep_chains_operations = { ...@@ -184,34 +184,34 @@ static const struct file_operations proc_lockdep_chains_operations = {
static void lockdep_stats_debug_show(struct seq_file *m) static void lockdep_stats_debug_show(struct seq_file *m)
{ {
#ifdef CONFIG_DEBUG_LOCKDEP #ifdef CONFIG_DEBUG_LOCKDEP
unsigned int hi1 = debug_atomic_read(&hardirqs_on_events), unsigned long long hi1 = debug_atomic_read(hardirqs_on_events),
hi2 = debug_atomic_read(&hardirqs_off_events), hi2 = debug_atomic_read(hardirqs_off_events),
hr1 = debug_atomic_read(&redundant_hardirqs_on), hr1 = debug_atomic_read(redundant_hardirqs_on),
hr2 = debug_atomic_read(&redundant_hardirqs_off), hr2 = debug_atomic_read(redundant_hardirqs_off),
si1 = debug_atomic_read(&softirqs_on_events), si1 = debug_atomic_read(softirqs_on_events),
si2 = debug_atomic_read(&softirqs_off_events), si2 = debug_atomic_read(softirqs_off_events),
sr1 = debug_atomic_read(&redundant_softirqs_on), sr1 = debug_atomic_read(redundant_softirqs_on),
sr2 = debug_atomic_read(&redundant_softirqs_off); sr2 = debug_atomic_read(redundant_softirqs_off);
seq_printf(m, " chain lookup misses: %11u\n", seq_printf(m, " chain lookup misses: %11llu\n",
debug_atomic_read(&chain_lookup_misses)); debug_atomic_read(chain_lookup_misses));
seq_printf(m, " chain lookup hits: %11u\n", seq_printf(m, " chain lookup hits: %11llu\n",
debug_atomic_read(&chain_lookup_hits)); debug_atomic_read(chain_lookup_hits));
seq_printf(m, " cyclic checks: %11u\n", seq_printf(m, " cyclic checks: %11llu\n",
debug_atomic_read(&nr_cyclic_checks)); debug_atomic_read(nr_cyclic_checks));
seq_printf(m, " find-mask forwards checks: %11u\n", seq_printf(m, " find-mask forwards checks: %11llu\n",
debug_atomic_read(&nr_find_usage_forwards_checks)); debug_atomic_read(nr_find_usage_forwards_checks));
seq_printf(m, " find-mask backwards checks: %11u\n", seq_printf(m, " find-mask backwards checks: %11llu\n",
debug_atomic_read(&nr_find_usage_backwards_checks)); debug_atomic_read(nr_find_usage_backwards_checks));
seq_printf(m, " hardirq on events: %11u\n", hi1); seq_printf(m, " hardirq on events: %11llu\n", hi1);
seq_printf(m, " hardirq off events: %11u\n", hi2); seq_printf(m, " hardirq off events: %11llu\n", hi2);
seq_printf(m, " redundant hardirq ons: %11u\n", hr1); seq_printf(m, " redundant hardirq ons: %11llu\n", hr1);
seq_printf(m, " redundant hardirq offs: %11u\n", hr2); seq_printf(m, " redundant hardirq offs: %11llu\n", hr2);
seq_printf(m, " softirq on events: %11u\n", si1); seq_printf(m, " softirq on events: %11llu\n", si1);
seq_printf(m, " softirq off events: %11u\n", si2); seq_printf(m, " softirq off events: %11llu\n", si2);
seq_printf(m, " redundant softirq ons: %11u\n", sr1); seq_printf(m, " redundant softirq ons: %11llu\n", sr1);
seq_printf(m, " redundant softirq offs: %11u\n", sr2); seq_printf(m, " redundant softirq offs: %11llu\n", sr2);
#endif #endif
} }
...@@ -263,7 +263,7 @@ static int lockdep_stats_show(struct seq_file *m, void *v) ...@@ -263,7 +263,7 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
#endif #endif
} }
#ifdef CONFIG_DEBUG_LOCKDEP #ifdef CONFIG_DEBUG_LOCKDEP
DEBUG_LOCKS_WARN_ON(debug_atomic_read(&nr_unused_locks) != nr_unused); DEBUG_LOCKS_WARN_ON(debug_atomic_read(nr_unused_locks) != nr_unused);
#endif #endif
seq_printf(m, " lock-classes: %11lu [max: %lu]\n", seq_printf(m, " lock-classes: %11lu [max: %lu]\n",
nr_lock_classes, MAX_LOCKDEP_KEYS); nr_lock_classes, MAX_LOCKDEP_KEYS);
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include <asm/i8253.h> #include <asm/i8253.h>
#else #else
#include <asm/8253pit.h> #include <asm/8253pit.h>
static DEFINE_SPINLOCK(i8253_lock); static DEFINE_RAW_SPINLOCK(i8253_lock);
#endif #endif
#define PCSP_SOUND_VERSION 0x400 /* read 4.00 */ #define PCSP_SOUND_VERSION 0x400 /* read 4.00 */
......
...@@ -21,7 +21,7 @@ static void pcspkr_do_sound(unsigned int count) ...@@ -21,7 +21,7 @@ static void pcspkr_do_sound(unsigned int count)
{ {
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&i8253_lock, flags); raw_spin_lock_irqsave(&i8253_lock, flags);
if (count) { if (count) {
/* set command for counter 2, 2 byte write */ /* set command for counter 2, 2 byte write */
...@@ -36,7 +36,7 @@ static void pcspkr_do_sound(unsigned int count) ...@@ -36,7 +36,7 @@ static void pcspkr_do_sound(unsigned int count)
outb(inb_p(0x61) & 0xFC, 0x61); outb(inb_p(0x61) & 0xFC, 0x61);
} }
spin_unlock_irqrestore(&i8253_lock, flags); raw_spin_unlock_irqrestore(&i8253_lock, flags);
} }
void pcspkr_stop_sound(void) void pcspkr_stop_sound(void)
......
...@@ -66,7 +66,7 @@ static u64 pcsp_timer_update(struct snd_pcsp *chip) ...@@ -66,7 +66,7 @@ static u64 pcsp_timer_update(struct snd_pcsp *chip)
timer_cnt = val * CUR_DIV() / 256; timer_cnt = val * CUR_DIV() / 256;
if (timer_cnt && chip->enable) { if (timer_cnt && chip->enable) {
spin_lock_irqsave(&i8253_lock, flags); raw_spin_lock_irqsave(&i8253_lock, flags);
if (!nforce_wa) { if (!nforce_wa) {
outb_p(chip->val61, 0x61); outb_p(chip->val61, 0x61);
outb_p(timer_cnt, 0x42); outb_p(timer_cnt, 0x42);
...@@ -75,7 +75,7 @@ static u64 pcsp_timer_update(struct snd_pcsp *chip) ...@@ -75,7 +75,7 @@ static u64 pcsp_timer_update(struct snd_pcsp *chip)
outb(chip->val61 ^ 2, 0x61); outb(chip->val61 ^ 2, 0x61);
chip->thalf = 1; chip->thalf = 1;
} }
spin_unlock_irqrestore(&i8253_lock, flags); raw_spin_unlock_irqrestore(&i8253_lock, flags);
} }
chip->ns_rem = PCSP_PERIOD_NS(); chip->ns_rem = PCSP_PERIOD_NS();
...@@ -159,10 +159,10 @@ static int pcsp_start_playing(struct snd_pcsp *chip) ...@@ -159,10 +159,10 @@ static int pcsp_start_playing(struct snd_pcsp *chip)
return -EIO; return -EIO;
} }
spin_lock(&i8253_lock); raw_spin_lock(&i8253_lock);
chip->val61 = inb(0x61) | 0x03; chip->val61 = inb(0x61) | 0x03;
outb_p(0x92, 0x43); /* binary, mode 1, LSB only, ch 2 */ outb_p(0x92, 0x43); /* binary, mode 1, LSB only, ch 2 */
spin_unlock(&i8253_lock); raw_spin_unlock(&i8253_lock);
atomic_set(&chip->timer_active, 1); atomic_set(&chip->timer_active, 1);
chip->thalf = 0; chip->thalf = 0;
...@@ -179,11 +179,11 @@ static void pcsp_stop_playing(struct snd_pcsp *chip) ...@@ -179,11 +179,11 @@ static void pcsp_stop_playing(struct snd_pcsp *chip)
return; return;
atomic_set(&chip->timer_active, 0); atomic_set(&chip->timer_active, 0);
spin_lock(&i8253_lock); raw_spin_lock(&i8253_lock);
/* restore the timer */ /* restore the timer */
outb_p(0xb6, 0x43); /* binary, mode 3, LSB/MSB, ch 2 */ outb_p(0xb6, 0x43); /* binary, mode 3, LSB/MSB, ch 2 */
outb(chip->val61 & 0xFC, 0x61); outb(chip->val61 & 0xFC, 0x61);
spin_unlock(&i8253_lock); raw_spin_unlock(&i8253_lock);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment