dma-debug: teach add_dma_entry() about DMA_ATTR_SKIP_CPU_SYNC
Mapping something twice should be possible as long as, DMA_ATTR_SKIP_CPU_SYNC is passed to the strictly speaking second relevant mapping operation (that attempts to map the same thing). So, don't issue a warning if the specified condition is met in add_dma_entry(). Signed-off-by: Hamza Mahfooz <someguy@effective-light.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
committed by
Christoph Hellwig
parent
293d92cbbd
commit
c2bbf9d1e9
+14
-10
@@ -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;
|
||||
@@ -1312,7 +1314,7 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
|
||||
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user