Changeset View
Changeset View
Standalone View
Standalone View
head/sys/compat/linuxkpi/common/src/linux_page.c
Show First 20 Lines • Show All 280 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
vm_page_t page; | vm_page_t page; | ||||
int rv; | int rv; | ||||
if ((gfp & GFP_NOWAIT) != 0) | if ((gfp & GFP_NOWAIT) != 0) | ||||
panic("GFP_NOWAIT is unimplemented"); | panic("GFP_NOWAIT is unimplemented"); | ||||
VM_OBJECT_WLOCK(obj); | VM_OBJECT_WLOCK(obj); | ||||
page = vm_page_grab(obj, pindex, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | | rv = vm_page_grab_valid(&page, obj, pindex, VM_ALLOC_NORMAL | | ||||
VM_ALLOC_WIRED); | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED); | ||||
if (page->valid != VM_PAGE_BITS_ALL) { | |||||
vm_page_xbusy(page); | |||||
if (vm_pager_has_page(obj, pindex, NULL, NULL)) { | |||||
rv = vm_pager_get_pages(obj, &page, 1, NULL, NULL); | |||||
if (rv != VM_PAGER_OK) { | |||||
vm_page_unwire_noq(page); | |||||
vm_page_free(page); | |||||
VM_OBJECT_WUNLOCK(obj); | VM_OBJECT_WUNLOCK(obj); | ||||
if (rv != VM_PAGER_OK) | |||||
return (ERR_PTR(-EINVAL)); | return (ERR_PTR(-EINVAL)); | ||||
} | |||||
MPASS(page->valid == VM_PAGE_BITS_ALL); | |||||
} else { | |||||
pmap_zero_page(page); | |||||
page->valid = VM_PAGE_BITS_ALL; | |||||
page->dirty = 0; | |||||
} | |||||
vm_page_xunbusy(page); | |||||
} | |||||
VM_OBJECT_WUNLOCK(obj); | |||||
return (page); | return (page); | ||||
} | } | ||||
struct linux_file * | struct linux_file * | ||||
linux_shmem_file_setup(const char *name, loff_t size, unsigned long flags) | linux_shmem_file_setup(const char *name, loff_t size, unsigned long flags) | ||||
{ | { | ||||
struct fileobj { | struct fileobj { | ||||
struct linux_file file __aligned(sizeof(void *)); | struct linux_file file __aligned(sizeof(void *)); | ||||
▲ Show 20 Lines • Show All 59 Lines • Show Last 20 Lines |