History

Merge tag 'dma-mapping-5.15-2' of git://git.infradead.org/users/hch/dma-mapping

Pull dma-mapping fixes from Christoph Hellwig: - fix more dma-debug fallout (Gerald Schaefer, Hamza Mahfooz) - fix a kerneldoc warning (Logan Gunthorpe) * tag 'dma-mapping-5.15-2' of git://git.infradead.org/users/hch/dma-mapping: dma-debug: teach add_dma_entry() about DMA_ATTR_SKIP_CPU_SYNC dma-debug: fix sg checks in debug_dma_map_sg() dma-mapping: fix the kerneldoc for dma_map_sgtable()

Linus Torvalds committed 5 years ago

Commit 515dcc22 parents 8e37395 c2bbf9d3 files · +48 −36Browse files

Unified · Split

3 files
  1. kernel/dma/debug.c +20 −16
  2. kernel/dma/debug.h +16 −8
  3. kernel/dma/mapping.c +12 −12
kernel/dma/debug.c+20−16
@@ -552,7 +552,7 @@ static void active_cacheline_remove(struct dma_debug_entry *entry) · 551 unmodified lines
552552 * Wrapper function for adding an entry to the hash.
553553 * This function takes care of locking itself.
554554 */
555−static void add_dma_entry(struct dma_debug_entry *entry)
555+static void add_dma_entry(struct dma_debug_entry *entry, unsigned long attrs)
556556 {
557557 struct hash_bucket *bucket;
558558 unsigned long flags;
@@ -566,7 +566,7 @@ static void add_dma_entry(struct dma_debug_entry *entry) · 7 unmodified lines
566566 if (rc == -ENOMEM) {
567567 pr_err("cacheline tracking ENOMEM, dma-debug disabled\n");
568568 global_disable = true;
569− } else if (rc == -EEXIST) {
569+ } else if (rc == -EEXIST && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) {
570570 err_printk(entry->dev, entry,
571571 "cacheline tracking EEXIST, overlapping mappings aren't supported\n");
572572 }
@@ -1191,7 +1191,8 @@ void debug_dma_map_single(struct device *dev, const void *addr, · 618 unmodified lines
11911191 EXPORT_SYMBOL(debug_dma_map_single);
11921192
11931193 void debug_dma_map_page(struct device *dev, struct page *page, size_t offset,
1194− size_t size, int direction, dma_addr_t dma_addr)
1194+ size_t size, int direction, dma_addr_t dma_addr,
1195+ unsigned long attrs)
11951196 {
11961197 struct dma_debug_entry *entry;
11971198
@@ -1222,7 +1223,7 @@ void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, · 24 unmodified lines
12221223 check_for_illegal_area(dev, addr, size);
12231224 }
12241225
1225− add_dma_entry(entry);
1226+ add_dma_entry(entry, attrs);
12261227 }
12271228
12281229 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, · 51 unmodified lines
12801281 }
12811282
12821283 void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
1283− int nents, int mapped_ents, int direction)
1284+ int nents, int mapped_ents, int direction,
1285+ unsigned long attrs)
12841286 {
12851287 struct dma_debug_entry *entry;
12861288 struct scatterlist *s;
@@ -1289,6 +1291,12 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg, · 2 unmodified lines
12891291 if (unlikely(dma_debug_disabled()))
12901292 return;
12911293
1294+ for_each_sg(sg, s, nents, i) {
1295+ check_for_stack(dev, sg_page(s), s->offset);
1296+ if (!PageHighMem(sg_page(s)))
1297+ check_for_illegal_area(dev, sg_virt(s), s->length);
1298+ }
1299+
12921300 for_each_sg(sg, s, mapped_ents, i) {
12931301 entry = dma_entry_alloc();
12941302 if (!entry)
@@ -1304,15 +1312,9 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg, · 9 unmodified lines
13041312 entry->sg_call_ents = nents;
13051313 entry->sg_mapped_ents = mapped_ents;
13061314
1307− check_for_stack(dev, sg_page(s), s->offset);
1308−
1309− if (!PageHighMem(sg_page(s))) {
1310− check_for_illegal_area(dev, sg_virt(s), sg_dma_len(s));
1311− }
1312−
13131315 check_sg_segment(dev, s);
13141316
1315− add_dma_entry(entry);
1317+ add_dma_entry(entry, attrs);
13161318 }
13171319 }
13181320
@@ -1368,7 +1370,8 @@ void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, · 49 unmodified lines
13681370 }
13691371
13701372 void debug_dma_alloc_coherent(struct device *dev, size_t size,
1371− dma_addr_t dma_addr, void *virt)
1373+ dma_addr_t dma_addr, void *virt,
1374+ unsigned long attrs)
13721375 {
13731376 struct dma_debug_entry *entry;
13741377
@@ -1398,7 +1401,7 @@ void debug_dma_alloc_coherent(struct device *dev, size_t size, · 23 unmodified lines
13981401 else
13991402 entry->pfn = page_to_pfn(virt_to_page(virt));
14001403
1401− add_dma_entry(entry);
1404+ add_dma_entry(entry, attrs);
14021405 }
14031406
14041407 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, · 24 unmodified lines
14291432 }
14301433
14311434 void debug_dma_map_resource(struct device *dev, phys_addr_t addr, size_t size,
1432− int direction, dma_addr_t dma_addr)
1435+ int direction, dma_addr_t dma_addr,
1436+ unsigned long attrs)
14331437 {
14341438 struct dma_debug_entry *entry;
14351439
@@ -1449,7 +1453,7 @@ void debug_dma_map_resource(struct device *dev, phys_addr_t addr, size_t size, · 13 unmodified lines
14491453 entry->direction = direction;
14501454 entry->map_err_type = MAP_ERR_NOT_CHECKED;
14511455
1452− add_dma_entry(entry);
1456+ add_dma_entry(entry, attrs);
14531457 }
14541458
14551459 void debug_dma_unmap_resource(struct device *dev, dma_addr_t dma_addr,
kernel/dma/debug.h+16−8
@@ -11,26 +11,30 @@ · 10 unmodified lines
1111 #ifdef CONFIG_DMA_API_DEBUG
1212 extern void debug_dma_map_page(struct device *dev, struct page *page,
1313 size_t offset, size_t size,
14− int direction, dma_addr_t dma_addr);
14+ int direction, dma_addr_t dma_addr,
15+ unsigned long attrs);
1516
1617 extern void debug_dma_unmap_page(struct device *dev, dma_addr_t addr,
1718 size_t size, int direction);
1819
1920 extern void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
20− int nents, int mapped_ents, int direction);
21+ int nents, int mapped_ents, int direction,
22+ unsigned long attrs);
2123
2224 extern void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
2325 int nelems, int dir);
2426
2527 extern void debug_dma_alloc_coherent(struct device *dev, size_t size,
26− dma_addr_t dma_addr, void *virt);
28+ dma_addr_t dma_addr, void *virt,
29+ unsigned long attrs);
2730
2831 extern void debug_dma_free_coherent(struct device *dev, size_t size,
2932 void *virt, dma_addr_t addr);
3033
3134 extern void debug_dma_map_resource(struct device *dev, phys_addr_t addr,
3235 size_t size, int direction,
33− dma_addr_t dma_addr);
36+ dma_addr_t dma_addr,
37+ unsigned long attrs);
3438
3539 extern void debug_dma_unmap_resource(struct device *dev, dma_addr_t dma_addr,
3640 size_t size, int direction);
@@ -53,7 +57,8 @@ extern void debug_dma_sync_sg_for_device(struct device *dev, · 16 unmodified lines
5357 #else /* CONFIG_DMA_API_DEBUG */
5458 static inline void debug_dma_map_page(struct device *dev, struct page *page,
5559 size_t offset, size_t size,
56− int direction, dma_addr_t dma_addr)
60+ int direction, dma_addr_t dma_addr,
61+ unsigned long attrs)
5762 {
5863 }
5964
@@ -63,7 +68,8 @@ static inline void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, · 3 unmodified lines
6368 }
6469
6570 static inline void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
66− int nents, int mapped_ents, int direction)
71+ int nents, int mapped_ents, int direction,
72+ unsigned long attrs)
6773 {
6874 }
6975
@@ -74,7 +80,8 @@ static inline void debug_dma_unmap_sg(struct device *dev, · 4 unmodified lines
7480 }
7581
7682 static inline void debug_dma_alloc_coherent(struct device *dev, size_t size,
77− dma_addr_t dma_addr, void *virt)
83+ dma_addr_t dma_addr, void *virt,
84+ unsigned long attrs)
7885 {
7986 }
8087
@@ -85,7 +92,8 @@ static inline void debug_dma_free_coherent(struct device *dev, size_t size, · 4 unmodified lines
8592
8693 static inline void debug_dma_map_resource(struct device *dev, phys_addr_t addr,
8794 size_t size, int direction,
88− dma_addr_t dma_addr)
95+ dma_addr_t dma_addr,
96+ unsigned long attrs)
8997 {
9098 }
9199
kernel/dma/mapping.c+12−12
@@ -156,7 +156,7 @@ dma_addr_t dma_map_page_attrs(struct device *dev, struct page *page, · 155 unmodified lines
156156 addr = dma_direct_map_page(dev, page, offset, size, dir, attrs);
157157 else
158158 addr = ops->map_page(dev, page, offset, size, dir, attrs);
159− debug_dma_map_page(dev, page, offset, size, dir, addr);
159+ debug_dma_map_page(dev, page, offset, size, dir, addr, attrs);
160160
161161 return addr;
162162 }
@@ -195,7 +195,7 @@ static int __dma_map_sg_attrs(struct device *dev, struct scatterlist *sg, · 32 unmodified lines
195195 ents = ops->map_sg(dev, sg, nents, dir, attrs);
196196
197197 if (ents > 0)
198− debug_dma_map_sg(dev, sg, nents, ents, dir);
198+ debug_dma_map_sg(dev, sg, nents, ents, dir, attrs);
199199 else if (WARN_ON_ONCE(ents != -EINVAL && ents != -ENOMEM &&
200200 ents != -EIO))
201201 return -EIO;
@@ -249,12 +249,12 @@ EXPORT_SYMBOL(dma_map_sg_attrs); · 47 unmodified lines
249249 * Returns 0 on success or a negative error code on error. The following
250250 * error codes are supported with the given meaning:
251251 *
252− * -EINVAL - An invalid argument, unaligned access or other error
253− * in usage. Will not succeed if retried.
254− * -ENOMEM - Insufficient resources (like memory or IOVA space) to
255− * complete the mapping. Should succeed if retried later.
256− * -EIO - Legacy error code with an unknown meaning. eg. this is
257− * returned if a lower level call returned DMA_MAPPING_ERROR.
252+ * -EINVAL An invalid argument, unaligned access or other error
253+ * in usage. Will not succeed if retried.
254+ * -ENOMEM Insufficient resources (like memory or IOVA space) to
255+ * complete the mapping. Should succeed if retried later.
256+ * -EIO Legacy error code with an unknown meaning. eg. this is
257+ * returned if a lower level call returned DMA_MAPPING_ERROR.
258258 */
259259 int dma_map_sgtable(struct device *dev, struct sg_table *sgt,
260260 enum dma_data_direction dir, unsigned long attrs)
@@ -305,7 +305,7 @@ dma_addr_t dma_map_resource(struct device *dev, phys_addr_t phys_addr, · 44 unmodified lines
305305 else if (ops->map_resource)
306306 addr = ops->map_resource(dev, phys_addr, size, dir, attrs);
307307
308− debug_dma_map_resource(dev, phys_addr, size, dir, addr);
308+ debug_dma_map_resource(dev, phys_addr, size, dir, addr, attrs);
309309 return addr;
310310 }
311311 EXPORT_SYMBOL(dma_map_resource);
@@ -510,7 +510,7 @@ void *dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle, · 198 unmodified lines
510510 else
511511 return NULL;
512512
513− debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr);
513+ debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr, attrs);
514514 return cpu_addr;
515515 }
516516 EXPORT_SYMBOL(dma_alloc_attrs);
@@ -566,7 +566,7 @@ struct page *dma_alloc_pages(struct device *dev, size_t size, · 49 unmodified lines
566566 struct page *page = __dma_alloc_pages(dev, size, dma_handle, dir, gfp);
567567
568568 if (page)
569− debug_dma_map_page(dev, page, 0, size, dir, *dma_handle);
569+ debug_dma_map_page(dev, page, 0, size, dir, *dma_handle, 0);
570570 return page;
571571 }
572572 EXPORT_SYMBOL_GPL(dma_alloc_pages);
@@ -644,7 +644,7 @@ struct sg_table *dma_alloc_noncontiguous(struct device *dev, size_t size, · 71 unmodified lines
644644
645645 if (sgt) {
646646 sgt->nents = 1;
647− debug_dma_map_sg(dev, sgt->sgl, sgt->orig_nents, 1, dir);
647+ debug_dma_map_sg(dev, sgt->sgl, sgt->orig_nents, 1, dir, attrs);
648648 }
649649 return sgt;
650650 }