FreeBSD: avoid memory allocation in arc_prune_async

Reviewed-by: Ryan Moeller <ryan@ixsystems.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by:	Alexander Motin <mav@FreeBSD.org>
Closes #12049
This commit is contained in:
Alexander Motin 2021-05-25 21:38:34 -04:00 committed by Tony Hutter
parent 5ea770b0a2
commit c84f9be5c7
1 changed files with 7 additions and 9 deletions

View File

@ -158,10 +158,9 @@ arc_default_max(uint64_t min, uint64_t allmem)
static void static void
arc_prune_task(void *arg) 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)); arc_reduce_target_size(ptob(nr_scan));
free(arg, M_TEMP);
#if __FreeBSD_version >= 1300139 #if __FreeBSD_version >= 1300139
sx_xlock(&arc_vnlru_lock); sx_xlock(&arc_vnlru_lock);
vnlru_free_vfsops(nr_scan, &zfs_vfsops, arc_vnlru_marker); vnlru_free_vfsops(nr_scan, &zfs_vfsops, arc_vnlru_marker);
@ -186,13 +185,12 @@ void
arc_prune_async(int64_t adjust) arc_prune_async(int64_t adjust)
{ {
int64_t *adjustptr; #ifndef __LP64__
if (adjust > INTPTR_MAX)
if ((adjustptr = malloc(sizeof (int64_t), M_TEMP, M_NOWAIT)) == NULL) adjust = INTPTR_MAX;
return; #endif
taskq_dispatch(arc_prune_taskq, arc_prune_task,
*adjustptr = adjust; (void *)(intptr_t)adjust, TQ_SLEEP);
taskq_dispatch(arc_prune_taskq, arc_prune_task, adjustptr, TQ_SLEEP);
ARCSTAT_BUMP(arcstat_prune); ARCSTAT_BUMP(arcstat_prune);
} }