From nobody Thu Oct 22 03:31:26 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4j9BWy5cvFz6x4T6 for ; Thu, 22 Oct 2026 03:31:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4j9BWy2RnQz4NP3 for ; Thu, 22 Oct 2026 03:31:26 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792639886; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=W3HzZvXd8HfNRyU7wnENuqbdBIzalf9ZAHoO/WJ+cZE=; b=XpvXumjycWrUCPGWWu5tyqpf6mMaGufPRcyvoY/PPvpryM/2hSWnpJXV+SMoVwqblnj7de J7gHmWAmAPFec2IJNL0vl63qH+/t6DGPJ5jDhfXwzBIYXbXWKdig+PAdlYrxkm/VkKLmna tOZfN+eS3z5TdThvQsf5XGhWXjBGa3LvamYbV9NonYnmsbrvVwWSr+u1SbAKadVa4m65ic xsGJao7nhjAxFEVpAobxQAdG7wMISf+XtEJ3OVx9BhlqjcDY5x/Ef6fQZ0WHkVVRumlMdC WqKKcFbMvJp92yWGE3L/rRV61TGifZlZbglnGnHAfNz8pXJpehk9+eY3B4p3DQ== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792639886; b=oR+FNXJ2QZwlbgqPL3AhQbCNUSnPLCZ+qN8+ogK1qZVuMqIC3g9zirSCmfkuTnb/Lpg1EC XP0JAVLxbjKrtd3PrEPtKVwYG4N0ee7eBjP8pp0/0Ues51l9nWCc8zNDoKY63gJJzBSXnC XkHKowXktyYiFSM5SIaEeG1r2qHOC2lGq2vgeZhI9IwL/E2eaMJxgWVlvLKA7x0o51hFz0 Jomlwrqy/UBvpoFJd2xGUnUX3AgEsdNl3M9Y7Kt6fxv8FUVMPQg7D836R8O/HzAcL3d5ic +ROrXT7ScVnU3vurzx+3oeLDwVDZW3NuaxP94W1NVH2VjCdWCc7gZZSqWO1ufw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792639886; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=W3HzZvXd8HfNRyU7wnENuqbdBIzalf9ZAHoO/WJ+cZE=; b=tXh063AVmjZc56OLtXEdjaGcIcR9MZAEQ0Uo6VRKLTwH7ol+cqxAqx5PUIopRWHC/gdyV5 kTmazrCJGvenOZUFVd2EBMfTrIjs/DxBWwiu9SHBx5jkghKhzeawaLFe+0AbHATG12wlWv mx4/FDfnSjTJBvRBw3bFomNMwPdz+ol1OmeYh8WsrpsXfqJO8lbZKvRudSihPKQCe0uZOe vgsl4K5Yi70WqE16vv1Cytgz2SGIG+1oNEzhuPHFIF/6aW2o8hnIMeDwTfz8shlUUWmLTo z29417kNDQGxjdd3bDcvAdNGpG7hRo2/w7g4GEFeqR1jsLQqDZGEyz1X5rKsIA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4j9BWy25yPzNg9 for ; Thu, 22 Oct 2026 03:31:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 22956 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 22 Oct 2026 03:31:26 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: 331333ba0186 - main - ipfw: hold sleepable "upper half lock" for periodic state expiry List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: Commit messages for the main branch of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: glebius X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 331333ba0186fe43cbd5256c305c41ffb2748692 Auto-Submitted: auto-generated Date: Thu, 22 Oct 2026 03:31:26 +0000 Message-Id: <6ad9838e.22956.4c76c2a4@gitrepo.freebsd.org> The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=331333ba0186fe43cbd5256c305c41ffb2748692 commit 331333ba0186fe43cbd5256c305c41ffb2748692 Author: Gleb Smirnoff AuthorDate: 2026-10-22 03:28:57 +0000 Commit: Gleb Smirnoff CommitDate: 2026-10-22 03:28:57 +0000 ipfw: hold sleepable "upper half lock" for periodic state expiry The state expiration may lead to freeing rules, which requires this lock. Since the lock is sleepable, move the expiry routine from callout context to a taskqueue. This also should have a positive effect of not running expensive function as a callout. Fixes: e3caa360d5d0a73af0de1d293d5b8ff6e900ceb4 Reviewed by: pouria Differential Revision: https://reviews.freebsd.org/D60869 --- sys/netpfil/ipfw/ip_fw_dynamic.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/sys/netpfil/ipfw/ip_fw_dynamic.c b/sys/netpfil/ipfw/ip_fw_dynamic.c index fcf2375f3568..b5c408cae867 100644 --- a/sys/netpfil/ipfw/ip_fw_dynamic.c +++ b/sys/netpfil/ipfw/ip_fw_dynamic.c @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -210,7 +211,7 @@ VNET_DEFINE_STATIC(struct dyn_ipv6_slist, dyn_expired_ipv6); /* * Per-CPU pointer indicates that specified state is currently in use - * and must not be reclaimed by expiration callout. + * and must not be reclaimed by expiration taskqueue. */ static void **dyn_hp_cache; DPCPU_DEFINE_STATIC(void *, dyn_hp); @@ -296,7 +297,7 @@ VNET_DEFINE_STATIC(uint32_t *, dyn_ipv6_parent_del); VNET_DEFINE_STATIC(uint32_t, dyn_buckets_max); VNET_DEFINE_STATIC(uint32_t, curr_dyn_buckets); -VNET_DEFINE_STATIC(struct callout, dyn_timeout); +VNET_DEFINE_STATIC(struct timeout_task, dyn_timeout); #define V_dyn_buckets_max VNET(dyn_buckets_max) #define V_curr_dyn_buckets VNET(curr_dyn_buckets) #define V_dyn_timeout VNET(dyn_timeout) @@ -532,7 +533,7 @@ static struct dyn_parent *dyn_alloc_parent(void *, uint32_t, uint32_t, static struct dyn_ipv4_state *dyn_add_ipv4_parent(void *, uint32_t, uint32_t, const struct ipfw_flow_id *, uint32_t, uint32_t, uint32_t); -static void dyn_tick(void *); +static void dyn_tick(void *, int); static void dyn_expire_states(struct ip_fw_chain *, ipfw_range_tlv *); static void dyn_free_states(struct ip_fw_chain *); static void dyn_export_parent(const struct dyn_parent *, uint32_t, uint8_t, @@ -2749,7 +2750,7 @@ bad: * on dynamic hash lists. Currently it is called every second. */ static void -dyn_tick(void *vnetx) +dyn_tick(void *vnetx, int pending __unused) { struct epoch_tracker et; uint32_t buckets; @@ -2759,7 +2760,9 @@ dyn_tick(void *vnetx) * First free states unlinked in previous passes. */ dyn_free_states(&V_layer3_chain); + IPFW_UH_WLOCK(&V_layer3_chain); dyn_expire_states(&V_layer3_chain, NULL); + IPFW_UH_WUNLOCK(&V_layer3_chain); /* * Send keepalives if they are enabled and the time has come. @@ -2790,7 +2793,7 @@ dyn_tick(void *vnetx) dyn_grow_hashtable(&V_layer3_chain, buckets, M_NOWAIT); } - callout_reset_on(&V_dyn_timeout, hz, dyn_tick, vnetx, 0); + taskqueue_enqueue_timeout(taskqueue_swi, &V_dyn_timeout, hz); CURVNET_RESTORE(); } @@ -3061,7 +3064,7 @@ ipfw_dump_states(struct ip_fw_chain *chain, struct sockopt_data *sd) /* * IPFW_UH_RLOCK garantees that another userland request - * and callout thread will not delete entries from states + * and dyn_tick thread will not delete entries from states * lists. */ IPFW_UH_RLOCK_ASSERT(chain); @@ -3195,8 +3198,8 @@ ipfw_dyn_init(struct ip_fw_chain *chain) M_WAITOK | M_ZERO); DYN_EXPIRED_LOCK_INIT(); - callout_init(&V_dyn_timeout, 1); - callout_reset(&V_dyn_timeout, hz, dyn_tick, curvnet); + TIMEOUT_TASK_INIT(taskqueue_swi, &V_dyn_timeout, 0, dyn_tick, curvnet); + taskqueue_enqueue_timeout(taskqueue_swi, &V_dyn_timeout, hz); IPFW_ADD_OBJ_REWRITER(IS_DEFAULT_VNET(curvnet), dyn_opcodes); dyn_add_protected_rule(chain); @@ -3212,7 +3215,7 @@ ipfw_dyn_uninit(int pass) int bucket; if (pass == 0) { - callout_drain(&V_dyn_timeout); + taskqueue_drain_timeout(taskqueue_swi, &V_dyn_timeout); return; } IPFW_DEL_OBJ_REWRITER(IS_DEFAULT_VNET(curvnet), dyn_opcodes);