Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jul 2022 13:54:53 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: adc4dcada3d7 - stable/13 - uma: Use a taskqueue to execute uma_timeout()
Message-ID:  <202207251354.26PDsrBK019766@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=adc4dcada3d7a975bb7d1745c2664a85d1b06da2

commit adc4dcada3d7a975bb7d1745c2664a85d1b06da2
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2022-07-11 19:45:36 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2022-07-25 13:43:44 +0000

    uma: Use a taskqueue to execute uma_timeout()
    
    uma_timeout() has several responsibilities; it visits every UMA zone and
    as of recently will drain underutilized caches, so is rather expensive
    (>1ms in some cases).  Currently it is executed by softclock threads
    and so will preempt most other CPU activity.  None of this work requires
    a high scheduling priority, though, so defer it to a taskqueue so as to
    avoid stalling higher-priority work.
    
    Reviewed by:    rlibby, alc, mav, kib
    Sponsored by:   The FreeBSD Foundation
    
    (cherry picked from commit 93cd28ea82bb7b5e9489c8febfe1ae7ed2c044fb)
---
 sys/vm/uma_core.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 754e9d9ff15e..39946849d9ec 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -206,7 +206,7 @@ static enum {
  * This is the handle used to schedule events that need to happen
  * outside of the allocation fast path.
  */
-static struct callout uma_callout;
+static struct timeout_task uma_timeout_task;
 #define	UMA_TIMEOUT	20		/* Seconds for callout interval. */
 
 /*
@@ -310,7 +310,7 @@ static void zone_timeout(uma_zone_t zone, void *);
 static int hash_alloc(struct uma_hash *, u_int);
 static int hash_expand(struct uma_hash *, struct uma_hash *);
 static void hash_free(struct uma_hash *hash);
-static void uma_timeout(void *);
+static void uma_timeout(void *, int);
 static void uma_shutdown(void);
 static void *zone_alloc_item(uma_zone_t, void *, int, int);
 static void zone_free_item(uma_zone_t, void *, void *, enum zfreeskip);
@@ -1052,13 +1052,14 @@ zone_maxaction(uma_zone_t zone)
  *	Nothing
  */
 static void
-uma_timeout(void *unused)
+uma_timeout(void *unused __unused, int pending __unused)
 {
 	bucket_enable();
 	zone_foreach(zone_timeout, NULL);
 
 	/* Reschedule this event */
-	callout_reset(&uma_callout, UMA_TIMEOUT * hz, uma_timeout, NULL);
+	taskqueue_enqueue_timeout(taskqueue_thread, &uma_timeout_task,
+	    UMA_TIMEOUT * hz);
 }
 
 /*
@@ -3150,8 +3151,6 @@ uma_startup3(void *arg __unused)
 	uma_skip_cnt = counter_u64_alloc(M_WAITOK);
 #endif
 	zone_foreach_unlocked(zone_alloc_sysctl, NULL);
-	callout_init(&uma_callout, 1);
-	callout_reset(&uma_callout, UMA_TIMEOUT * hz, uma_timeout, NULL);
 	booted = BOOT_RUNNING;
 
 	EVENTHANDLER_REGISTER(shutdown_post_sync, uma_shutdown, NULL,
@@ -3159,6 +3158,16 @@ uma_startup3(void *arg __unused)
 }
 SYSINIT(uma_startup3, SI_SUB_VM_CONF, SI_ORDER_SECOND, uma_startup3, NULL);
 
+static void
+uma_startup4(void *arg __unused)
+{
+	TIMEOUT_TASK_INIT(taskqueue_thread, &uma_timeout_task, 0, uma_timeout,
+	    NULL);
+	taskqueue_enqueue_timeout(taskqueue_thread, &uma_timeout_task,
+	    UMA_TIMEOUT * hz);
+}
+SYSINIT(uma_startup4, SI_SUB_TASKQ, SI_ORDER_ANY, uma_startup4, NULL);
+
 static void
 uma_shutdown(void)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202207251354.26PDsrBK019766>