From nobody Wed Aug 26 00:25:41 2026 X-Original-To: dev-commits-src-branches@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 4hV55x31Q0z6qHrm for ; Wed, 26 Aug 2026 00:25:41 +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 "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hV55x2Hx9z3n7V for ; Wed, 26 Aug 2026 00:25:41 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1787703941; 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=Dc6DFrmjzql6DebGgiKAC9nHM/upmmbH54BL8z0hiyA=; b=ReHo4LoHzq4cC4vKuSP+NWOiG/Qxn9gDx9ThgflfQx6Lv5rPfL1sOszCVqd+zGdMobRzdY y87mULKaJ01dt5c0UaWNkP7OoYY1c15YFyHf03pqsCM+ACHBww3RWj//VnNEsM7A7E0MLW YxJ5sO/memyCo0Ez//sMZSO/DpznlGzND/G/3EKBH74PFkzrkASCKVgPfo30ue54Q5nRgp j7CUwEvWwB/zoG68wIHOHekjgzNmaWahLag5CvmrT/0WI8B7SSk+SXvvD0t4YkiBXGMkrn OFNDof2HdWXOSN79vaKb76LhgOwiONOuwu2tot5SLi5dYvTOmJ2+EbvtevGhoA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1787703941; a=rsa-sha256; cv=none; b=c0VIdrxbaly5s1Ol4HTsYgQXl/6VifUXkrnx4t0MWlzYZkKmxCFGzY/PlXiT8iVaRfw64C UGrVEREAAbErdxmUJ8F9reXxBhpDDY+9i6myR8pbiO7wC1LS2/jOORgzaS54A+O9Yawbia 48vz8zg9sfaFiVzcQqPzArmI0KSX6IWSYB1rg+kP/n6jZ+Ezu2cn3Y14Ozu6cX3RgorggY 0NkoNZ3lisk/kRcU9cIhMmYS2COz6F6GJZr56+vI/50tZ0PuWmTidsl4960UdI7QhK+TvX XQlIIr00FygedkA0WgDE8VJ0TxLr9LgE2LgODFGxptlk5h60ZmLWRf626l/aug== 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=1787703941; 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=Dc6DFrmjzql6DebGgiKAC9nHM/upmmbH54BL8z0hiyA=; b=SD5Bvs88c7lPZA9xk76DCq+Y1kVn0O5QlKgUM7Sq82Y+O2aRo2l+n0R0ft3inAx25VA2bk X5cCZstRuUF6Br/tXNuufRcqVk/S9HBTsWpRGTaemlkU5WrZxt85i8P95aEPX6dskjAdon ZDPb+cWpAG8SAOJUnd0qWUL8D96RJPS0G+CYGM1n8jtpa/e//pfmkUY7wew4JZB3kgZxfg EUcrv945AF4EdBFHtQ1edxcBZGBYgRLsFdoMmPxtzpnxqsXwWAYaEFDwn72BHD9IENVBLv +IjPr5RqR92IJspaItLgbNztWhRrmqw4wslSzvj0D+QGGkfe6s1psaWhEP9cig== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hV55x1MG8zHS for ; Wed, 26 Aug 2026 00:25:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 4108e by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 26 Aug 2026 00:25:41 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kevin Bowling Subject: git: e5db37bd0605 - stable/15 - iflib: Defer LED control to the device taskqueue List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@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/stable/15 X-Git-Reftype: branch X-Git-Commit: e5db37bd060542d849dc3d975c7c597d7d28f210 Auto-Submitted: auto-generated Date: Wed, 26 Aug 2026 00:25:41 +0000 Message-Id: <6a8e3285.4108e.6d7edb27@gitrepo.freebsd.org> The branch stable/15 has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=e5db37bd060542d849dc3d975c7c597d7d28f210 commit e5db37bd060542d849dc3d975c7c597d7d28f210 Author: Kevin Bowling AuthorDate: 2026-08-12 00:12:15 +0000 Commit: Kevin Bowling CommitDate: 2026-08-26 00:24:57 +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. (cherry picked from commit 952994751911d5d059d53e73eb874e00ee98b9ed) --- 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 57f6e568c951..297b64061a99 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -178,10 +178,12 @@ struct iflib_ctx { int ifc_link_state; int ifc_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; @@ -4598,15 +4600,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 @@ -5131,6 +5157,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) { @@ -5332,8 +5359,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);