diff options
Diffstat (limited to 'kernel/dma/debug.c')
| -rw-r--r-- | kernel/dma/debug.c | 36 | 
1 files changed, 20 insertions, 16 deletions
| diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c index 95445bd6eb72..7a14ca29c377 100644 --- a/kernel/dma/debug.c +++ b/kernel/dma/debug.c @@ -552,7 +552,7 @@ static void active_cacheline_remove(struct dma_debug_entry *entry)   * Wrapper function for adding an entry to the hash.   * This function takes care of locking itself.   */ -static void add_dma_entry(struct dma_debug_entry *entry) +static void add_dma_entry(struct dma_debug_entry *entry, unsigned long attrs)  {  	struct hash_bucket *bucket;  	unsigned long flags; @@ -566,7 +566,7 @@ static void add_dma_entry(struct dma_debug_entry *entry)  	if (rc == -ENOMEM) {  		pr_err("cacheline tracking ENOMEM, dma-debug disabled\n");  		global_disable = true; -	} else if (rc == -EEXIST) { +	} else if (rc == -EEXIST && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) {  		err_printk(entry->dev, entry,  			"cacheline tracking EEXIST, overlapping mappings aren't supported\n");  	} @@ -1191,7 +1191,8 @@ void debug_dma_map_single(struct device *dev, const void *addr,  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) +			size_t size, int direction, dma_addr_t dma_addr, +			unsigned long attrs)  {  	struct dma_debug_entry *entry; @@ -1222,7 +1223,7 @@ void debug_dma_map_page(struct device *dev, struct page *page, size_t offset,  		check_for_illegal_area(dev, addr, size);  	} -	add_dma_entry(entry); +	add_dma_entry(entry, attrs);  }  void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) @@ -1280,7 +1281,8 @@ void debug_dma_unmap_page(struct device *dev, dma_addr_t addr,  }  void debug_dma_map_sg(struct device *dev, struct scatterlist *sg, -		      int nents, int mapped_ents, int direction) +		      int nents, int mapped_ents, int direction, +		      unsigned long attrs)  {  	struct dma_debug_entry *entry;  	struct scatterlist *s; @@ -1289,6 +1291,12 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,  	if (unlikely(dma_debug_disabled()))  		return; +	for_each_sg(sg, s, nents, i) { +		check_for_stack(dev, sg_page(s), s->offset); +		if (!PageHighMem(sg_page(s))) +			check_for_illegal_area(dev, sg_virt(s), s->length); +	} +  	for_each_sg(sg, s, mapped_ents, i) {  		entry = dma_entry_alloc();  		if (!entry) @@ -1304,15 +1312,9 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,  		entry->sg_call_ents   = nents;  		entry->sg_mapped_ents = mapped_ents; -		check_for_stack(dev, sg_page(s), s->offset); - -		if (!PageHighMem(sg_page(s))) { -			check_for_illegal_area(dev, sg_virt(s), sg_dma_len(s)); -		} -  		check_sg_segment(dev, s); -		add_dma_entry(entry); +		add_dma_entry(entry, attrs);  	}  } @@ -1368,7 +1370,8 @@ void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,  }  void debug_dma_alloc_coherent(struct device *dev, size_t size, -			      dma_addr_t dma_addr, void *virt) +			      dma_addr_t dma_addr, void *virt, +			      unsigned long attrs)  {  	struct dma_debug_entry *entry; @@ -1398,7 +1401,7 @@ void debug_dma_alloc_coherent(struct device *dev, size_t size,  	else  		entry->pfn = page_to_pfn(virt_to_page(virt)); -	add_dma_entry(entry); +	add_dma_entry(entry, attrs);  }  void debug_dma_free_coherent(struct device *dev, size_t size, @@ -1429,7 +1432,8 @@ void debug_dma_free_coherent(struct device *dev, size_t size,  }  void debug_dma_map_resource(struct device *dev, phys_addr_t addr, size_t size, -			    int direction, dma_addr_t dma_addr) +			    int direction, dma_addr_t dma_addr, +			    unsigned long attrs)  {  	struct dma_debug_entry *entry; @@ -1449,7 +1453,7 @@ void debug_dma_map_resource(struct device *dev, phys_addr_t addr, size_t size,  	entry->direction	= direction;  	entry->map_err_type	= MAP_ERR_NOT_CHECKED; -	add_dma_entry(entry); +	add_dma_entry(entry, attrs);  }  void debug_dma_unmap_resource(struct device *dev, dma_addr_t dma_addr, |