aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/openzfs/module
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2021-04-11 05:15:41 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2021-04-11 05:19:56 +0000
commit97ed4babb51636d8a4b11bc7b207c3219ffcd0e3 (patch)
tree756bb97488bcb075f9d0d4108412525ef14afe17 /sys/contrib/openzfs/module
parentfeea35bed0dd7a029b70b700cc3c0d2139e3deb8 (diff)
downloadsrc-97ed4babb51636d8a4b11bc7b207c3219ffcd0e3.tar.gz
src-97ed4babb51636d8a4b11bc7b207c3219ffcd0e3.zip
zfs: avoid memory allocation in arc_prune_async
Diffstat (limited to 'sys/contrib/openzfs/module')
-rw-r--r--sys/contrib/openzfs/module/os/freebsd/zfs/arc_os.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/arc_os.c b/sys/contrib/openzfs/module/os/freebsd/zfs/arc_os.c
index 201dbc423336..e73efd810e53 100644
--- a/sys/contrib/openzfs/module/os/freebsd/zfs/arc_os.c
+++ b/sys/contrib/openzfs/module/os/freebsd/zfs/arc_os.c
@@ -158,10 +158,13 @@ arc_default_max(uint64_t min, uint64_t allmem)
static void
arc_prune_task(void *arg)
{
- int64_t nr_scan = *(int64_t *)arg;
+#ifdef __LP64__
+ int64_t nr_scan = (int64_t)arg;
+#else
+ int64_t nr_scan = (int32_t)arg;
+#endif
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);
@@ -185,13 +188,14 @@ arc_prune_task(void *arg)
void
arc_prune_async(int64_t adjust)
{
-
int64_t *adjustptr;
- if ((adjustptr = malloc(sizeof (int64_t), M_TEMP, M_NOWAIT)) == NULL)
- return;
+#ifndef __LP64__
+ if (adjust > __LONG_MAX)
+ adjust = __LONG_MAX;
+#endif
- *adjustptr = adjust;
+ adjustptr = (void *)adjust;
taskq_dispatch(arc_prune_taskq, arc_prune_task, adjustptr, TQ_SLEEP);
ARCSTAT_BUMP(arcstat_prune);
}