Skip to content

Commit

Permalink
swiotlb: replace kmap_atomic() with memcpy_{from,to}_page()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Fabio M. De Francesco authored and Christoph Hellwig committed Sep 20, 2022
1 parent 521a547 commit 1d61261
Showing 1 changed file with 4 additions and 6 deletions.
10 changes: 4 additions & 6 deletions kernel/dma/swiotlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -545,22 +545,20 @@ 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;

while (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;
Expand Down

0 comments on commit 1d61261

Please sign in to comment.