mirror of https://github.com/torvalds/linux.git
kmsan: convert kmsan_handle_dma to use physical addresses
Convert the KMSAN DMA handling function from page-based to physical address-based interface. The refactoring renames kmsan_handle_dma() parameters from accepting (struct page *page, size_t offset, size_t size) to (phys_addr_t phys, size_t size). The existing semantics where callers are expected to provide only kmap memory is continued here. Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Link: https://lore.kernel.org/r/3557cbaf66e935bc794f37d2b891ef75cbf2c80c.1757423202.git.leonro@nvidia.com
This commit is contained in:
parent
e53d29f957
commit
6eb1e769b2
|
|
@ -378,7 +378,7 @@ static int vring_map_one_sg(const struct vring_virtqueue *vq, struct scatterlist
|
||||||
* is initialized by the hardware. Explicitly check/unpoison it
|
* is initialized by the hardware. Explicitly check/unpoison it
|
||||||
* depending on the direction.
|
* depending on the direction.
|
||||||
*/
|
*/
|
||||||
kmsan_handle_dma(sg_page(sg), sg->offset, sg->length, direction);
|
kmsan_handle_dma(sg_phys(sg), sg->length, direction);
|
||||||
*addr = (dma_addr_t)sg_phys(sg);
|
*addr = (dma_addr_t)sg_phys(sg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -3157,7 +3157,7 @@ dma_addr_t virtqueue_dma_map_single_attrs(struct virtqueue *_vq, void *ptr,
|
||||||
struct vring_virtqueue *vq = to_vvq(_vq);
|
struct vring_virtqueue *vq = to_vvq(_vq);
|
||||||
|
|
||||||
if (!vq->use_dma_api) {
|
if (!vq->use_dma_api) {
|
||||||
kmsan_handle_dma(virt_to_page(ptr), offset_in_page(ptr), size, dir);
|
kmsan_handle_dma(virt_to_phys(ptr), size, dir);
|
||||||
return (dma_addr_t)virt_to_phys(ptr);
|
return (dma_addr_t)virt_to_phys(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -182,8 +182,7 @@ void kmsan_iounmap_page_range(unsigned long start, unsigned long end);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kmsan_handle_dma() - Handle a DMA data transfer.
|
* kmsan_handle_dma() - Handle a DMA data transfer.
|
||||||
* @page: first page of the buffer.
|
* @phys: physical address of the buffer.
|
||||||
* @offset: offset of the buffer within the first page.
|
|
||||||
* @size: buffer size.
|
* @size: buffer size.
|
||||||
* @dir: one of possible dma_data_direction values.
|
* @dir: one of possible dma_data_direction values.
|
||||||
*
|
*
|
||||||
|
|
@ -192,7 +191,7 @@ void kmsan_iounmap_page_range(unsigned long start, unsigned long end);
|
||||||
* * initializes the buffer, if it is copied from device;
|
* * initializes the buffer, if it is copied from device;
|
||||||
* * does both, if this is a DMA_BIDIRECTIONAL transfer.
|
* * does both, if this is a DMA_BIDIRECTIONAL transfer.
|
||||||
*/
|
*/
|
||||||
void kmsan_handle_dma(struct page *page, size_t offset, size_t size,
|
void kmsan_handle_dma(phys_addr_t phys, size_t size,
|
||||||
enum dma_data_direction dir);
|
enum dma_data_direction dir);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -372,8 +371,8 @@ static inline void kmsan_iounmap_page_range(unsigned long start,
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void kmsan_handle_dma(struct page *page, size_t offset,
|
static inline void kmsan_handle_dma(phys_addr_t phys, size_t size,
|
||||||
size_t size, enum dma_data_direction dir)
|
enum dma_data_direction dir)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,8 @@ dma_addr_t dma_map_page_attrs(struct device *dev, struct page *page,
|
||||||
addr = iommu_dma_map_phys(dev, phys, size, dir, attrs);
|
addr = iommu_dma_map_phys(dev, phys, size, dir, attrs);
|
||||||
else
|
else
|
||||||
addr = ops->map_page(dev, page, offset, size, dir, attrs);
|
addr = ops->map_page(dev, page, offset, size, dir, attrs);
|
||||||
kmsan_handle_dma(page, offset, size, dir);
|
|
||||||
|
kmsan_handle_dma(phys, size, dir);
|
||||||
trace_dma_map_phys(dev, phys, addr, size, dir, attrs);
|
trace_dma_map_phys(dev, phys, addr, size, dir, attrs);
|
||||||
debug_dma_map_phys(dev, phys, size, dir, addr, attrs);
|
debug_dma_map_phys(dev, phys, size, dir, addr, attrs);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -336,14 +336,16 @@ static void kmsan_handle_dma_page(const void *addr, size_t size,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper function to handle DMA data transfers. */
|
/* Helper function to handle DMA data transfers. */
|
||||||
void kmsan_handle_dma(struct page *page, size_t offset, size_t size,
|
void kmsan_handle_dma(phys_addr_t phys, size_t size,
|
||||||
enum dma_data_direction dir)
|
enum dma_data_direction dir)
|
||||||
{
|
{
|
||||||
u64 page_offset, to_go, addr;
|
struct page *page = phys_to_page(phys);
|
||||||
|
u64 page_offset, to_go;
|
||||||
|
void *addr;
|
||||||
|
|
||||||
if (PageHighMem(page))
|
if (PhysHighMem(phys))
|
||||||
return;
|
return;
|
||||||
addr = (u64)page_address(page) + offset;
|
addr = page_to_virt(page);
|
||||||
/*
|
/*
|
||||||
* The kernel may occasionally give us adjacent DMA pages not belonging
|
* The kernel may occasionally give us adjacent DMA pages not belonging
|
||||||
* to the same allocation. Process them separately to avoid triggering
|
* to the same allocation. Process them separately to avoid triggering
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
|
|
||||||
inline void kmsan_handle_dma(struct page *page, size_t offset, size_t size,
|
inline void kmsan_handle_dma(phys_addr_t phys, size_t size,
|
||||||
enum dma_data_direction dir)
|
enum dma_data_direction dir)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue