vm_object: Make is_object_active() global

Commit 867c27c23a modified the NFS client so that
it does IO_APPEND writes directly to the NFS server,
bypassing the buffer cache.  However, this could result
in stale data in client pages when the file is mmap(2)'d.
As such, the NFS client needs to call is_object_active()
to check if the file is mmap(2)'d.

This patch renames is_object_active() to vm_object_is_active(),
moves it to sys/vm/vm_object.c and makes it global, so that
the NFS client can call it in a future commit.

Reviewed by:	kib
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D33520
This commit is contained in:
Rick Macklem 2021-12-19 16:11:44 -08:00
parent 71d2d5adfe
commit cd37afd8b6
3 changed files with 18 additions and 17 deletions

View File

@ -142,21 +142,6 @@ SYSCTL_PROC(_vm, VM_LOADAVG, loadavg, CTLTYPE_STRUCT | CTLFLAG_RD |
CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_loadavg, "S,loadavg",
"Machine loadaverage history");
/*
* This function aims to determine if the object is mapped,
* specifically, if it is referenced by a vm_map_entry. Because
* objects occasionally acquire transient references that do not
* represent a mapping, the method used here is inexact. However, it
* has very low overhead and is good enough for the advisory
* vm.vmtotal sysctl.
*/
static bool
is_object_active(vm_object_t obj)
{
return (obj->ref_count > obj->shadow_count);
}
#if defined(COMPAT_FREEBSD11)
struct vmtotal11 {
int16_t t_rq;
@ -268,7 +253,7 @@ vmtotal(SYSCTL_HANDLER_ARGS)
}
total.t_vm += object->size;
total.t_rm += object->resident_page_count;
if (is_object_active(object)) {
if (vm_object_is_active(object)) {
total.t_avm += object->size;
total.t_arm += object->resident_page_count;
}
@ -276,7 +261,7 @@ vmtotal(SYSCTL_HANDLER_ARGS)
/* shared object */
total.t_vmshr += object->size;
total.t_rmshr += object->resident_page_count;
if (is_object_active(object)) {
if (vm_object_is_active(object)) {
total.t_avmshr += object->size;
total.t_armshr += object->resident_page_count;
}

View File

@ -2498,6 +2498,21 @@ vm_object_busy_wait(vm_object_t obj, const char *wmesg)
(void)blockcount_sleep(&obj->busy, NULL, wmesg, PVM);
}
/*
* This function aims to determine if the object is mapped,
* specifically, if it is referenced by a vm_map_entry. Because
* objects occasionally acquire transient references that do not
* represent a mapping, the method used here is inexact. However, it
* has very low overhead and is good enough for the advisory
* vm.vmtotal sysctl.
*/
bool
vm_object_is_active(vm_object_t obj)
{
return (obj->ref_count > obj->shadow_count);
}
static int
vm_object_list_handler(struct sysctl_req *req, bool swap_only)
{

View File

@ -391,6 +391,7 @@ boolean_t vm_object_sync(vm_object_t, vm_ooffset_t, vm_size_t, boolean_t,
void vm_object_unwire(vm_object_t object, vm_ooffset_t offset,
vm_size_t length, uint8_t queue);
struct vnode *vm_object_vnode(vm_object_t object);
bool vm_object_is_active(vm_object_t obj);
#endif /* _KERNEL */
#endif /* _VM_OBJECT_ */