Skip to content

Commit 515dcc2

Browse files
committed
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()
2 parents 8e37395 + c2bbf9d commit 515dcc2

File tree

3 files changed

+48
-36
lines changed

3 files changed

+48
-36
lines changed

kernel/dma/debug.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ static void active_cacheline_remove(struct dma_debug_entry *entry)
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)
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,
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,
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,
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,
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,
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,
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,
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,
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,
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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,30 @@
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,
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,
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,
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,
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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ dma_addr_t dma_map_page_attrs(struct device *dev, struct page *page,
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,
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);
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,
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,
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,
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,
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
}

0 commit comments

Comments
 (0)