diff options
| -rw-r--r-- | include/linux/dma-debug.h | 8 | ||||
| -rw-r--r-- | include/linux/dma-mapping.h | 1 | ||||
| -rw-r--r-- | kernel/dma/debug.c | 16 | 
3 files changed, 25 insertions, 0 deletions
| diff --git a/include/linux/dma-debug.h b/include/linux/dma-debug.h index a785f2507159..30213adbb6b9 100644 --- a/include/linux/dma-debug.h +++ b/include/linux/dma-debug.h @@ -32,6 +32,9 @@ extern void dma_debug_add_bus(struct bus_type *bus);  extern int dma_debug_resize_entries(u32 num_entries); +extern void debug_dma_map_single(struct device *dev, const void *addr, +				 unsigned long len); +  extern void debug_dma_map_page(struct device *dev, struct page *page,  			       size_t offset, size_t size,  			       int direction, dma_addr_t dma_addr, @@ -103,6 +106,11 @@ static inline int dma_debug_resize_entries(u32 num_entries)  	return 0;  } +static inline void debug_dma_map_single(struct device *dev, const void *addr, +					unsigned long len) +{ +} +  static inline void debug_dma_map_page(struct device *dev, struct page *page,  				      size_t offset, size_t size,  				      int direction, dma_addr_t dma_addr, diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 562af6b45f23..547a48bcfa3d 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -229,6 +229,7 @@ static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,  	dma_addr_t addr;  	BUG_ON(!valid_dma_direction(dir)); +	debug_dma_map_single(dev, ptr, size);  	addr = ops->map_page(dev, virt_to_page(ptr),  			     offset_in_page(ptr), size,  			     dir, attrs); diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c index c007d25bee09..231ca4628062 100644 --- a/kernel/dma/debug.c +++ b/kernel/dma/debug.c @@ -1312,6 +1312,22 @@ static void check_sg_segment(struct device *dev, struct scatterlist *sg)  #endif  } +void debug_dma_map_single(struct device *dev, const void *addr, +			    unsigned long len) +{ +	if (unlikely(dma_debug_disabled())) +		return; + +	if (!virt_addr_valid(addr)) +		err_printk(dev, NULL, "DMA-API: device driver maps memory from invalid area [addr=%p] [len=%lu]\n", +			   addr, len); + +	if (is_vmalloc_addr(addr)) +		err_printk(dev, NULL, "DMA-API: device driver maps memory from vmalloc area [addr=%p] [len=%lu]\n", +			   addr, len); +} +EXPORT_SYMBOL(debug_dma_map_single); +  void debug_dma_map_page(struct device *dev, struct page *page, size_t offset,  			size_t size, int direction, dma_addr_t dma_addr,  			bool map_single) | 
