swiotlb: replace kmap_atomic() with memcpy_{from,to}_page()
authorFabio M. De Francesco <fmdefrancesco@gmail.com>
Thu, 1 Sep 2022 13:29:06 +0000 (15:29 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 20 Sep 2022 06:42:44 +0000 (08:42 +0200)
The use of kmap_atomic() is being deprecated in favor of
kmap_local_page(), which can also be used in atomic context (including
interrupts).

Replace kmap_atomic() with kmap_local_page(). Instead of open coding
mapping, memcpy(), and un-mapping, use the memcpy_{from,to}_page() helper.

Suggested-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
kernel/dma/swiotlb.c

index 0ef6b12..c54da87 100644 (file)
@@ -545,9 +545,8 @@ static void swiotlb_bounce(struct device *dev, phys_addr_t tlb_addr, size_t size
        }
 
        if (PageHighMem(pfn_to_page(pfn))) {
-               /* The buffer does not have a mapping.  Map it in and copy */
                unsigned int offset = orig_addr & ~PAGE_MASK;
-               char *buffer;
+               struct page *page;
                unsigned int sz = 0;
                unsigned long flags;
 
@@ -555,12 +554,11 @@ static void swiotlb_bounce(struct device *dev, phys_addr_t tlb_addr, size_t size
                        sz = min_t(size_t, PAGE_SIZE - offset, size);
 
                        local_irq_save(flags);
-                       buffer = kmap_atomic(pfn_to_page(pfn));
+                       page = pfn_to_page(pfn);
                        if (dir == DMA_TO_DEVICE)
-                               memcpy(vaddr, buffer + offset, sz);
+                               memcpy_from_page(vaddr, page, offset, sz);
                        else
-                               memcpy(buffer + offset, vaddr, sz);
-                       kunmap_atomic(buffer);
+                               memcpy_to_page(page, offset, vaddr, sz);
                        local_irq_restore(flags);
 
                        size -= sz;