Commit da87bbd1 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -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.
+4 −4
Original line number Original line Diff line number Diff line
@@ -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);
	}
	}
}
}
+1 −52
Original line number Original line Diff line number Diff line
@@ -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);
}
}


/*
/*