[Devel] [PATCH v2 RH9 2/3] ve/net/features: put per-ve netdev features to separate struct member

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Wed Oct 27 17:45:27 MSK 2021


Replace features member uses for per-ve features with ve_features member
under CONFIG_VE.

Later we would likely want to split this patch and put each fixup hunk
in proper base patch:

Fixes: be40f8f443f9 ("ve/net/dummy: enable support in a container")
Fixes: b3345177cf1f ("net: Add NETIF_F_VIRTUAL feature to mask devices allowed in CT")
Fixes: cba4909419c9 ("ve/net/ppp: introduce VE_FEATURE_PPP feature")
Fixes: 0046628c2a38 ("ve/net/vxlan: enable support in a container")
Fixes: 69dfb70e37e3 ("ve/net/ip_gre: containerize per-net devices")
Fixes: b06f5ab814de ("net: Make ipip feature optional")
Fixes: 5b9aaf63d0d3 ("ve/net/ipv6 tunnels: Enable GRE netdevice register inside container")
Fixes: 466db989d34e ("ve/net/sit: Enable SIT devices in Containers")
Fixes: 6b4bc35aae98 ("openvswitch: allow to create ovs bridges inside Containers")

Fixes: 12b9b0869be8 ("drivers/net/ve: venet network device introduced")
Fixes: 2339b008fbf7 ("net: optimized skb forwarding for venet")
Fixes: 00e7dbe29105 ("ve/net,netfilter: Adjust REDIRECT target on venet device")

v2: allign ve_features assignments in ipip, fix NETIF_F_NETNS_LOCAL bad
usage from ve_features in ve_is_dev_movable

https://jira.sw.ru/browse/PSBM-135200
Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
---
 drivers/net/dummy.c                  |  4 +++-
 drivers/net/loopback.c               |  4 +++-
 drivers/net/ppp/ppp_generic.c        |  5 ++++-
 drivers/net/tun.c                    |  6 ++++--
 drivers/net/venetdev.c               |  7 +++++--
 drivers/net/vxlan.c                  |  4 +++-
 include/linux/netdev_features.h      | 16 ++++++++++------
 include/linux/netdevice.h            |  9 +++++++--
 net/8021q/vlan_dev.c                 |  5 ++++-
 net/bridge/br_forward.c              |  5 ++++-
 net/core/dev.c                       |  4 ++--
 net/ipv4/fib_frontend.c              |  5 ++++-
 net/ipv4/ip_forward.c                |  4 +++-
 net/ipv4/ip_gre.c                    |  4 +++-
 net/ipv4/ipip.c                      |  4 +++-
 net/ipv6/ip6_gre.c                   |  4 +++-
 net/ipv6/ip6_output.c                |  5 ++++-
 net/ipv6/ip6_tunnel.c                |  5 ++++-
 net/ipv6/sit.c                       |  4 +++-
 net/netfilter/nf_nat_redirect.c      |  2 +-
 net/openvswitch/vport-internal_dev.c |  6 ++++--
 21 files changed, 81 insertions(+), 31 deletions(-)

diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c
index 83c3f72e737d..8df21e3316e9 100644
--- a/drivers/net/dummy.c
+++ b/drivers/net/dummy.c
@@ -127,7 +127,9 @@ static void dummy_setup(struct net_device *dev)
 	dev->features	|= NETIF_F_GSO_SOFTWARE;
 	dev->features	|= NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_LLTX;
 	dev->features	|= NETIF_F_GSO_ENCAP_ALL;
