Page MenuHomeFreeBSD

D59883.diff
No OneTemporary

D59883.diff

diff --git a/sys/compat/linuxkpi/common/include/linux/mm.h b/sys/compat/linuxkpi/common/include/linux/mm.h
--- a/sys/compat/linuxkpi/common/include/linux/mm.h
+++ b/sys/compat/linuxkpi/common/include/linux/mm.h
@@ -221,6 +221,9 @@
lkpi_vmf_insert_pfn_prot_locked(struct vm_area_struct *vma, unsigned long addr,
unsigned long pfn, pgprot_t prot);
+vm_fault_t lkpi_vmf_insert_special_pte_locked(struct vm_area_struct *vma,
+ unsigned long addr, unsigned long pfn, pgprot_t prot);
+
static inline vm_fault_t
vmf_insert_pfn_prot(struct vm_area_struct *vma, unsigned long addr,
unsigned long pfn, pgprot_t prot)
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
@@ -654,6 +654,48 @@
return (0);
}
+vm_fault_t
+lkpi_vmf_insert_special_pte_locked(struct vm_area_struct *vma,
+ unsigned long addr, unsigned long pfn, pgprot_t prot)
+{
+ struct pctrie_iter pages;
+ vm_object_t vm_obj;
+ vm_page_t fake_page, page;
+ vm_pindex_t pindex;
+
+ if (addr < vma->vm_start || addr >= vma->vm_end)
+ return (VM_FAULT_SIGBUS);
+
+ vm_obj = vma->vm_obj;
+ VM_OBJECT_ASSERT_WLOCKED(vm_obj);
+ MPASS(vm_obj->type == OBJT_MGTDEVICE);
+
+ vm_page_iter_init(&pages, vm_obj);
+ pindex = OFF_TO_IDX(addr - vma->vm_start);
+ if (vma->vm_pfn_count == 0)
+ vma->vm_pfn_first = pindex;
+ MPASS(pindex < OFF_TO_IDX(vma->vm_end));
+
+ page = vm_page_grab_iter(vm_obj, pindex, VM_ALLOC_NOCREAT, &pages);
+ if (page == NULL) {
+ page = PHYS_TO_VM_PAGE(IDX_TO_OFF(pfn));
+ if (page == NULL)
+ return (VM_FAULT_SIGBUS);
+ fake_page = vm_page_getfake_nowait(VM_PAGE_TO_PHYS(page),
+ pgprot2cachemode(prot));
+ if (fake_page == NULL)
+ return (VM_FAULT_OOM);
+ if (vm_page_iter_insert(fake_page, vm_obj, pindex, &pages) !=
+ 0) {
+ vm_page_putfake(fake_page);
+ return (VM_FAULT_OOM);
+ }
+ vm_page_valid(fake_page);
+ }
+ vma->vm_pfn_count++;
+ return (VM_FAULT_NOPAGE);
+}
+
int
lkpi_io_mapping_map_user(struct io_mapping *iomap,
struct vm_area_struct *vma, unsigned long addr,
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -592,6 +592,7 @@
int vm_page_free_pages_toq(struct spglist *free, bool update_wire_count);
void vm_page_free_zero(vm_page_t m);
vm_page_t vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr);
+vm_page_t vm_page_getfake_nowait(vm_paddr_t paddr, vm_memattr_t memattr);
int vm_page_grab_zero_partial(vm_object_t object, vm_pindex_t pindex, int base,
int end);
vm_page_t vm_page_grab(vm_object_t, vm_pindex_t, int);
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -1325,6 +1325,16 @@
#endif
}
+static vm_page_t
+vm_page_getfake_mallocf(vm_paddr_t paddr, vm_memattr_t memattr, int mallocf)
+{
+ vm_page_t m;
+
+ m = uma_zalloc(fakepg_zone, mallocf | M_ZERO);
+ vm_page_initfake(m, paddr, memattr);
+ return (m);
+}
+
/*
* vm_page_getfake:
*
@@ -1335,11 +1345,13 @@
vm_page_t
vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr)
{
- vm_page_t m;
+ return (vm_page_getfake_mallocf(paddr, memattr, M_WAITOK));
+}
- m = uma_zalloc(fakepg_zone, M_WAITOK | M_ZERO);
- vm_page_initfake(m, paddr, memattr);
- return (m);
+vm_page_t
+vm_page_getfake_nowait(vm_paddr_t paddr, vm_memattr_t memattr)
+{
+ return (vm_page_getfake_mallocf(paddr, memattr, M_NOWAIT));
}
void

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 17, 5:47 PM (4 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40945901
Default Alt Text
D59883.diff (3 KB)

Event Timeline