FreeBSD: use vnlru_free_vfsops if available

Fixes issues when zfs is used along with other filesystems.

External-issue: https://cgit.freebsd.org/src/commit/?id=e9272225e6bed840b00eef1c817b188c172338ee
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
Closes #11881
This commit is contained in:
Mateusz Guzik 2021-04-12 20:01:46 +02:00 committed by Brian Behlendorf
parent a6b82cc0bb
commit 2aa0d643fd
1 changed files with 21 additions and 1 deletions

View File

@ -51,6 +51,11 @@
#include <sys/vm.h> #include <sys/vm.h>
#include <sys/vmmeter.h> #include <sys/vmmeter.h>
#if __FreeBSD_version >= 1300139
static struct sx arc_vnlru_lock;
static struct vnode *arc_vnlru_marker;
#endif
extern struct vfsops zfs_vfsops; extern struct vfsops zfs_vfsops;
uint_t zfs_arc_free_target = 0; uint_t zfs_arc_free_target = 0;
@ -157,7 +162,13 @@ arc_prune_task(void *arg)
arc_reduce_target_size(ptob(nr_scan)); arc_reduce_target_size(ptob(nr_scan));
free(arg, M_TEMP); free(arg, M_TEMP);
#if __FreeBSD_version >= 1300139
sx_xlock(&arc_vnlru_lock);
vnlru_free_vfsops(nr_scan, &zfs_vfsops, arc_vnlru_marker);
sx_xunlock(&arc_vnlru_lock);
#else
vnlru_free(nr_scan, &zfs_vfsops); vnlru_free(nr_scan, &zfs_vfsops);
#endif
} }
/* /*
@ -234,7 +245,10 @@ arc_lowmem_init(void)
{ {
arc_event_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, arc_lowmem, NULL, arc_event_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, arc_lowmem, NULL,
EVENTHANDLER_PRI_FIRST); EVENTHANDLER_PRI_FIRST);
#if __FreeBSD_version >= 1300139
arc_vnlru_marker = vnlru_alloc_marker();
sx_init(&arc_vnlru_lock, "arc vnlru lock");
#endif
} }
void void
@ -242,6 +256,12 @@ arc_lowmem_fini(void)
{ {
if (arc_event_lowmem != NULL) if (arc_event_lowmem != NULL)
EVENTHANDLER_DEREGISTER(vm_lowmem, arc_event_lowmem); EVENTHANDLER_DEREGISTER(vm_lowmem, arc_event_lowmem);
#if __FreeBSD_version >= 1300139
if (arc_vnlru_marker != NULL) {
vnlru_free_marker(arc_vnlru_marker);
sx_destroy(&arc_vnlru_lock);
}
#endif
} }
void void