From aa4a84e616fdabc7c8ddae3ee47dc4f821bdc588 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Tue, 25 May 2021 21:38:34 -0400 Subject: [PATCH] FreeBSD: avoid memory allocation in arc_prune_async Reviewed-by: Ryan Moeller Reviewed-by: Brian Behlendorf Signed-off-by: Alexander Motin Closes #12049 --- module/os/freebsd/zfs/arc_os.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/module/os/freebsd/zfs/arc_os.c b/module/os/freebsd/zfs/arc_os.c index 201dbc4233..05377bb7ed 100644 --- a/module/os/freebsd/zfs/arc_os.c +++ b/module/os/freebsd/zfs/arc_os.c @@ -158,10 +158,9 @@ arc_default_max(uint64_t min, uint64_t allmem) static void arc_prune_task(void *arg) { - int64_t nr_scan = *(int64_t *)arg; + int64_t nr_scan = (intptr_t)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); @@ -186,13 +185,12 @@ void arc_prune_async(int64_t adjust) { - int64_t *adjustptr; - - if ((adjustptr = malloc(sizeof (int64_t), M_TEMP, M_NOWAIT)) == NULL) - return; - - *adjustptr = adjust; - taskq_dispatch(arc_prune_taskq, arc_prune_task, adjustptr, TQ_SLEEP); +#ifndef __LP64__ + if (adjust > INTPTR_MAX) + adjust = INTPTR_MAX; +#endif + taskq_dispatch(arc_prune_taskq, arc_prune_task, + (void *)(intptr_t)adjust, TQ_SLEEP); ARCSTAT_BUMP(arcstat_prune); }