svn commit: r358301 - in head/sys: dev/beri/virtio/network dev/dpaa dev/hyperv/netvsc dev/if_ndis dev/mlx5/mlx5_en dev/ntb/if_ntb dev/sbni dev/virtio/network mips/nlm/dev/net net
Gleb Smirnoff
glebius at FreeBSD.org
Mon Feb 24 21:07:34 UTC 2020
Author: glebius
Date: Mon Feb 24 21:07:30 2020
New Revision: 358301
URL: https://svnweb.freebsd.org/changeset/base/358301
Log:
Although most of the NIC drivers are epoch ready, due to peer pressure
switch over to opt-in instead of opt-out for epoch.
Instead of IFF_NEEDSEPOCH, provide IFF_KNOWSEPOCH. If driver marks
itself with IFF_KNOWSEPOCH, then ether_input() would not enter epoch
when processing its packets.
Now this will create recursive entrance in epoch in >90% network
drivers, but will guarantee safeness of the transition.
Mark several tested drivers as IFF_KNOWSEPOCH.
Reviewed by: hselasky, jeff, bz, gallatin
Differential Revision: https://reviews.freebsd.org/D23674
Modified:
head/sys/dev/beri/virtio/network/if_vtbe.c
head/sys/dev/dpaa/if_dtsec.c
head/sys/dev/hyperv/netvsc/if_hn.c
head/sys/dev/if_ndis/if_ndis.c
head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
head/sys/dev/ntb/if_ntb/if_ntb.c
head/sys/dev/sbni/if_sbni.c
head/sys/dev/virtio/network/if_vtnet.c
head/sys/mips/nlm/dev/net/xlpge.c
head/sys/net/if.c
head/sys/net/if.h
head/sys/net/if_ethersubr.c
head/sys/net/iflib.c
Modified: head/sys/dev/beri/virtio/network/if_vtbe.c
==============================================================================
--- head/sys/dev/beri/virtio/network/if_vtbe.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/dev/beri/virtio/network/if_vtbe.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -613,7 +613,7 @@ vtbe_attach(device_t dev)
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX |
- IFF_MULTICAST | IFF_PROMISC | IFF_NEEDSEPOCH);
+ IFF_MULTICAST | IFF_PROMISC);
ifp->if_capabilities = IFCAP_VLAN_MTU;
ifp->if_capenable = ifp->if_capabilities;
ifp->if_start = vtbe_txstart;
Modified: head/sys/dev/dpaa/if_dtsec.c
==============================================================================
--- head/sys/dev/dpaa/if_dtsec.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/dev/dpaa/if_dtsec.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -688,7 +688,7 @@ dtsec_attach(device_t dev)
ifp->if_softc = sc;
ifp->if_mtu = ETHERMTU; /* TODO: Configure */
- ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_NEEDSEPOCH;
+ ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST;
ifp->if_init = dtsec_if_init;
ifp->if_start = dtsec_if_start;
ifp->if_ioctl = dtsec_if_ioctl;
Modified: head/sys/dev/hyperv/netvsc/if_hn.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/if_hn.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/dev/hyperv/netvsc/if_hn.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -2362,8 +2362,7 @@ hn_attach(device_t dev)
*/
ifp->if_baudrate = IF_Gbps(10);
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
- IFF_NEEDSEPOCH;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = hn_ioctl;
ifp->if_init = hn_init;
#ifdef HN_IFSTART_SUPPORT
Modified: head/sys/dev/if_ndis/if_ndis.c
==============================================================================
--- head/sys/dev/if_ndis/if_ndis.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/dev/if_ndis/if_ndis.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -967,8 +967,7 @@ ndis_ifattach(struct ndis_softc *sc)
if_initname(ifp, device_get_name(sc->ndis_dev),
device_get_unit(sc->ndis_dev));
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
- IFF_NEEDSEPOCH;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = ndis_ifioctl;
ifp->if_start = ndis_ifstart;
ifp->if_init = ndis_init;
Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
==============================================================================
--- head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -4275,7 +4275,8 @@ mlx5e_create_ifp(struct mlx5_core_dev *mdev)
if_initname(ifp, "mce", device_get_unit(mdev->pdev->dev.bsddev));
ifp->if_mtu = ETHERMTU;
ifp->if_init = mlx5e_open;
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
+ IFF_KNOWSEPOCH;
ifp->if_ioctl = mlx5e_ioctl;
ifp->if_transmit = mlx5e_xmit;
ifp->if_qflush = if_qflush;
Modified: head/sys/dev/ntb/if_ntb/if_ntb.c
==============================================================================
--- head/sys/dev/ntb/if_ntb/if_ntb.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/dev/ntb/if_ntb/if_ntb.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -172,8 +172,7 @@ ntb_net_attach(device_t dev)
if_setinitfn(ifp, ntb_net_init);
if_setsoftc(ifp, sc);
- if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
- IFF_NEEDSEPOCH);
+ if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
if_setioctlfn(ifp, ntb_ioctl);
if_settransmitfn(ifp, ntb_transmit);
if_setqflushfn(ifp, ntb_qflush);
Modified: head/sys/dev/sbni/if_sbni.c
==============================================================================
--- head/sys/dev/sbni/if_sbni.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/dev/sbni/if_sbni.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -243,8 +243,7 @@ sbni_attach(struct sbni_softc *sc, int unit, struct sb
ifp->if_baudrate =
(csr0 & 0x01 ? 500000 : 2000000) / (1 << flags.rate);
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
- IFF_NEEDSEPOCH;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
mtx_init(&sc->lock, ifp->if_xname, MTX_NETWORK_LOCK, MTX_DEF);
callout_init_mtx(&sc->wch, &sc->lock, 0);
Modified: head/sys/dev/virtio/network/if_vtnet.c
==============================================================================
--- head/sys/dev/virtio/network/if_vtnet.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/dev/virtio/network/if_vtnet.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -950,7 +950,8 @@ vtnet_setup_interface(struct vtnet_softc *sc)
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_baudrate = IF_Gbps(10); /* Approx. */
ifp->if_softc = sc;
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
+ IFF_KNOWSEPOCH;
ifp->if_init = vtnet_init;
ifp->if_ioctl = vtnet_ioctl;
ifp->if_get_counter = vtnet_get_counter;
Modified: head/sys/mips/nlm/dev/net/xlpge.c
==============================================================================
--- head/sys/mips/nlm/dev/net/xlpge.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/mips/nlm/dev/net/xlpge.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -1052,8 +1052,7 @@ nlm_xlpge_ifinit(struct nlm_xlpge_softc *sc)
}
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
- IFF_NEEDSEPOCH;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
sc->if_flags = ifp->if_flags;
/*ifp->if_capabilities = IFCAP_TXCSUM | IFCAP_VLAN_HWTAGGING;*/
ifp->if_capabilities = 0;
Modified: head/sys/net/if.c
==============================================================================
--- head/sys/net/if.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/net/if.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -551,8 +551,6 @@ if_alloc_domain(u_char type, int numa_domain)
#ifdef VIMAGE
ifp->if_vnet = curvnet;
#endif
- /* XXX */
- ifp->if_flags |= IFF_NEEDSEPOCH;
if (if_com_alloc[type] != NULL) {
ifp->if_l2com = if_com_alloc[type](type, ifp);
if (ifp->if_l2com == NULL) {
@@ -4167,8 +4165,8 @@ if_setdrvflags(if_t ifp, int flags)
int
if_setflags(if_t ifp, int flags)
{
- /* XXX Temporary */
- ((struct ifnet *)ifp)->if_flags = flags | IFF_NEEDSEPOCH;
+
+ ifp->if_flags = flags;
return (0);
}
Modified: head/sys/net/if.h
==============================================================================
--- head/sys/net/if.h Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/net/if.h Mon Feb 24 21:07:30 2020 (r358301)
@@ -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_NEEDSEPOCH 0x20 /* (i) calls if_input w/o epoch */
+#define IFF_KNOWSEPOCH 0x20 /* (i) calls if_input in 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 */
@@ -178,7 +178,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_DYING|IFF_CANTCONFIG|IFF_KNOWSEPOCH)
/*
* Values for if_link_state.
Modified: head/sys/net/if_ethersubr.c
==============================================================================
--- head/sys/net/if_ethersubr.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/net/if_ethersubr.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -802,14 +802,17 @@ ether_input(struct ifnet *ifp, struct mbuf *m)
{
struct epoch_tracker et;
struct mbuf *mn;
+ bool needs_epoch;
+ needs_epoch = !(ifp->if_flags & IFF_KNOWSEPOCH);
+
/*
* The drivers are allowed to pass in a chain of packets linked with
* m_nextpkt. We split them up into separate packets here and pass
* them up. This allows the drivers to amortize the receive lock.
*/
CURVNET_SET_QUIET(ifp->if_vnet);
- if (__predict_false(ifp->if_flags & IFF_NEEDSEPOCH))
+ if (__predict_false(needs_epoch))
NET_EPOCH_ENTER(et);
while (m) {
mn = m->m_nextpkt;
@@ -825,7 +828,7 @@ ether_input(struct ifnet *ifp, struct mbuf *m)
netisr_dispatch(NETISR_ETHER, m);
m = mn;
}
- if (__predict_false(ifp->if_flags & IFF_NEEDSEPOCH))
+ if (__predict_false(needs_epoch))
NET_EPOCH_EXIT(et);
CURVNET_RESTORE();
}
Modified: head/sys/net/iflib.c
==============================================================================
--- head/sys/net/iflib.c Mon Feb 24 19:50:28 2020 (r358300)
+++ head/sys/net/iflib.c Mon Feb 24 21:07:30 2020 (r358301)
@@ -5400,7 +5400,8 @@ iflib_register(if_ctx_t ctx)
if_settransmitfn(ifp, iflib_if_transmit);
#endif
if_setqflushfn(ifp, iflib_if_qflush);
- if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
+ if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
+ IFF_KNOWSEPOCH);
ctx->ifc_vlan_attach_event =
EVENTHANDLER_REGISTER(vlan_config, iflib_vlan_register, ctx,
More information about the svn-src-head
mailing list