Commit da87bbd1 authored by Linus Torvalds's avatar Linus Torvalds

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

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/posix-cpu-timers.c: fix sparse warning
  dma-debug: remove broken dma memory leak detection for 2.6.30
  locking: Documentation: lockdep-design.txt, fix note of state bits
parents e91b3b26 6e85c5ba
...@@ -54,9 +54,9 @@ locking error messages, inside curlies. A contrived example: ...@@ -54,9 +54,9 @@ locking error messages, inside curlies. A contrived example:
The bit position indicates STATE, STATE-read, for each of the states listed The bit position indicates STATE, STATE-read, for each of the states listed
above, and the character displayed in each indicates: above, and the character displayed in each indicates:
'.' acquired while irqs disabled '.' acquired while irqs disabled and not in irq context
'+' acquired in irq context '-' acquired in irq context
'-' acquired with irqs enabled '+' acquired with irqs enabled
'?' acquired in irq context with irqs enabled. '?' acquired in irq context with irqs enabled.
Unused mutexes cannot be part of the cause of an error. Unused mutexes cannot be part of the cause of an error.
......
...@@ -1420,19 +1420,19 @@ void run_posix_cpu_timers(struct task_struct *tsk) ...@@ -1420,19 +1420,19 @@ void run_posix_cpu_timers(struct task_struct *tsk)
* timer call will interfere. * timer call will interfere.
*/ */
list_for_each_entry_safe(timer, next, &firing, it.cpu.entry) { list_for_each_entry_safe(timer, next, &firing, it.cpu.entry) {
int firing; int cpu_firing;
spin_lock(&timer->it_lock); spin_lock(&timer->it_lock);
list_del_init(&timer->it.cpu.entry); list_del_init(&timer->it.cpu.entry);
firing = timer->it.cpu.firing; cpu_firing = timer->it.cpu.firing;
timer->it.cpu.firing = 0; timer->it.cpu.firing = 0;
/* /*
* The firing flag is -1 if we collided with a reset * The firing flag is -1 if we collided with a reset
* of the timer, which already reported this * of the timer, which already reported this
* almost-firing as an overrun. So don't generate an event. * almost-firing as an overrun. So don't generate an event.
*/ */
if (likely(firing >= 0)) { if (likely(cpu_firing >= 0))
cpu_timer_fire(timer); cpu_timer_fire(timer);
}
spin_unlock(&timer->it_lock); spin_unlock(&timer->it_lock);
} }
} }
......
...@@ -400,60 +400,9 @@ static int dma_debug_fs_init(void) ...@@ -400,60 +400,9 @@ static int dma_debug_fs_init(void)
return -ENOMEM; return -ENOMEM;
} }
static int device_dma_allocations(struct device *dev)
{
struct dma_debug_entry *entry;
unsigned long flags;
int count = 0, i;
for (i = 0; i < HASH_SIZE; ++i) {
spin_lock_irqsave(&dma_entry_hash[i].lock, flags);
list_for_each_entry(entry, &dma_entry_hash[i].list, list) {
if (entry->dev == dev)
count += 1;
}
spin_unlock_irqrestore(&dma_entry_hash[i].lock, flags);
}
return count;
}
static int dma_debug_device_change(struct notifier_block *nb,
unsigned long action, void *data)
{
struct device *dev = data;
int count;
switch (action) {
case BUS_NOTIFY_UNBIND_DRIVER:
count = device_dma_allocations(dev);
if (count == 0)
break;
err_printk(dev, NULL, "DMA-API: device driver has pending "
"DMA allocations while released from device "
"[count=%d]\n", count);
break;
default:
break;
}
return 0;
}
void dma_debug_add_bus(struct bus_type *bus) void dma_debug_add_bus(struct bus_type *bus)
{ {
struct notifier_block *nb; /* FIXME: register notifier */
nb = kzalloc(sizeof(struct notifier_block), GFP_KERNEL);
if (nb == NULL) {
printk(KERN_ERR "dma_debug_add_bus: out of memory\n");
return;
}
nb->notifier_call = dma_debug_device_change;
bus_register_notifier(bus, nb);
} }
/* /*
......
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