summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMateusz Guzik <mjguzik@gmail.com>2021-04-12 20:01:46 +0200
committerTony Hutter <hutter2@llnl.gov>2021-06-23 13:22:15 -0700
commit52d9bc7174e25cd331741a34cdc1c1cb02f28e1f (patch)
tree1cefa7490a600c6e11702bfcb0ee27a2fbd6fec3
parent6905f6b2c1576a3d5473c9d142e6f4e295e0221d (diff)
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
-rw-r--r--module/os/freebsd/zfs/arc_os.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/module/os/freebsd/zfs/arc_os.c b/module/os/freebsd/zfs/arc_os.c
index 94df75003..ad9b25772 100644
--- a/module/os/freebsd/zfs/arc_os.c
+++ b/module/os/freebsd/zfs/arc_os.c
@@ -51,6 +51,11 @@
#include <sys/vm.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;
uint_t zfs_arc_free_target = 0;
@@ -157,7 +162,13 @@ arc_prune_task(void *arg)
arc_reduce_target_size(ptob(nr_scan));
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);
+#endif
}
/*
@@ -234,7 +245,10 @@ arc_lowmem_init(void)
{
arc_event_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, arc_lowmem, NULL,
EVENTHANDLER_PRI_FIRST);
-
+#if __FreeBSD_version >= 1300139
+ arc_vnlru_marker = vnlru_alloc_marker();
+ sx_init(&arc_vnlru_lock, "arc vnlru lock");
+#endif
}
void
@@ -242,4 +256,10 @@ arc_lowmem_fini(void)
{
if (arc_event_lowmem != NULL)
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
}