Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137711130
D50248.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D50248.diff
View Options
diff --git a/sys/amd64/sgx/sgx.c b/sys/amd64/sgx/sgx.c
--- a/sys/amd64/sgx/sgx.c
+++ b/sys/amd64/sgx/sgx.c
@@ -191,9 +191,20 @@
vmem_free(sc->vmem_epc, addr, PAGE_SIZE);
}
+static void
+sgx_insert_epc_page_by_index(vm_page_t page, vm_object_t object,
+ vm_pindex_t pidx, struct pctrie_iter *pages)
+{
+
+ VM_OBJECT_ASSERT_WLOCKED(object);
+
+ page->valid = VM_PAGE_BITS_ALL;
+ vm_page_iter_insert(page, object, pidx, pages);
+}
+
static int
sgx_va_slot_init_by_index(struct sgx_softc *sc, vm_object_t object,
- uint64_t idx)
+ uint64_t idx, struct pctrie_iter *pages)
{
struct epc_page *epc;
vm_page_t page;
@@ -202,7 +213,7 @@
VM_OBJECT_ASSERT_WLOCKED(object);
- p = vm_page_lookup(object, idx);
+ p = vm_radix_iter_lookup(pages, idx);
if (p == NULL) {
ret = sgx_get_epc_page(sc, &epc);
if (ret) {
@@ -216,20 +227,16 @@
mtx_unlock(&sc->mtx_encls);
page = PHYS_TO_VM_PAGE(epc->phys);
-
- page->valid = VM_PAGE_BITS_ALL;
- vm_page_insert(page, object, idx);
+ sgx_insert_epc_page_by_index(page, object, idx, pages);
}
return (0);
}
static int
-sgx_va_slot_init(struct sgx_softc *sc,
- struct sgx_enclave *enclave,
- uint64_t addr)
+sgx_va_slot_init(struct sgx_softc *sc, struct sgx_enclave *enclave,
+ vm_pindex_t pidx, struct pctrie_iter *pages)
{
- vm_pindex_t pidx;
uint64_t va_page_idx;
uint64_t idx;
vm_object_t object;
@@ -239,12 +246,10 @@
VM_OBJECT_ASSERT_WLOCKED(object);
- pidx = OFF_TO_IDX(addr);
-
va_page_idx = pidx / SGX_VA_PAGE_SLOTS;
idx = - SGX_VA_PAGES_OFFS - va_page_idx;
- ret = sgx_va_slot_init_by_index(sc, object, idx);
+ ret = sgx_va_slot_init_by_index(sc, object, idx, pages);
return (ret);
}
@@ -614,19 +619,8 @@
};
static void
-sgx_insert_epc_page_by_index(vm_page_t page, vm_object_t object,
- vm_pindex_t pidx)
-{
-
- VM_OBJECT_ASSERT_WLOCKED(object);
-
- page->valid = VM_PAGE_BITS_ALL;
- vm_page_insert(page, object, pidx);
-}
-
-static void
-sgx_insert_epc_page(struct sgx_enclave *enclave,
- struct epc_page *epc, uint64_t addr)
+sgx_insert_epc_page(struct sgx_enclave *enclave, struct epc_page *epc,
+ uint64_t addr, struct pctrie_iter *pages)
{
vm_pindex_t pidx;
vm_page_t page;
@@ -636,12 +630,13 @@
pidx = OFF_TO_IDX(addr);
page = PHYS_TO_VM_PAGE(epc->phys);
- sgx_insert_epc_page_by_index(page, enclave->object, pidx);
+ sgx_insert_epc_page_by_index(page, enclave->object, pidx, pages);
}
static int
sgx_ioctl_create(struct sgx_softc *sc, struct sgx_enclave_create *param)
{
+ struct pctrie_iter pages;
struct sgx_vm_handle *vmh;
vm_map_entry_t entry;
vm_page_t p;
@@ -712,8 +707,9 @@
}
enclave->secs_epc_page = epc;
+ vm_page_iter_init(&pages, object);
VM_OBJECT_WLOCK(object);
- p = vm_page_lookup(object, SGX_SECS_VM_OBJECT_INDEX);
+ p = vm_radix_iter_lookup(&pages, SGX_SECS_VM_OBJECT_INDEX);
if (p) {
VM_OBJECT_WUNLOCK(object);
/* SECS page already added. */
@@ -722,7 +718,7 @@
}
ret = sgx_va_slot_init_by_index(sc, object,
- - SGX_VA_PAGES_OFFS - SGX_SECS_VM_OBJECT_INDEX);
+ - SGX_VA_PAGES_OFFS - SGX_SECS_VM_OBJECT_INDEX, &pages);
if (ret) {
VM_OBJECT_WUNLOCK(object);
dprintf("%s: Can't init va slot.\n", __func__);
@@ -762,7 +758,7 @@
page = PHYS_TO_VM_PAGE(epc->phys);
sgx_insert_epc_page_by_index(page, enclave->object,
- SGX_SECS_VM_OBJECT_INDEX);
+ SGX_SECS_VM_OBJECT_INDEX, &pages);
VM_OBJECT_WUNLOCK(object);
@@ -786,6 +782,7 @@
sgx_ioctl_add_page(struct sgx_softc *sc,
struct sgx_enclave_add_page *addp)
{
+ struct pctrie_iter pages;
struct epc_page *secs_epc_page;
struct sgx_enclave *enclave;
struct sgx_vm_handle *vmh;
@@ -857,8 +854,9 @@
addr = (addp->addr - vmh->base);
pidx = OFF_TO_IDX(addr);
+ vm_page_iter_init(&pages, object);
VM_OBJECT_WLOCK(object);
- p = vm_page_lookup(object, pidx);
+ p = vm_radix_iter_lookup(&pages, pidx);
if (p) {
VM_OBJECT_WUNLOCK(object);
/* Page already added. */
@@ -866,7 +864,7 @@
goto error;
}
- ret = sgx_va_slot_init(sc, enclave, addr);
+ ret = sgx_va_slot_init(sc, enclave, pidx, &pages);
if (ret) {
VM_OBJECT_WUNLOCK(object);
dprintf("%s: Can't init va slot.\n", __func__);
@@ -898,7 +896,7 @@
goto error;
}
- sgx_insert_epc_page(enclave, epc, addr);
+ sgx_insert_epc_page(enclave, epc, addr, &pages);
VM_OBJECT_WUNLOCK(object);
diff --git a/sys/arm/nvidia/drm2/tegra_bo.c b/sys/arm/nvidia/drm2/tegra_bo.c
--- a/sys/arm/nvidia/drm2/tegra_bo.c
+++ b/sys/arm/nvidia/drm2/tegra_bo.c
@@ -133,6 +133,7 @@
static int
tegra_bo_init_pager(struct tegra_bo *bo)
{
+ struct pctrie_iter pages;
vm_page_t m;
size_t size;
int i;
@@ -143,6 +144,7 @@
if (vmem_alloc(kernel_arena, size, M_WAITOK | M_BESTFIT, &bo->vbase))
return (ENOMEM);
+ vm_page_iter_init(&pages, bo->cdev_pager);
VM_OBJECT_WLOCK(bo->cdev_pager);
for (i = 0; i < bo->npages; i++) {
m = bo->m[i];
@@ -159,7 +161,7 @@
*/
m->oflags &= ~VPO_UNMANAGED;
m->flags |= PG_FICTITIOUS;
- if (vm_page_insert(m, bo->cdev_pager, i) != 0)
+ if (vm_page_iter_insert(m, bo->cdev_pager, i, &pages) != 0)
return (EINVAL);
}
VM_OBJECT_WUNLOCK(bo->cdev_pager);
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
@@ -296,23 +296,27 @@
lkpi_vmf_insert_pfn_prot_locked(struct vm_area_struct *vma, unsigned long addr,
unsigned long pfn, pgprot_t prot)
{
+ struct pctrie_iter pages;
vm_object_t vm_obj = vma->vm_obj;
vm_object_t tmp_obj;
vm_page_t page;
vm_pindex_t pindex;
VM_OBJECT_ASSERT_WLOCKED(vm_obj);
+ 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));
retry:
- page = vm_page_grab(vm_obj, pindex, VM_ALLOC_NOCREAT);
+ 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 (!vm_page_busy_acquire(page, VM_ALLOC_WAITFAIL))
+ if (!vm_page_busy_acquire(page, VM_ALLOC_WAITFAIL)) {
+ pctrie_iter_reset(&pages);
goto retry;
+ }
if (page->object != NULL) {
tmp_obj = page->object;
vm_page_xunbusy(page);
@@ -336,10 +340,11 @@
vm_page_remove(page);
}
VM_OBJECT_WUNLOCK(tmp_obj);
+ pctrie_iter_reset(&pages);
VM_OBJECT_WLOCK(vm_obj);
goto retry;
}
- if (vm_page_insert(page, vm_obj, pindex)) {
+ if (vm_page_iter_insert(page, vm_obj, pindex, &pages) != 0) {
vm_page_xunbusy(page);
return (VM_FAULT_OOM);
}
diff --git a/sys/dev/drm2/ttm/ttm_bo_vm.c b/sys/dev/drm2/ttm/ttm_bo_vm.c
--- a/sys/dev/drm2/ttm/ttm_bo_vm.c
+++ b/sys/dev/drm2/ttm/ttm_bo_vm.c
@@ -100,7 +100,7 @@
ttm_bo_vm_fault(vm_object_t vm_obj, vm_ooffset_t offset,
int prot, vm_page_t *mres)
{
-
+ struct pctrie_iter pages;
struct ttm_buffer_object *bo = vm_obj->handle;
struct ttm_bo_device *bdev = bo->bdev;
struct ttm_tt *ttm = NULL;
@@ -114,6 +114,7 @@
if (*mres != NULL) {
(void)vm_page_remove(*mres);
}
+ vm_page_iter_init(&pages, vm_obj);
retry:
VM_OBJECT_WUNLOCK(vm_obj);
m = NULL;
@@ -234,10 +235,12 @@
ttm_bo_unreserve(bo);
goto retry;
}
- m1 = vm_page_lookup(vm_obj, OFF_TO_IDX(offset));
+ pctrie_iter_reset(&pages);
+ m1 = vm_radix_iter_lookup(&pages, OFF_TO_IDX(offset));
/* XXX This looks like it should just be vm_page_replace? */
if (m1 == NULL) {
- if (vm_page_insert(m, vm_obj, OFF_TO_IDX(offset))) {
+ if (vm_page_iter_insert(
+ m, vm_obj, OFF_TO_IDX(offset), &pages) != 0) {
vm_page_xunbusy(m);
VM_OBJECT_WUNLOCK(vm_obj);
vm_wait(vm_obj);
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
@@ -653,6 +653,8 @@
void vm_page_invalid(vm_page_t m);
void vm_page_iter_free(struct pctrie_iter *pages, vm_page_t m);
void vm_page_iter_init(struct pctrie_iter *, vm_object_t);
+int vm_page_iter_insert(vm_page_t m, vm_object_t, vm_pindex_t,
+ struct pctrie_iter *);
void vm_page_iter_limit_init(struct pctrie_iter *, vm_object_t, vm_pindex_t);
bool vm_page_iter_remove(struct pctrie_iter *pages, vm_page_t m);
bool vm_page_iter_rename(struct pctrie_iter *old_pages, vm_page_t m,
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
@@ -1532,7 +1532,7 @@
*
* The object must be locked.
*/
-static int
+int
vm_page_iter_insert(vm_page_t m, vm_object_t object, vm_pindex_t pindex,
struct pctrie_iter *pages)
{
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Nov 26, 2:51 AM (13 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26195900
Default Alt Text
D50248.diff (8 KB)
Attached To
Mode
D50248: vm_page: make iter_insert() public
Attached
Detach File
Event Timeline
Log In to Comment