From nobody Mon Apr 17 16:09:30 2023 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 4Q0X7G5QWpz44rhn; Mon, 17 Apr 2023 16:09:30 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Q0X7G3qgSz3FZ4; Mon, 17 Apr 2023 16:09:30 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681747770; 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=kHDZfdDe6W2TZwYbFz0iiSq/ogsD00OtgS5pMhtEaHI=; b=ALzNQpS7pDx5/PEgvN4TtWt7eW91XAqSvNsK1SzEl0wNRZtxCia7nKgQvuizwvMSXdazvs 1bmoGYiI/ZbujmAU3miSXarJcDbol+BjKmgeEg/8lW08ERH4J6zIC+aBLgmfIYwPIlR3dZ W61hy4vsEkkDMMCzSd/Y3SaxqJbSi8pryqBa6kqOICj5BcrjqbqK0NZzF8fHwlZyoqfi2Z dSzVPUc/R3s19E4Ph7B99jtzz9tAUyRpZXy2HVMauL4FaJjKRaP/DJFm+3FqlmCN1CoqKh Jsmi9ACuyYCoGVMUM15EqPNqtTgFBavEi7N3ondSvC3SxLWN4ITH31oAjeH+Rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681747770; 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=kHDZfdDe6W2TZwYbFz0iiSq/ogsD00OtgS5pMhtEaHI=; b=GXdxcUfFSyiGeJ+cCuyFRkY2seOZxm90OWggVQp3ctcZOKVh7bLchkV3vpDnEi4wAG76tO q+/9IRnD/XeF2wrGm+cTZKGP6ifqgh6OQegh6XtxUEjV92TyUEguDz8EQJWkIu8FxwlUkW ae1P5kcbmvK4Unuect0FutWUL0zHXQToRuzLd/3H7yyaV4+ZqAHRs4NgCl81G4JDudZzva ukU5WX0hxqxKZ+CoaNhQZWXoGm2+g8EsfHXMvTNU4zflM8kjGkk92WdO7sF7323tynbF6y Kjz7+BJo08yBGUlO4bHZPw7sw7MWf1c1avjlwnXtedsP11bdaDu5oqFV2u+SEw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1681747770; a=rsa-sha256; cv=none; b=OMxyds9M9aLOh4ghcTQisAe6VfRyZ0IXKfZNBCmY9ciW7pGz2HQEyLtQHGYYJdyL0kvy8W pXsxmg7XMWGx1KsRw+Hp5CG+plCq2ITL2fKYpBEvGIF4xU+ruQQf5zGLvCVbGRv8yYkGVS vl1otkeHc9EYr0r+dr5eLjsjM4vOl60bXUDlIyMy3JjTmKZa5mRFfQWlIVNnlUiMH2Wnqd dE5VCuBlfSJ6/PMpX/yWHdRjrYdx66aMidtU8Hxri4+m7NDNh9uq2b6ypdsfJ4pDq94rSZ g9dfidE6bmpqFTj1U48haDi6EDMXjE9PplGIDVtlLPuTphnbWJXrdCzbQLGeqg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Q0X7G2hvHzbqf; Mon, 17 Apr 2023 16:09:30 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 33HG9UlT003908; Mon, 17 Apr 2023 16:09:30 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 33HG9UOp003907; Mon, 17 Apr 2023 16:09:30 GMT (envelope-from git) Date: Mon, 17 Apr 2023 16:09:30 GMT Message-Id: <202304171609.33HG9UOp003907@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: a6b55ee6be15 - main - net: replace IFF_KNOWSEPOCH with IFF_NEEDSEPOCH 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org 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: a6b55ee6be15a41792839095d19b589e25d0f7f7 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=a6b55ee6be15a41792839095d19b589e25d0f7f7 commit a6b55ee6be15a41792839095d19b589e25d0f7f7 Author: Gleb Smirnoff AuthorDate: 2023-04-17 16:08:35 +0000 Commit: Gleb Smirnoff CommitDate: 2023-04-17 16:08:35 +0000 net: replace IFF_KNOWSEPOCH with IFF_NEEDSEPOCH Expect that drivers call into the network stack with the net epoch entered. This has already been the fact since early 2020. The net interrupts, that are marked with INTR_TYPE_NET, were entering epoch since 511d1afb6bf. For the taskqueues there is NET_TASK_INIT() and all drivers that were known back in 2020 we marked with it in 6c3e93cb5a4. However in e87c4940156 we took conservative approach and preferred to opt-in rather than opt-out for the epoch. This change not only reverts e87c4940156 but adds a safety belt to avoid panicing with INVARIANTS if there is a missed driver. With INVARIANTS we will run in_epoch() check, print a warning and enter the net epoch. A driver that prints can be quickly fixed with the IFF_NEEDSEPOCH flag, but better be augmented to properly enter the epoch itself. Note on TCP LRO: it is a backdoor to enter the TCP stack bypassing some layers of net stack, ignoring either old IFF_KNOWSEPOCH or the new IFF_NEEDSEPOCH. But the tcp_lro_flush_all() asserts the presence of network epoch. Indeed, all NIC drivers that support LRO already provide the epoch, either with help of INTR_TYPE_NET or just running NET_EPOCH_ENTER() in their code. Reviewed by: zlei, gallatin, erj Differential Revision: https://reviews.freebsd.org/D39510 --- sys/compat/linux/linux_netlink.c | 2 +- sys/dev/ena/ena.c | 3 +-- sys/dev/mlx5/mlx5_en/mlx5_en_main.c | 3 +-- sys/dev/oce/oce_if.c | 2 +- sys/dev/virtio/network/if_vtnet.c | 3 +-- sys/net/if.h | 4 ++-- sys/net/if_epair.c | 1 - sys/net/if_ethersubr.c | 25 ++++++++++++++++++++- sys/net/if_infiniband.c | 26 +++++++++++++++++++++- sys/net/iflib.c | 2 +- sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c | 4 ++-- 11 files changed, 59 insertions(+), 16 deletions(-) diff --git a/sys/compat/linux/linux_netlink.c b/sys/compat/linux/linux_netlink.c index 0e8188d4cdf6..775a36994d2d 100644 --- a/sys/compat/linux/linux_netlink.c +++ b/sys/compat/linux/linux_netlink.c @@ -312,7 +312,7 @@ rtnl_if_flags_to_linux(unsigned int if_flags) case IFF_ALLMULTI: result |= flag; break; - case IFF_KNOWSEPOCH: + case IFF_NEEDSEPOCH: case IFF_DRV_OACTIVE: case IFF_SIMPLEX: case IFF_LINK0: diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c index 72846a8bed51..a4762ce9ebb1 100644 --- a/sys/dev/ena/ena.c +++ b/sys/dev/ena/ena.c @@ -2393,8 +2393,7 @@ ena_setup_ifnet(device_t pdev, struct ena_adapter *adapter, if_setdev(ifp, pdev); if_setsoftc(ifp, adapter); - if_setflags(ifp, - IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | IFF_KNOWSEPOCH); + if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); if_setinitfn(ifp, ena_init); if_settransmitfn(ifp, ena_mq_start); if_setqflushfn(ifp, ena_qflush); diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c index 84adef8398bb..ab0cf49c2e8a 100644 --- a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c +++ b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c @@ -4526,8 +4526,7 @@ mlx5e_create_ifp(struct mlx5_core_dev *mdev) if_initname(ifp, "mce", device_get_unit(mdev->pdev->dev.bsddev)); if_setmtu(ifp, ETHERMTU); if_setinitfn(ifp, mlx5e_open); - if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | - IFF_KNOWSEPOCH); + if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); if_setioctlfn(ifp, mlx5e_ioctl); if_settransmitfn(ifp, mlx5e_xmit); if_setqflushfn(ifp, if_qflush); diff --git a/sys/dev/oce/oce_if.c b/sys/dev/oce/oce_if.c index cc8cfc3eaa8c..5d250fcac0bd 100644 --- a/sys/dev/oce/oce_if.c +++ b/sys/dev/oce/oce_if.c @@ -2111,7 +2111,7 @@ oce_attach_ifp(POCE_SOFTC sc) ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL); ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO); - if_setflags(sc->ifp, IFF_BROADCAST | IFF_MULTICAST | IFF_KNOWSEPOCH); + if_setflags(sc->ifp, IFF_BROADCAST | IFF_MULTICAST); if_setioctlfn(sc->ifp, oce_ioctl); if_setstartfn(sc->ifp, oce_start); if_setinitfn(sc->ifp, oce_init); diff --git a/sys/dev/virtio/network/if_vtnet.c b/sys/dev/virtio/network/if_vtnet.c index 41eaa6a56086..9ef667e97a54 100644 --- a/sys/dev/virtio/network/if_vtnet.c +++ b/sys/dev/virtio/network/if_vtnet.c @@ -1103,8 +1103,7 @@ vtnet_setup_interface(struct vtnet_softc *sc) dev = sc->vtnet_dev; ifp = sc->vtnet_ifp; - if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | - IFF_KNOWSEPOCH); + if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); if_setbaudrate(ifp, IF_Gbps(10)); if_setinitfn(ifp, vtnet_init); if_setioctlfn(ifp, vtnet_ioctl); diff --git a/sys/net/if.h b/sys/net/if.h index 888e7d5d7320..da3d25f2b226 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -144,7 +144,7 @@ struct if_data { #define IFF_DEBUG 0x4 /* (n) turn on debugging */ #define IFF_LOOPBACK 0x8 /* (i) is a loopback net */ #define IFF_POINTOPOINT 0x10 /* (i) is a point-to-point link */ -#define IFF_KNOWSEPOCH 0x20 /* (i) calls if_input in net epoch */ +#define IFF_NEEDSEPOCH 0x20 /* (i) calls if_input w/o net epoch */ #define IFF_DRV_RUNNING 0x40 /* (d) resources allocated */ #define IFF_NOARP 0x80 /* (n) no address resolution protocol */ #define IFF_PROMISC 0x100 /* (n) receive all packets */ @@ -179,7 +179,7 @@ struct if_data { #define IFF_CANTCHANGE \ (IFF_BROADCAST|IFF_POINTOPOINT|IFF_DRV_RUNNING|IFF_DRV_OACTIVE|\ IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_PROMISC|\ - IFF_DYING|IFF_CANTCONFIG|IFF_KNOWSEPOCH) + IFF_DYING|IFF_CANTCONFIG|IFF_NEEDSEPOCH) /* * Values for if_link_state. diff --git a/sys/net/if_epair.c b/sys/net/if_epair.c index e9e1a48b3d58..2afbf786c9c8 100644 --- a/sys/net/if_epair.c +++ b/sys/net/if_epair.c @@ -543,7 +543,6 @@ epair_setup_ifp(struct epair_softc *sc, char *name, int unit) ifp->if_dname = epairname; ifp->if_dunit = unit; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_flags |= IFF_KNOWSEPOCH; ifp->if_capabilities = IFCAP_VLAN_MTU; ifp->if_capenable = IFCAP_VLAN_MTU; ifp->if_transmit = epair_transmit; diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 839bae8e9d43..dd5c07acf634 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -56,6 +56,9 @@ #include #include #include +#ifdef KDB +#include +#endif #include #include @@ -813,7 +816,27 @@ ether_input(struct ifnet *ifp, struct mbuf *m) struct mbuf *mn; bool needs_epoch; - needs_epoch = !(ifp->if_flags & IFF_KNOWSEPOCH); + needs_epoch = (ifp->if_flags & IFF_NEEDSEPOCH); +#ifdef INVARIANTS + /* + * This temporary code is here to prevent epoch unaware and unmarked + * drivers to panic the system. Once all drivers are taken care of, + * the whole INVARIANTS block should go away. + */ + if (!needs_epoch && !in_epoch(net_epoch_preempt)) { + static bool printedonce; + + needs_epoch = true; + if (!printedonce) { + printedonce = true; + if_printf(ifp, "called %s w/o net epoch! " + "PLEASE file a bug report.", __func__); +#ifdef KDB + kdb_backtrace(); +#endif + } + } +#endif /* * The drivers are allowed to pass in a chain of packets linked with diff --git a/sys/net/if_infiniband.c b/sys/net/if_infiniband.c index 30f014ee669d..a11b8a8f5c56 100644 --- a/sys/net/if_infiniband.c +++ b/sys/net/if_infiniband.c @@ -25,6 +25,7 @@ #include "opt_inet.h" #include "opt_inet6.h" +#include "opt_kbd.h" #include __FBSDID("$FreeBSD$"); @@ -38,6 +39,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef KDB +#include +#endif #include #include @@ -417,7 +421,27 @@ infiniband_input(struct ifnet *ifp, struct mbuf *m) int isr; bool needs_epoch; - needs_epoch = (ifp->if_flags & IFF_KNOWSEPOCH) == 0; + needs_epoch = (ifp->if_flags & IFF_NEEDSEPOCH); +#ifdef INVARIANTS + /* + * This temporary code is here to prevent epoch unaware and unmarked + * drivers to panic the system. Once all drivers are taken care of, + * the whole INVARIANTS block should go away. + */ + if (!needs_epoch && !in_epoch(net_epoch_preempt)) { + static bool printedonce; + + needs_epoch = true; + if (!printedonce) { + printedonce = true; + if_printf(ifp, "called %s w/o net epoch! " + "PLEASE file a bug report.", __func__); +#ifdef KDB + kdb_backtrace(); +#endif + } + } +#endif CURVNET_SET_QUIET(ifp->if_vnet); if (__predict_false(needs_epoch)) diff --git a/sys/net/iflib.c b/sys/net/iflib.c index aa16e5d5492b..d056570d9a99 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -6010,7 +6010,7 @@ iflib_register(if_ctx_t ctx) if_settransmitfn(ifp, iflib_if_transmit); #endif if_setqflushfn(ifp, iflib_if_qflush); - iflags = IFF_MULTICAST | IFF_KNOWSEPOCH; + iflags = IFF_MULTICAST; if ((sctx->isc_flags & IFLIB_PSEUDO) && (sctx->isc_flags & IFLIB_PSEUDO_ETHER) == 0) diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c index 8b2f4724d2fd..fe4581e456d3 100644 --- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -922,8 +922,8 @@ ipoib_intf_alloc(const char *name, struct ib_device *hca) } if_initname(dev, name, priv->unit); if_setflags(dev, IFF_BROADCAST | IFF_MULTICAST); - if (hca->attrs.device_cap_flags & IB_DEVICE_KNOWSEPOCH) - if_setflagbits(dev, IFF_KNOWSEPOCH, 0); + if ((hca->attrs.device_cap_flags & IB_DEVICE_KNOWSEPOCH) == 0) + if_setflagbits(dev, IFF_NEEDSEPOCH, 0); infiniband_ifattach(priv->dev, NULL, priv->broadcastaddr);