From nobody Wed Sep 16 14:12:49 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 4hlLSf6rTmz6rWsS for ; Wed, 16 Sep 2026 14:12:50 +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 4hlLSd1cR2z3M2b for ; Wed, 16 Sep 2026 14:12:49 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789567969; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=GX6X8hUVqafx6hxm9mRwg9wvvvrX7mD24feM1qS34Q8=; b=MoBbPYnScUU+mGDrFF1JBPnb8uhn5AILVnVRe7VVHcK2hF9PWH3j7lS2SgynOSFI4u4/tr urRnn70kVARqwVIH3f3qqCXvi45CUltIAVsO1bosgbJ9M/Jchm77y9jkoyDZSTTKdo7spe Bdd/NwqvwFUym9NOtmo9dD3OSJHXfUUB/InnYZ1++OZMAgq2BqKqpsIK6u3AESx5iW2cbk 1Mlunwv/7ZUTCXwv1kRn6TtxucOT9tIamQgdIQ8kavjbL4mORKxkRsDlbl4MNxqt4FDGeV +j3IhKBLc/0Clw+uqsOjK/SRxs4WGUcE2NxZf3Oio1RWU43QMTz0SzngIOuC3w== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1789567969; b=ChHwUA/L+r6UZ8+qHg3HK1sPZ5Fi1/jDcHeMsS5dL/tdNShaKCttW6baeqziZHf+ZSJE69 WQMpWoNDgxqOJeYjtI/0euWkS/ierYiUpP4Q0fswGf9PTPrZGL+NkcIwLEgu+CXVYMzzoX vCvJ7AcFkJwAYdggfa/BZd74lHfavtahYC53BPAtoWYhNN7Y6FDMxj8taufNx29cLJto+D u3rw/h9at9ipA0zzAFaA+qzdTkfamocWq+kGDNFPtSGZRamZNTKJYs0vPj5L00Dm2QHCEQ oWSm5ZGxtckkALAFn44RPbnXePP0PhoCI2EZC8yHsPKDoN5NJhhtDvgmK8sQEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789567969; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=GX6X8hUVqafx6hxm9mRwg9wvvvrX7mD24feM1qS34Q8=; b=qx1xSK4+VhWgFL4dWUEuj7ha0Yal9+usY1PSzwH4lv0vTPAhmyv0MhVLQ5fR2LQOEdyfGN LiuWJdJceWlbAg+EYJVErlrvSknaUsn/Df3WivqJw53Pkq3Fq+oggIOb/rkFp2wS0RPlAs OAiFab7dXcUgw4po0rGCle3Zs+50jl+zaPc0owoegxfMkbvSAfGZ3YayCaS0oTB3niXMSK xH7kIgf8OotT64sT9HhVkicFbnEn2CZEz/CXBgQWR5VLJ192utAwMsjfp7vmdEF0908xVL MyFEk5t73rvR7+C7JMWPz6t98CBQ22m3xTPGqNfL6rpMwBUD7wi2TRuim7wBUw== 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 4hlLSd0P5CzqH6 for ; Wed, 16 Sep 2026 14:12:49 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 36156 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 16 Sep 2026 14:12:49 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Ariel Ehrenberg From: Konstantin Belousov Subject: git: 98f73f8ec35f - main - fixup! mlx5/mlx5ib: Azure/HyperV OFED failing to create IB verbs device 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: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 98f73f8ec35f598dfbe4a4acfe25cf4a350f5734 Auto-Submitted: auto-generated Date: Wed, 16 Sep 2026 14:12:49 +0000 Message-Id: <6aaaa3e1.36156.65bcb087@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=98f73f8ec35f598dfbe4a4acfe25cf4a350f5734 commit 98f73f8ec35f598dfbe4a4acfe25cf4a350f5734 Author: Ariel Ehrenberg AuthorDate: 2026-07-28 10:38:55 +0000 Commit: Konstantin Belousov CommitDate: 2026-09-16 14:12:07 +0000 fixup! mlx5/mlx5ib: Azure/HyperV OFED failing to create IB verbs device Hold a reference on the netdev recorded in dev->roce.netdev and drop it when the entry is replaced or torn down, and register the netdev notifier before the initial interface scan. Otherwise the stored pointer can dangle, and an interface appearing during the scan can be missed. Sponsored by: NVidia networking MFC after: 1 month --- sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c | 74 ++++++++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c b/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c index 484ce0a786b9..a4b1ec8807d3 100644 --- a/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c +++ b/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c @@ -110,15 +110,42 @@ static int mlx5_netdev_event(struct notifier_block *this, roce.nb); switch (event) { - case NETDEV_REGISTER: - case NETDEV_UNREGISTER: - write_lock(&ibdev->roce.netdev_lock); + case NETDEV_REGISTER: { + if_t old; + /* check if network interface belongs to mlx5en */ - if (mlx5_netdev_match(ndev, ibdev->mdev, "mce")) - ibdev->roce.netdev = (event == NETDEV_UNREGISTER) ? - NULL : ndev; + if (!mlx5_netdev_match(ndev, ibdev->mdev, "mce")) + break; + + /* + * Hold a reference on the recorded netdev so the stored + * pointer cannot dangle if the interface is freed before it + * is cleared. Release the previously recorded netdev (if any) + * outside the lock. + */ + if_ref(ndev); + write_lock(&ibdev->roce.netdev_lock); + old = ibdev->roce.netdev; + ibdev->roce.netdev = ndev; + write_unlock(&ibdev->roce.netdev_lock); + if (old != NULL) + if_rele(old); + break; + } + case NETDEV_UNREGISTER: { + if_t old; + + write_lock(&ibdev->roce.netdev_lock); + old = ibdev->roce.netdev; + if (old == ndev) + ibdev->roce.netdev = NULL; + else + old = NULL; write_unlock(&ibdev->roce.netdev_lock); + if (old != NULL) + if_rele(old); break; + } case NETDEV_UP: case NETDEV_DOWN: { @@ -3220,24 +3247,46 @@ static int mlx5_add_netdev_notifier(struct mlx5_ib_dev *dev) static void mlx5_remove_netdev_notifier(struct mlx5_ib_dev *dev) { + if_t old; + if (dev->roce.nb.notifier_call) { unregister_netdevice_notifier(&dev->roce.nb); dev->roce.nb.notifier_call = NULL; } + + /* + * No further events can arrive once the notifier is gone; drop the + * reference taken when the netdev was recorded. + */ + write_lock(&dev->roce.netdev_lock); + old = dev->roce.netdev; + dev->roce.netdev = NULL; + write_unlock(&dev->roce.netdev_lock); + if (old != NULL) + if_rele(old); } static int mlx5_enable_roce_if_cb(if_t ifp, void *arg) { struct mlx5_ib_dev *dev = arg; + if_t old; /* check if network interface belongs to mlx5en */ if (!mlx5_netdev_match(ifp, dev->mdev, "mce")) return (0); + /* + * Hold a reference on the recorded netdev; it is released on teardown + * or when a later event replaces it. + */ + if_ref(ifp); write_lock(&dev->roce.netdev_lock); + old = dev->roce.netdev; dev->roce.netdev = ifp; write_unlock(&dev->roce.netdev_lock); + if (old != NULL) + if_rele(old); return (0); } @@ -3248,6 +3297,15 @@ static int mlx5_enable_eth(struct mlx5_ib_dev *dev) VNET_ITERATOR_DECL(vnet_iter); int err; + /* + * Register the netdev notifier before scanning for existing + * interfaces, so a register/unregister that races with the scan + * cannot be missed. + */ + err = mlx5_add_netdev_notifier(dev); + if (err) + return err; + /* Check if mlx5en net device already exists */ VNET_LIST_RLOCK(); NET_EPOCH_ENTER(et); @@ -3259,10 +3317,6 @@ static int mlx5_enable_eth(struct mlx5_ib_dev *dev) NET_EPOCH_EXIT(et); VNET_LIST_RUNLOCK(); - err = mlx5_add_netdev_notifier(dev); - if (err) - return err; - if (MLX5_CAP_GEN(dev->mdev, roce)) { err = mlx5_nic_vport_enable_roce(dev->mdev); if (err)