mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	dma-debug: remove broken dma memory leak detection for 2.6.30
The feature needs some more work because the notfier which is used to check for pending allocations is called before the device drivers ->remove() function. Therefore this feature reports false positives. A real fix for this issue is to introduce a new notifier event which sent _after_ the driver has deinitialized itself. That will done for the next kernel version. [ Impact: reduce the scope of CONFIG_DMA_API_DEBUG=y checks ] Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Cc: iommu@lists.linux-foundation.org LKML-Reference: <1240576557-22442-1-git-send-email-joerg.roedel@amd.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
							parent
							
								
									992d7ced75
								
							
						
					
					
						commit
						314eeac9e3
					
				
					 1 changed files with 1 additions and 52 deletions
				
			
		| 
						 | 
				
			
			@ -400,60 +400,9 @@ static int dma_debug_fs_init(void)
 | 
			
		|||
	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)
 | 
			
		||||
{
 | 
			
		||||
	struct notifier_block *nb;
 | 
			
		||||
 | 
			
		||||
	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);
 | 
			
		||||
	/* FIXME: register notifier */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue