Page MenuHomeFreeBSD

D54225.id168190.diff
No OneTemporary

D54225.id168190.diff

diff --git a/sys/compat/linuxkpi/common/include/linux/vmalloc.h b/sys/compat/linuxkpi/common/include/linux/vmalloc.h
--- a/sys/compat/linuxkpi/common/include/linux/vmalloc.h
+++ b/sys/compat/linuxkpi/common/include/linux/vmalloc.h
@@ -35,8 +35,11 @@
#define VM_MAP 0x0000
#define PAGE_KERNEL 0x0000
+#define vmap_pfn(...) linuxkpi_vmap_pfn(__VA_ARGS__)
+
void *vmap(struct page **pages, unsigned int count, unsigned long flags,
int prot);
+void *linuxkpi_vmap_pfn(unsigned long *pfns, unsigned int count, int prot);
void vunmap(void *addr);
#endif /* _LINUXKPI_LINUX_VMALLOC_H_ */
diff --git a/sys/compat/linuxkpi/common/src/linux_page.c b/sys/compat/linuxkpi/common/src/linux_page.c
--- a/sys/compat/linuxkpi/common/src/linux_page.c
+++ b/sys/compat/linuxkpi/common/src/linux_page.c
@@ -341,6 +341,16 @@
int
is_vmalloc_addr(const void *addr)
{
+ struct vmmap *vmmap;
+
+ mtx_lock(&vmmaplock);
+ LIST_FOREACH(vmmap, &vmmaphead[VM_HASH(addr)], vm_next)
+ if (addr == vmmap->vm_addr)
+ break;
+ mtx_unlock(&vmmaplock);
+ if (vmmap != NULL)
+ return(1);
+
return (vtoslab((vm_offset_t)addr & ~UMA_SLAB_MASK) != NULL);
}
@@ -418,6 +428,46 @@
return ((void *)off);
}
+void *
+linuxkpi_vmap_pfn(unsigned long *pfns, unsigned int count, int prot)
+{
+ vm_page_t m, *ma, fma;
+ vm_offset_t off;
+ vm_paddr_t pa;
+ vm_memattr_t attr;
+ size_t size;
+ unsigned int i;
+
+ size = count * PAGE_SIZE;
+ off = kva_alloc(size);
+ if (off == 0)
+ return (NULL);
+ vmmap_add((void *)off, size);
+
+ attr = pgprot2cachemode(prot);
+ ma = mallocarray(count, sizeof(vm_page_t), M_TEMP, M_WAITOK | M_ZERO);
+ fma = NULL;
+ for (i = 0; i < count; i++) {
+ pa = IDX_TO_OFF(pfns[i]);
+ m = PHYS_TO_VM_PAGE(pa);
+ if (m == NULL) {
+ if (fma == NULL)
+ fma = mallocarray(count, sizeof(struct vm_page),
+ M_TEMP, M_WAITOK | M_ZERO);
+ m = fma + i;
+ vm_page_initfake(m, pa, attr);
+ } else {
+ pmap_page_set_memattr(m, attr);
+ }
+ ma[i] = m;
+ }
+ pmap_qenter(off, ma, count);
+ free(fma, M_TEMP);
+ free(ma, M_TEMP);
+
+ return ((void *)off);
+}
+
void
vunmap(void *addr)
{

File Metadata

Mime Type
text/plain
Expires
Thu, Sep 17, 5:00 PM (16 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
39094571
Default Alt Text
D54225.id168190.diff (2 KB)

Event Timeline