Skip to content

Commit ceb7b62

Browse files
Huan Yangvivekkreddy
authored andcommitted
Revert "udmabuf: fix vmap_udmabuf error page set"
This reverts commit 18d7de8. We cannot use vmap_pfn() in vmap_udmabuf() as it would fail the pfn_valid() check in vmap_pfn_apply(). This is because vmap_pfn() is intended to be used for mapping non-struct-page memory such as PCIe BARs. Since, udmabuf mostly works with pages/folios backed by shmem/hugetlbfs/THP, vmap_pfn() is not the right tool or API to invoke for implementing vmap. Signed-off-by: Huan Yang <link@vivo.com> Suggested-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Reported-by: Bingbu Cao <bingbu.cao@linux.intel.com> Closes: https://lore.kernel.org/dri-devel/eb7e0137-3508-4287-98c4-816c5fd98e10@vivo.com/T/#mbda4f64a3532b32e061f4e8763bc8e307bea3ca8 Acked-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Link: https://lore.kernel.org/r/20250428073831.19942-2-link@vivo.com
1 parent 549810e commit ceb7b62

2 files changed

Lines changed: 7 additions & 16 deletions

File tree

drivers/dma-buf/Kconfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ config UDMABUF
3636
depends on DMA_SHARED_BUFFER
3737
depends on MEMFD_CREATE || COMPILE_TEST
3838
depends on MMU
39-
select VMAP_PFN
4039
help
4140
A driver to let userspace turn memfd regions into dma-bufs.
4241
Qemu can use this to create host dmabufs for guest framebuffers.

drivers/dma-buf/udmabuf.c

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -109,29 +109,21 @@ static int mmap_udmabuf(struct dma_buf *buf, struct vm_area_struct *vma)
109109
static int vmap_udmabuf(struct dma_buf *buf, struct iosys_map *map)
110110
{
111111
struct udmabuf *ubuf = buf->priv;
112-
unsigned long *pfns;
112+
struct page **pages;
113113
void *vaddr;
114114
pgoff_t pg;
115115

116116
dma_resv_assert_held(buf->resv);
117117

118-
/**
119-
* HVO may free tail pages, so just use pfn to map each folio
120-
* into vmalloc area.
121-
*/
122-
pfns = kvmalloc_array(ubuf->pagecount, sizeof(*pfns), GFP_KERNEL);
123-
if (!pfns)
118+
pages = kvmalloc_array(ubuf->pagecount, sizeof(*pages), GFP_KERNEL);
119+
if (!pages)
124120
return -ENOMEM;
125121

126-
for (pg = 0; pg < ubuf->pagecount; pg++) {
127-
unsigned long pfn = folio_pfn(ubuf->folios[pg]);
128-
129-
pfn += ubuf->offsets[pg] >> PAGE_SHIFT;
130-
pfns[pg] = pfn;
131-
}
122+
for (pg = 0; pg < ubuf->pagecount; pg++)
123+
pages[pg] = &ubuf->folios[pg]->page;
132124

133-
vaddr = vmap_pfn(pfns, ubuf->pagecount, PAGE_KERNEL);
134-
kvfree(pfns);
125+
vaddr = vm_map_ram(pages, ubuf->pagecount, -1);
126+
kvfree(pages);
135127
if (!vaddr)
136128
return -EINVAL;
137129

0 commit comments

Comments
 (0)