Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F163422081
D58018.id181297.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D58018.id181297.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D58018: vm: add vm_object' page insertion and removal events hooks
Attached
Detach File
Event Timeline
Log In to Comment