|
51 | 51 | #include <sys/vm.h>
|
52 | 52 | #include <sys/vmmeter.h>
|
53 | 53 |
|
| 54 | +#if __FreeBSD_version >= 1300139 |
| 55 | +static struct sx arc_vnlru_lock; |
| 56 | +static struct vnode *arc_vnlru_marker; |
| 57 | +#endif |
| 58 | + |
54 | 59 | extern struct vfsops zfs_vfsops;
|
55 | 60 |
|
56 | 61 | uint_t zfs_arc_free_target = 0;
|
@@ -157,7 +162,13 @@ arc_prune_task(void *arg)
|
157 | 162 |
|
158 | 163 | arc_reduce_target_size(ptob(nr_scan));
|
159 | 164 | free(arg, M_TEMP);
|
| 165 | +#if __FreeBSD_version >= 1300139 |
| 166 | + sx_xlock(&arc_vnlru_lock); |
| 167 | + vnlru_free_vfsops(nr_scan, &zfs_vfsops, arc_vnlru_marker); |
| 168 | + sx_xunlock(&arc_vnlru_lock); |
| 169 | +#else |
160 | 170 | vnlru_free(nr_scan, &zfs_vfsops);
|
| 171 | +#endif |
161 | 172 | }
|
162 | 173 |
|
163 | 174 | /*
|
@@ -234,12 +245,21 @@ arc_lowmem_init(void)
|
234 | 245 | {
|
235 | 246 | arc_event_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, arc_lowmem, NULL,
|
236 | 247 | EVENTHANDLER_PRI_FIRST);
|
237 |
| - |
| 248 | +#if __FreeBSD_version >= 1300139 |
| 249 | + arc_vnlru_marker = vnlru_alloc_marker(); |
| 250 | + sx_init(&arc_vnlru_lock, "arc vnlru lock"); |
| 251 | +#endif |
238 | 252 | }
|
239 | 253 |
|
240 | 254 | void
|
241 | 255 | arc_lowmem_fini(void)
|
242 | 256 | {
|
243 | 257 | if (arc_event_lowmem != NULL)
|
244 | 258 | EVENTHANDLER_DEREGISTER(vm_lowmem, arc_event_lowmem);
|
| 259 | +#if __FreeBSD_version >= 1300139 |
| 260 | + if (arc_vnlru_marker != NULL) { |
| 261 | + vnlru_free_marker(arc_vnlru_marker); |
| 262 | + sx_destroy(&arc_vnlru_lock); |
| 263 | + } |
| 264 | +#endif |
245 | 265 | }
|
0 commit comments