From nobody Wed Aug 12 01:42:07 2026 X-Original-To: dev-commits-src-all@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 4hKWSc1dT3z6k4WL for ; Wed, 12 Aug 2026 01:42:08 +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 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hKWSc0K8Fz3XYm for ; Wed, 12 Aug 2026 01:42:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786498928; 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=JQAF19OHd6Yz10TYubjjESFa+VcUFu1fc9PYlSwoAzg=; b=VGSvPCIT8Yy+DNPHpTQTyHz3b1xpyr+ySZw2ZcMTVILls2U76KgL/APq+qt+s9A33qDZLL dei094vq6Szi5ABHmVMsAPs2TkT+BC7D5b2Dedcn6BFewI6sqh1iVhij/5akpMl/dp20KJ bsMQJeZokgh49McadEWx33011XvGf4fjhqCTAe2fxllSJpI+7MGcHHBawO0qD+J0YzASDs WXpP4nxC/2tAfkM3ivvSn+WaNnRYE+SnN4V6q0F3K4AdW0MeguxKFIXZhmforzKTOKzM19 RgR+gp4jjYZzBR40srY3irMzsySUcIXfpXSpRJctFxjg4lSaKzWaYZnupY+Scw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1786498928; a=rsa-sha256; cv=none; b=R/tLtQIQNEXPd50cIgkshiG9B3Y4bNQ8vbtLr9PO/prnZ4F/gRXcUFygcceB7s/rusqHSX e5ksu7LNRfb59vrSjfG6TiEBEJvk4QYgLzzxtXHzHqpuviJHtkdwLR0q0f8YptcIOoH/Nf pYbfUi9fF55VoA/WIwL36+j/1dh9LBqZ/T1ynnUklp8pMJblMwsz4ENp4QGxWtkDXdVYmn jIAsbq5Xj8Z7NMDW5nfLfa+eW+fMiSEEnh0FXoZ38S6gMu4FHrSoSF3JSktMjnAXAvssbP 8UpZUU1/3ntqfdvHc0il7/ykgCFEU2fGwFfCz+RV5T+/XXu/7MIkx2DxT+IIQg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786498928; 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=JQAF19OHd6Yz10TYubjjESFa+VcUFu1fc9PYlSwoAzg=; b=NGw+DFYdupnKb/9Ddx8/9USewpZ8p4i4tOXw5OhpI9h9nR1Li+PxoaLSm3+5r+KcI+dZ5t uqsF9oA2E6Ozr5wy4Az7nX4M+8CXoSCDJ5PXfBBBTSNS0XgiupziXbUUOug+u9sKXklKQi CkjaYwH3bq9wQkSsOL+DyaU3xyDxt7UL2SdzMxbcP8RxjeVjNeQssjsSw/hqwOMuL1Lxy2 PZjEtAVT6V9vz+tN8V0+ZdoiZiTWDGsHANnBD8KzvNAD+5NmDozoVWyoZMrkszFbqjwtC2 k0zRBImZwxNwLOIeM8wVNS/4/jBi/H25C2tfaOrHNUX22oLQ5//c8RkxR9fvrA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hKWSb6TPdz1Jh1 for ; Wed, 12 Aug 2026 01:42:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 253d3 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 12 Aug 2026 01:42:07 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kevin Bowling Subject: git: 952994751911 - main - iflib: Defer LED control to the device taskqueue List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: 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: kbowling X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 952994751911d5d059d53e73eb874e00ee98b9ed Auto-Submitted: auto-generated Date: Wed, 12 Aug 2026 01:42:07 +0000 Message-Id: <6a7bcf6f.253d3.35c0c3e5@gitrepo.freebsd.org> The branch main has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=952994751911d5d059d53e73eb874e00ee98b9ed commit 952994751911d5d059d53e73eb874e00ee98b9ed Author: Kevin Bowling AuthorDate: 2026-08-12 00:12:15 +0000 Commit: Kevin Bowling CommitDate: 2026-08-12 01:39:19 +0000 iflib: Defer LED control to the device taskqueue led(4) invokes driver callbacks while holding its mutex, including from a callout. iflib_led_func() cannot acquire the sleepable context lock in those contexts without causing a lock-order reversal or sleeping from the callout. Record the latest requested state under the iflib state lock and enqueue the existing per-device taskqueue. The task can safely take the context lock before invoking the driver. Coalescing requests also avoids accumulating stale blink transitions when hardware access is slow. Destroy the LED device before draining its task so no new callback can race driver detach. MFC after: 2 weeks --- sys/net/iflib.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/sys/net/iflib.c b/sys/net/iflib.c index aaba4a90c5fd..f490d7347341 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -180,10 +180,12 @@ struct iflib_ctx { int ifc_link_state; uint32_t ifc_tx_watchdog_events; struct cdev *ifc_led_dev; + int ifc_led_state; struct resource *ifc_msix_mem; struct if_irq ifc_legacy_irq; struct task ifc_admin_task; + struct task ifc_led_task; struct task ifc_vflr_task; struct taskqueue *ifc_tq; struct iflib_filter_info ifc_filter_info; @@ -4746,15 +4748,39 @@ iflib_vlan_unregister(void *arg, if_t ifp, uint16_t vtag) } static void -iflib_led_func(void *arg, int onoff) +_task_fn_led(void *context, int pending __unused) { - if_ctx_t ctx = arg; + if_ctx_t ctx = context; + bool in_detach; + int onoff; + + STATE_LOCK(ctx); + in_detach = (ctx->ifc_flags & IFC_IN_DETACH) != 0; + onoff = ctx->ifc_led_state; + STATE_UNLOCK(ctx); + if (in_detach) + return; CTX_LOCK(ctx); IFDI_LED_FUNC(ctx, onoff); CTX_UNLOCK(ctx); } +static void +iflib_led_func(void *arg, int onoff) +{ + if_ctx_t ctx = arg; + bool in_detach; + + /* led(4) may invoke this callback from a non-sleepable callout. */ + STATE_LOCK(ctx); + ctx->ifc_led_state = onoff; + in_detach = (ctx->ifc_flags & IFC_IN_DETACH) != 0; + STATE_UNLOCK(ctx); + if (!in_detach) + taskqueue_enqueue(ctx->ifc_tq, &ctx->ifc_led_task); +} + /********************************************************************* * * BUS FUNCTION DEFINITIONS @@ -5279,6 +5305,7 @@ iflib_device_register(device_t dev, void *sc, if_shared_ctx_t sctx, if_ctx_t *ct } TASK_INIT(&ctx->ifc_admin_task, 0, _task_fn_admin, ctx); + TASK_INIT(&ctx->ifc_led_task, 0, _task_fn_led, ctx); /* Set up cpu set. If it fails, use the set of all CPUs. */ if (bus_get_cpus(dev, INTR_CPUS, sizeof(ctx->ifc_cpus), &ctx->ifc_cpus) != 0) { @@ -5502,8 +5529,10 @@ iflib_device_deregister(if_ctx_t ctx) CTX_UNLOCK(ctx); iflib_rem_pfil(ctx); - if (ctx->ifc_led_dev != NULL) + if (ctx->ifc_led_dev != NULL) { led_destroy(ctx->ifc_led_dev); + taskqueue_drain(ctx->ifc_tq, &ctx->ifc_led_task); + } iflib_tqg_detach(ctx); iflib_tx_structures_free(ctx);