-	dev->features	|= NETIF_F_VIRTUAL;
+#ifdef CONFIG_VE
+	dev->ve_features = NETIF_F_VIRTUAL;
+#endif
 	dev->hw_features |= dev->features;
 	dev->hw_enc_features |= dev->features;
 	eth_hw_addr_random(dev);
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
index a2424255661a..dc1c0b7b5ac0 100644
--- a/drivers/net/loopback.c
+++ b/drivers/net/loopback.c
@@ -183,9 +183,11 @@ static void gen_lo_setup(struct net_device *dev,
 		| NETIF_F_HIGHDMA
 		| NETIF_F_LLTX
 		| NETIF_F_NETNS_LOCAL
-		| NETIF_F_VIRTUAL
 		| NETIF_F_VLAN_CHALLENGED
 		| NETIF_F_LOOPBACK;
+#ifdef CONFIG_VE
+	dev->ve_features = NETIF_F_VIRTUAL;
+#endif
 	dev->ethtool_ops	= eth_ops;
 	dev->header_ops		= hdr_ops;
 	dev->netdev_ops		= dev_ops;
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
index 327c58c2dce9..075de0a20f6c 100644
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
@@ -1628,7 +1628,10 @@ static void ppp_setup(struct net_device *dev)
 	dev->netdev_ops = &ppp_netdev_ops;
 	SET_NETDEV_DEVTYPE(dev, &ppp_type);
 
-	dev->features |= NETIF_F_LLTX | NETIF_F_VIRTUAL;
+	dev->features |= NETIF_F_LLTX;
+#ifdef CONFIG_VE
+	dev->ve_features = NETIF_F_VIRTUAL;
+#endif
 
 	dev->hard_header_len = PPP_HDRLEN;
 	dev->mtu = PPP_MRU;
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 5c2b35902604..5f77d2ca0fad 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -2729,8 +2729,10 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
 		dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST |
 				   TUN_USER_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
 				   NETIF_F_HW_VLAN_STAG_TX;
-		dev->features = dev->hw_features | NETIF_F_LLTX |
-				   NETIF_F_VIRTUAL;
+		dev->features = dev->hw_features | NETIF_F_LLTX;
+#ifdef CONFIG_VE
+		dev->ve_features = NETIF_F_VIRTUAL;
+#endif
 		dev->vlan_features = dev->features &
 				     ~(NETIF_F_HW_VLAN_CTAG_TX |
 				       NETIF_F_HW_VLAN_STAG_TX);
diff --git a/drivers/net/venetdev.c b/drivers/net/venetdev.c
index ca80cc5efd24..f478d644e08b 100644
--- a/drivers/net/venetdev.c
+++ b/drivers/net/venetdev.c
@@ -703,8 +703,11 @@ static void venet_setup(struct net_device *dev)
 	 * No other features, as they are:
 	 *  - checksumming is required, and nobody else will done our job
 	 */
-	dev->features |= NETIF_F_VENET | NETIF_F_VIRTUAL | NETIF_F_LLTX |
-	       NETIF_F_HIGHDMA | NETIF_F_VLAN_CHALLENGED;
+	dev->features |= NETIF_F_LLTX | NETIF_F_HIGHDMA |
+			 NETIF_F_VLAN_CHALLENGED;
+#ifdef CONFIG_VE
+	dev->ve_features = NETIF_F_VENET | NETIF_F_VIRTUAL;
+#endif
 
 	dev->netdev_ops = &venet_netdev_ops;
 	dev->ethtool_ops = &venet_ethtool_ops;
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 17a30edea97c..49770468e689 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -3298,7 +3298,9 @@ static void vxlan_setup(struct net_device *dev)
 	dev->features	|= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
 	dev->features   |= NETIF_F_RXCSUM;
 	dev->features   |= NETIF_F_GSO_SOFTWARE;
-	dev->features	|= NETIF_F_VIRTUAL;
+#ifdef CONFIG_VE
+	dev->ve_features = NETIF_F_VIRTUAL;
+#endif
 
 	dev->vlan_features = dev->features;
 	dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h
index fbc8d5dd9799..9945162fa074 100644
--- a/include/linux/netdev_features.h
+++ b/include/linux/netdev_features.h
@@ -14,7 +14,7 @@ typedef u64 netdev_features_t;
 enum {
 	NETIF_F_SG_BIT,			/* Scatter/gather IO. */
 	NETIF_F_IP_CSUM_BIT,		/* Can checksum TCP/UDP over IPv4. */
-	NETIF_F_VIRTUAL_BIT,		/* Can be registered inside VE */
+	__UNUSED_NETIF_F_1,
 	NETIF_F_HW_CSUM_BIT,		/* Can checksum all the packets. */
 	NETIF_F_IPV6_CSUM_BIT,		/* Can checksum TCP/UDP over IPV6 */
 	NETIF_F_HIGHDMA_BIT,		/* Can DMA to high memory. */
@@ -84,9 +84,6 @@ enum {
 	NETIF_F_GRO_FRAGLIST_BIT,	/* Fraglist GRO */
 
 	NETIF_F_GRO_UDP_FWD_BIT,	/* Allow UDP GRO for forwarding */
-	/* here goes NETIF_F_HW_MACSEC_BIT in ms, temporarily reverted */
-					/* Offload MACsec operations */
-	NETIF_F_VENET_BIT,		/* Device is venet device */
 
 	NETIF_F_HW_HSR_TAG_INS_BIT,	/* Offload HSR tag insertion */
 	NETIF_F_HW_HSR_TAG_RM_BIT,	/* Offload HSR tag removal */
@@ -170,8 +167,16 @@ enum {
 #define NETIF_F_HW_HSR_FWD	__NETIF_F(HW_HSR_FWD)
 #define NETIF_F_HW_HSR_DUP	__NETIF_F(HW_HSR_DUP)
 
+#ifdef CONFIG_VE
+/* For net_device->ve_features */
+enum {
+	NETIF_F_VIRTUAL_BIT,	/* Device is venet device */
+	NETIF_F_VENET_BIT,	/* Device is venet device */
+};
+
 #define NETIF_F_VIRTUAL		__NETIF_F(VIRTUAL)
 #define NETIF_F_VENET		__NETIF_F(VENET)
+#endif
 
 /* Finds the next feature with the highest number of the range of start till 0.
  */
@@ -256,8 +261,7 @@ static inline int find_next_netdev_feature(u64 feature, unsigned long start)
 				 NETIF_F_HW_VLAN_CTAG_TX | \
 				 NETIF_F_HW_VLAN_STAG_FILTER | \
 				 NETIF_F_HW_VLAN_STAG_RX | \
-				 NETIF_F_HW_VLAN_STAG_TX |	\
-				 NETIF_F_VIRTUAL)
+				 NETIF_F_HW_VLAN_STAG_TX)
 
 #define NETIF_F_GSO_ENCAP_ALL	(NETIF_F_GSO_GRE |			\
 				 NETIF_F_GSO_GRE_CSUM |			\
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index bb7e2749f884..d093403dd26b 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1986,6 +1986,10 @@ struct net_device {
 	netdev_features_t	mpls_features;
 	netdev_features_t	gso_partial_features;
 
+#ifdef CONFIG_VE
+	netdev_features_t	ve_features;
+#endif
+
 	unsigned int		min_mtu;
 	unsigned int		max_mtu;
 	unsigned short		type;
@@ -5016,10 +5020,11 @@ netdev_features_t passthru_features_check(struct sk_buff *skb,
 					  netdev_features_t features);
 netdev_features_t netif_skb_features(struct sk_buff *skb);
 
-#if defined(CONFIG_VE) && defined(CONFIG_NET)
+#ifdef CONFIG_VE
 static inline int ve_is_dev_movable(struct net_device *dev)
 {
-	return !(dev->features & (NETIF_F_VIRTUAL | NETIF_F_NETNS_LOCAL));
+	return !(dev->ve_features & NETIF_F_VIRTUAL ||
+		 dev->features & NETIF_F_NETNS_LOCAL);
 }
 #else
 static inline int ve_is_dev_movable(struct net_device *dev)
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
index fc1b32f60f4e..dde3d3e32092 100644
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c
@@ -572,7 +572,10 @@ static int vlan_dev_init(struct net_device *dev)
 			   NETIF_F_HIGHDMA | NETIF_F_SCTP_CRC |
 			   NETIF_F_ALL_FCOE;
 
-	dev->features |= dev->hw_features | NETIF_F_LLTX | NETIF_F_VIRTUAL;
+	dev->features |= dev->hw_features | NETIF_F_LLTX;
+#ifdef CONFIG_VE
+	dev->ve_features = NETIF_F_VIRTUAL;
+#endif
 	dev->gso_max_size = real_dev->gso_max_size;
 	dev->gso_max_segs = real_dev->gso_max_segs;
 	if (dev->features & NETIF_F_VLAN_FEATURES)
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
index 2b1d004d6a1f..dfd0a989c4ab 100644
--- a/net/bridge/br_forward.c
+++ b/net/bridge/br_forward.c
@@ -33,7 +33,10 @@ static inline int should_deliver(const struct net_bridge_port *p,
 int br_dev_queue_push_xmit(struct net *net, struct sock *sk, struct sk_buff *skb)
 {
 	skb_push(skb, ETH_HLEN);
-	if (!(skb->dev->features & NETIF_F_VENET) &&
+	if (
+#ifdef CONFIG_VE
+	    !(skb->dev->ve_features & NETIF_F_VENET) &&
+#endif
 	    !is_skb_forwardable(skb->dev, skb))
 		goto drop;
 
diff --git a/net/core/dev.c b/net/core/dev.c
index d257a67adb88..b6dbbe7bf34b 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -10301,7 +10301,7 @@ int register_netdevice(struct net_device *dev)
 
 	ret = -EPERM;
 	if (!ve_is_super(net->owner_ve) && ve_is_dev_movable(dev))
-		goto out;
+		return ret;
 
 	ret = ethtool_check_ops(dev->ethtool_ops);
 	if (ret)
@@ -11425,7 +11425,7 @@ netdev_features_t netdev_increment_features(netdev_features_t all,
 		mask |= NETIF_F_CSUM_MASK;
 	mask |= NETIF_F_VLAN_CHALLENGED;
 
-	all |= one & (NETIF_F_ONE_FOR_ALL|NETIF_F_CSUM_MASK|NETIF_F_VIRTUAL) & mask;
+	all |= one & (NETIF_F_ONE_FOR_ALL | NETIF_F_CSUM_MASK) & mask;
 	all &= one | ~NETIF_F_ALL_FOR_ALL;
 
 	/* If one device supports hw checksumming, set for all. */
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index bf4d8cdb9725..54964c5d3f1f 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -378,7 +378,10 @@ static int __fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
 	if (fib_lookup(net, &fl4, &res, 0))
 		goto last_resort;
 	if (res.type != RTN_UNICAST &&
-	    (!(dev->features & NETIF_F_VENET) ||
+	    (
+#ifdef CONFIG_VE
+	     !(dev->ve_features & NETIF_F_VENET) ||
+#endif
 	     res.type != RTN_LOCAL || !IN_DEV_ACCEPT_LOCAL(idev)))
 		goto e_inval;
 	fib_combine_itag(itag, &res);
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c
index 2a150ffb0214..e0ad0b0ba8ca 100644
--- a/net/ipv4/ip_forward.c
+++ b/net/ipv4/ip_forward.c
@@ -151,7 +151,9 @@ int ip_forward(struct sk_buff *skb)
 #ifdef CONFIG_IP_ROUTE_NAT
 	    (rt->rt_flags & RTCF_NAT) == 0 &&	  /* no NAT mangling expected */
 #endif						  /* and */
-	    (skb->dev->features & NETIF_F_VENET) && /* src is VENET device and */
+#ifdef CONFIG_VE
+	    (skb->dev->ve_features & NETIF_F_VENET) && /* src is VENET device and */
+#endif
 	    (skb_headroom(skb) >= hroom)) {	  /* skb has enough headroom */
 		iph = ip_hdr(skb);
 		goto no_ttl_decr;
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index b1087eefb6e5..a5497bfa3dfd 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -977,7 +977,9 @@ static void __gre_tunnel_init(struct net_device *dev)
 		 */
 		dev->features |= NETIF_F_LLTX;
 	}
-	dev->features |= NETIF_F_VIRTUAL;
+#ifdef CONFIG_VE
+	dev->ve_features = NETIF_F_VIRTUAL;
+#endif
 }
 
 static int ipgre_tunnel_init(struct net_device *dev)
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c
index fb8552aa83a6..64488ca23b55 100644
--- a/net/ipv4/ipip.c
+++ b/net/ipv4/ipip.c
@@ -384,7 +384,9 @@ static void ipip_tunnel_setup(struct net_device *dev)
 	netif_keep_dst(dev);
 
 	dev->features		|= IPIP_FEATURES;
-	dev->features		|= NETIF_F_VIRTUAL;
+#ifdef CONFIG_VE
+	dev->ve_features 	 = NETIF_F_VIRTUAL;
+#endif
 	dev->hw_features	|= IPIP_FEATURES;
 	ip_tunnel_setup(dev, ipip_net_id);
 }
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
index 3d06e3c485e7..4c2023ccec54 100644
--- a/net/ipv6/ip6_gre.c
+++ b/net/ipv6/ip6_gre.c
@@ -1430,7 +1430,9 @@ static void ip6gre_tunnel_setup(struct net_device *dev)
 
 	dev->type = ARPHRD_IP6GRE;
 
-	dev->features |= NETIF_F_VIRTUAL;
+#ifdef CONFIG_VE
+	dev->ve_features = NETIF_F_VIRTUAL;
+#endif
 	dev->flags |= IFF_NOARP;
 	dev->addr_len = sizeof(struct in6_addr);
 	netif_keep_dst(dev);
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 11f8238111b9..62e94ad6df97 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -635,7 +635,10 @@ int ip6_forward(struct sk_buff *skb)
 	 * sufficient to prevent routing loops.
 	 */
 	hroom = dst->dev->hard_header_len;
-	if ((skb->dev->features & NETIF_F_VENET) && /* src is VENET device */
+	if (
+#ifdef CONFIG_VE
+	    (skb->dev->ve_features & NETIF_F_VENET) && /* src is VENET device */
+#endif
 	    (skb_headroom(skb) >= hroom))  /* and skb has enough headroom */
 		goto no_ttl_decr;
 
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index b9f7466b995c..cf9c1f85094b 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -1840,7 +1840,10 @@ static void ip6_tnl_dev_setup(struct net_device *dev)
 	dev->type = ARPHRD_TUNNEL6;
 	dev->flags |= IFF_NOARP;
 	dev->addr_len = sizeof(struct in6_addr);
-	dev->features |= NETIF_F_LLTX | NETIF_F_VIRTUAL;
+	dev->features |= NETIF_F_LLTX;
+#ifdef CONFIG_VE
+	dev->ve_features = NETIF_F_VIRTUAL;
+#endif
 	netif_keep_dst(dev);
 
 	dev->features		|= IPXIPX_FEATURES;
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index 36006b957366..211acbcf508a 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -1445,7 +1445,9 @@ static void ipip6_tunnel_setup(struct net_device *dev)
 	dev->addr_len		= 4;
 	dev->features		|= NETIF_F_LLTX;
 	dev->features		|= SIT_FEATURES;
-	dev->features		|= NETIF_F_VIRTUAL;
+#ifdef CONFIG_VE
+	dev->ve_features	 = NETIF_F_VIRTUAL;
+#endif
 	dev->hw_features	|= SIT_FEATURES;
 }
 
diff --git a/net/netfilter/nf_nat_redirect.c b/net/netfilter/nf_nat_redirect.c
index 3a49e27fee25..f4d813d6a30c 100644
--- a/net/netfilter/nf_nat_redirect.c
+++ b/net/netfilter/nf_nat_redirect.c
@@ -60,7 +60,7 @@ nf_nat_redirect_ipv4(struct sk_buff *skb,
 				 * should use first nonloopback ifa in
 				 * the list.
 				 */
-				if (skb->dev->features & NETIF_F_VENET) {
+				if (skb->dev->ve_features & NETIF_F_VENET) {
 					while (IN_LOOPBACK(ntohl(ifa->ifa_local)) &&
 					       ifa->ifa_next)
 						ifa = ifa->ifa_next;
diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c
index 334185261746..1c25158fbdf2 100644
--- a/net/openvswitch/vport-internal_dev.c
+++ b/net/openvswitch/vport-internal_dev.c
@@ -110,8 +110,10 @@ static void do_setup(struct net_device *netdev)
 
 	netdev->features = NETIF_F_LLTX | NETIF_F_SG | NETIF_F_FRAGLIST |
 			   NETIF_F_HIGHDMA | NETIF_F_HW_CSUM |
-			   NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL |
-			   NETIF_F_VIRTUAL;
+			   NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL;
+#ifdef CONFIG_VE
+	netdev->ve_features = NETIF_F_VIRTUAL;
+#endif
 
 	netdev->vlan_features = netdev->features;
 	netdev->hw_enc_features = netdev->features;
-- 
2.31.1



More information about the Devel mailing list