Page MenuHomeFreeBSD

D58018.id181297.diff
No OneTemporary

D58018.id181297.diff

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
@@ -163,6 +163,7 @@
m->flags |= PG_FICTITIOUS;
if (vm_page_iter_insert(m, bo->cdev_pager, i, &pages) != 0)
return (EINVAL);
+ vm_object_after_page_insert(bo->cdev_pager, m);
}
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
@@ -564,6 +564,7 @@
return (VM_FAULT_OOM);
}
vm_page_valid(page);
+ vm_object_after_page_insert(vm_obj, page);
}
pmap_page_set_memattr(page, pgprot2cachemode(prot));
vma->vm_pfn_count++;
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
@@ -251,12 +251,14 @@
ttm_bo_unreserve(bo);
goto retry;
}
+ vm_page_valid(m);
+ vm_object_after_page_insert(vm_obj, m);
} else {
KASSERT(m == m1,
("inconsistent insert bo %p m %p m1 %p offset %jx",
bo, m, m1, (uintmax_t)offset));
+ vm_page_valid(m);
}
- vm_page_valid(m);
if (*mres != NULL) {
KASSERT(*mres != m, ("losing %p %p", *mres, m));
vm_page_xunbusy(*mres);
diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h
--- a/sys/vm/vm_object.h
+++ b/sys/vm/vm_object.h
@@ -93,6 +93,8 @@
#define VM_PAGE_HAVE_PGLIST
#endif
+struct vm_object_page_hooks;
+
struct vm_object {
struct rwlock lock;
TAILQ_ENTRY(vm_object) object_list; /* list of all objects */
@@ -117,6 +119,8 @@
TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager type */
LIST_HEAD(, vm_reserv) rvq; /* list of reservations */
void *handle;
+ const struct vm_object_page_events *pge; /* Callbacks called on page
+ lifetime events in the object */
union {
/*
* VNode pager
@@ -330,6 +334,25 @@
return (false);
}
+struct vm_object_page_events {
+ void (*vm_pge_after_insert)(vm_object_t obj, vm_page_t m);
+ void (*vm_pge_before_removal)(vm_object_t obj, vm_page_t m);
+};
+
+static __inline void
+vm_object_after_page_insert(vm_object_t obj, vm_page_t m)
+{
+ if (obj->pge != NULL)
+ obj->pge->vm_pge_after_insert(obj, m);
+}
+
+static __inline void
+vm_object_before_page_removal(vm_object_t obj, vm_page_t m)
+{
+ if (obj->pge != NULL)
+ obj->pge->vm_pge_before_removal(obj, m);
+}
+
void vm_object_clear_flag(vm_object_t object, u_short bits);
void vm_object_pip_add(vm_object_t object, short i);
void vm_object_pip_wakeup(vm_object_t object);
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -257,6 +257,7 @@
object->handle = handle;
object->backing_object = NULL;
object->backing_object_offset = (vm_ooffset_t) 0;
+ object->pge = NULL;
#if VM_NRESERVLEVEL > 0
LIST_INIT(&object->rvq);
#endif
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
@@ -1710,6 +1710,7 @@
{
bool dropped;
+ vm_object_before_page_removal(m->object, m);
dropped = vm_page_remove_xbusy(m);
vm_page_xunbusy(m);
@@ -2238,6 +2239,7 @@
(object->flags & OBJ_FICTITIOUS) == 0)
pmap_page_set_memattr(m, object->memattr);
+ vm_object_after_page_insert(object, m);
return (m);
}
@@ -2447,6 +2449,7 @@
}
if (memattr != VM_MEMATTR_DEFAULT)
pmap_page_set_memattr(m, memattr);
+ vm_object_after_page_insert(object, m);
pindex++;
}
return (m_ret);

File Metadata

Mime Type
text/plain
Expires
Fri, Jul 24, 2:04 AM (15 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35424717
Default Alt Text
D58018.id181297.diff (3 KB)

Event Timeline