From 2ad6fea03249ea89489d5d7ca51e5e25c123042d Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sat, 1 May 2021 03:43:08 +0300 Subject: Add pgo_mightbedirty method (cherry picked from commit c23c555bc15ce1523b95fb8da99ae77c0bb0977e) --- sys/vm/swap_pager.c | 10 ++++++++++ sys/vm/vm_object.c | 6 ++++++ sys/vm/vm_object.h | 17 ++--------------- sys/vm/vm_pager.c | 10 ++++++++++ sys/vm/vm_pager.h | 2 ++ sys/vm/vnode_pager.c | 1 + 6 files changed, 31 insertions(+), 15 deletions(-) (limited to 'sys/vm') diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 8ccc3a6710e0..7cfce53aba79 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -434,6 +434,7 @@ static void swap_pager_update_writecount(vm_object_t object, static void swap_pager_release_writecount(vm_object_t object, vm_offset_t start, vm_offset_t end); static void swap_pager_set_writeable_dirty(vm_object_t object); +static bool swap_pager_mightbedirty(vm_object_t object); struct pagerops swappagerops = { .pgo_init = swap_pager_init, /* early system initialization of pager */ @@ -447,6 +448,7 @@ struct pagerops swappagerops = { .pgo_update_writecount = swap_pager_update_writecount, .pgo_release_writecount = swap_pager_release_writecount, .pgo_set_writeable_dirty = swap_pager_set_writeable_dirty, + .pgo_mightbedirty = swap_pager_mightbedirty, }; /* @@ -3136,3 +3138,11 @@ swap_pager_set_writeable_dirty(vm_object_t object) if ((object->flags & OBJ_TMPFS_NODE) != 0) vm_object_set_writeable_dirty_(object); } + +static bool +swap_pager_mightbedirty(vm_object_t object) +{ + if ((object->flags & OBJ_TMPFS_NODE) != 0) + return (vm_object_mightbedirty_(object)); + return (false); +} diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 46b43e8cee14..b601bff33ff4 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -2337,6 +2337,12 @@ vm_object_set_writeable_dirty_(vm_object_t object) atomic_add_int(&object->generation, 1); } +bool +vm_object_mightbedirty_(vm_object_t object) +{ + return (object->generation != object->cleangeneration); +} + /* * vm_object_unwire: * diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index 93380d904526..c7bbec0e7a86 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -330,21 +330,6 @@ vm_object_reserv(vm_object_t object) return (false); } -static __inline bool -vm_object_mightbedirty(vm_object_t object) -{ - - if (object->type != OBJT_VNODE) { - if ((object->flags & OBJ_TMPFS_NODE) == 0) - return (false); -#ifdef KASSERT - KASSERT(object->type == OBJT_SWAP, - ("TMPFS_NODE obj %p is not swap", object)); -#endif - } - return (object->generation != object->cleangeneration); -} - 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); @@ -379,6 +364,8 @@ void vm_object_destroy (vm_object_t); void vm_object_terminate (vm_object_t); void vm_object_set_writeable_dirty (vm_object_t); void vm_object_set_writeable_dirty_(vm_object_t object); +bool vm_object_mightbedirty(vm_object_t object); +bool vm_object_mightbedirty_(vm_object_t object); void vm_object_init (void); int vm_object_kvme_type(vm_object_t object, struct vnode **vpp); void vm_object_madvise(vm_object_t, vm_pindex_t, vm_pindex_t, int); diff --git a/sys/vm/vm_pager.c b/sys/vm/vm_pager.c index 258c06fd3947..b113ce569e14 100644 --- a/sys/vm/vm_pager.c +++ b/sys/vm/vm_pager.c @@ -508,3 +508,13 @@ vm_object_set_writeable_dirty(vm_object_t object) method(object); } +bool +vm_object_mightbedirty(vm_object_t object) +{ + pgo_mightbedirty_t *method; + + method = pagertab[object->type]->pgo_mightbedirty; + if (method == NULL) + return (false); + return (method(object)); +} diff --git a/sys/vm/vm_pager.h b/sys/vm/vm_pager.h index e17e29ea961f..014a67c2e055 100644 --- a/sys/vm/vm_pager.h +++ b/sys/vm/vm_pager.h @@ -63,6 +63,7 @@ typedef int pgo_populate_t(vm_object_t, vm_pindex_t, int, vm_prot_t, typedef void pgo_pageunswapped_t(vm_page_t); typedef void pgo_writecount_t(vm_object_t, vm_offset_t, vm_offset_t); typedef void pgo_set_writeable_dirty_t(vm_object_t); +typedef bool pgo_mightbedirty_t(vm_object_t); struct pagerops { pgo_init_t *pgo_init; /* Initialize pager. */ @@ -77,6 +78,7 @@ struct pagerops { pgo_writecount_t *pgo_update_writecount; pgo_writecount_t *pgo_release_writecount; pgo_set_writeable_dirty_t *pgo_set_writeable_dirty; + pgo_mightbedirty_t *pgo_mightbedirty; }; extern struct pagerops defaultpagerops; diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 619121b672eb..5e89d91548fd 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -116,6 +116,7 @@ struct pagerops vnodepagerops = { .pgo_update_writecount = vnode_pager_update_writecount, .pgo_release_writecount = vnode_pager_release_writecount, .pgo_set_writeable_dirty = vm_object_set_writeable_dirty_, + .pgo_mightbedirty = vm_object_mightbedirty_, }; static struct domainset *vnode_domainset = NULL; -- cgit v1.2.3