Skip to contentSkip to conversation

sunvnet: allow admin to set sunvnet MTU

PATCH Superseded David L Stevens 2 participants 3 messages Sep 18, 2014

Subsystems (3)

v6 of 9 Superseded Latest is v9 →

lore
Share & tools
lore
#0 lore raw

PATCH v6 2/3 sunvnet: allow admin to set sunvnet MTU

This patch allows an admin to set the MTU on a sunvnet device to arbitrary values between the minimum (68) and maximum (65535) IPv4 packet sizes.

---
 arch/sparc/kernel/ldc.c            |    2 +-
 drivers/net/ethernet/sun/sunvnet.c |    7 +++++--
 drivers/net/ethernet/sun/sunvnet.h |    6 ++++--
 3 files changed, 10 insertions(+), 5 deletions(-)
arch/sparc/kernel/ldc.c +1 -1
index 66dacd5..0af28b9 100644
@@ -2159,7 +2159,7 @@ int ldc_map_single(struct ldc_channel *lp,
 	state.pte_idx = (base - iommu->page_table);
 	state.nc = 0;
 	fill_cookies(&state, (pa & PAGE_MASK), (pa & ~PAGE_MASK), len);
-	BUG_ON(state.nc != 1);
+	BUG_ON(state.nc > ncookies);
 
 	return state.nc;
 }
drivers/net/ethernet/sun/sunvnet.c +5 -2
index a9638c1..5e64e60 100644
@@ -791,6 +791,9 @@ static int vnet_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	if (unlikely(!port))
 		goto out_dropped;
 
+	if (skb->len > port->rmtu)
+		goto out_dropped;
+
 	spin_lock_irqsave(&port->vio.lock, flags);
 
 	dr = &port->vio.drings[VIO_DRIVER_TX_RING];
@@ -1038,7 +1041,7 @@ static void vnet_set_rx_mode(struct net_device *dev)
 
 static int vnet_change_mtu(struct net_device *dev, int new_mtu)
 {
-	if (new_mtu != ETH_DATA_LEN)
+	if (new_mtu < 68 || new_mtu > 65535)
 		return -EINVAL;
 
 	dev->mtu = new_mtu;
@@ -1131,7 +1134,7 @@ static int vnet_port_alloc_tx_bufs(struct vnet_port *port)
 		}
 
 		err = ldc_map_single(port->vio.lp, buf, map_len,
-				     port->tx_bufs[i].cookies, 2,
+				     port->tx_bufs[i].cookies, VNET_MAXCOOKIES,
 				     (LDC_MAP_SHADOW |
 				      LDC_MAP_DIRECT |
 				      LDC_MAP_RW));
drivers/net/ethernet/sun/sunvnet.h +4 -2
index 986e04b..a39a801 100644
@@ -11,7 +11,7 @@
  */
 #define VNET_TX_TIMEOUT			(5 * HZ)
 
-#define VNET_MAXPACKET			1518ULL /* ETH_FRAMELEN + VLAN_HDR */
+#define VNET_MAXPACKET			(65535ULL + ETH_HLEN + VLAN_HLEN)
 #define VNET_TX_RING_SIZE		512
 #define VNET_TX_WAKEUP_THRESH(dr)	((dr)->pending / 4)
 
@@ -21,10 +21,12 @@
  */
 #define VNET_PACKET_SKIP		6
 
+#define VNET_MAXCOOKIES			(VNET_MAXPACKET/PAGE_SIZE + 1)
+
 struct vnet_tx_entry {
 	void			*buf;
 	unsigned int		ncookies;
-	struct ldc_trans_cookie	cookies[2];
+	struct ldc_trans_cookie	cookies[VNET_MAXCOOKIES];
 };
 
 struct vnet;
Signature · 1 line
1.7.1
#1 lore raw
Quoted 38 lines · David L Stevens

This patch allows an admin to set the MTU on a sunvnet device to arbitrary values between the minimum (68) and maximum (65535) IPv4 packet sizes.

---

arch/sparc/kernel/ldc.c            |    2 +-
drivers/net/ethernet/sun/sunvnet.c |    7 +++++--
drivers/net/ethernet/sun/sunvnet.h |    6 ++++--
3 files changed, 10 insertions(+), 5 deletions(-)
arch/sparc/kernel/ldc.c +1 -1
index 66dacd5..0af28b9 100644
@@ -2159,7 +2159,7 @@ int ldc_map_single(struct ldc_channel *lp,
 	state.pte_idx = (base - iommu->page_table);
 	state.nc = 0;
 	fill_cookies(&state, (pa & PAGE_MASK), (pa & ~PAGE_MASK), len);
-	BUG_ON(state.nc != 1);
+	BUG_ON(state.nc > ncookies);
 
 	return state.nc;
 }
drivers/net/ethernet/sun/sunvnet.c +3 -0
index a9638c1..5e64e60 100644
@@ -791,6 +791,9 @@ static int vnet_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	if (unlikely(!port))
 		goto out_dropped;
 
+	if (skb->len > port->rmtu)
+		goto out_dropped;
+
 	spin_lock_irqsave(&port->vio.lock, flags);
 
 	dr = &port->vio.drings[VIO_DRIVER_TX_RING];

drivers/net/ethernet/sun/sunvnet.c static void vnet_set_rx_mode(struct net_device *dev) · line 1046

Quoted 7 lines
drivers/net/ethernet/sun/sunvnet.c +1 -1
@@ -1038,7 +1041,7 @@ static void vnet_set_rx_mode(struct net_device *dev)
 
 static int vnet_change_mtu(struct net_device *dev, int new_mtu)
 {
-	if (new_mtu != ETH_DATA_LEN)
+	if (new_mtu < 68 || new_mtu > 65535)
 		return -EINVAL;
 

FYI, LDoms manager provides the maximum MTU of packets allowed for
a vnet device in the "virtual-device" MD node corresponding to the vnet device. The virtual switch is expected to enforce that size for packets that go through it. Ideally we want a Guest OS to honor that MTU setting as well, which is probably not the case here. LDoms manager doesn't allow setting more than 16K today, I guess this code is ignoring this for Guest to Guest communication.

-Raghuram

Quoted 44 lines
drivers/net/ethernet/sun/sunvnet.c +1 -1
 	dev->mtu = new_mtu;
@@ -1131,7 +1134,7 @@ static int vnet_port_alloc_tx_bufs(struct vnet_port *port)
 		}
 
 		err = ldc_map_single(port->vio.lp, buf, map_len,
-				     port->tx_bufs[i].cookies, 2,
+				     port->tx_bufs[i].cookies, VNET_MAXCOOKIES,
 				     (LDC_MAP_SHADOW |
 				      LDC_MAP_DIRECT |
 				      LDC_MAP_RW));
drivers/net/ethernet/sun/sunvnet.h +4 -2
index 986e04b..a39a801 100644
@@ -11,7 +11,7 @@
 */
 #define VNET_TX_TIMEOUT			(5 * HZ)
 
-#define VNET_MAXPACKET			1518ULL /* ETH_FRAMELEN + VLAN_HDR */
+#define VNET_MAXPACKET			(65535ULL + ETH_HLEN + VLAN_HLEN)
 #define VNET_TX_RING_SIZE		512
 #define VNET_TX_WAKEUP_THRESH(dr)	((dr)->pending / 4)
 
@@ -21,10 +21,12 @@
 */
 #define VNET_PACKET_SKIP		6
 
+#define VNET_MAXCOOKIES			(VNET_MAXPACKET/PAGE_SIZE + 1)
+
 struct vnet_tx_entry {
 	void			*buf;
 	unsigned int		ncookies;
-	struct ldc_trans_cookie	cookies[2];
+	struct ldc_trans_cookie	cookies[VNET_MAXCOOKIES];
 };
 
 struct vnet;
Signature · 6 lines
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#2 lore raw
Quoted 7 lines · Raghuram Kothakota

FYI, LDoms manager provides the maximum MTU of packets allowed for
a vnet device in the "virtual-device" MD node corresponding to the vnet device. The virtual switch is expected to enforce that size for packets that go through it. Ideally we want a Guest OS to honor that MTU setting as well, which is probably not the case here. LDoms manager doesn't allow setting more than 16K today, I guess this code is ignoring this for Guest to Guest communication.

Yes, this is negotiated per LDC connection, and it uses the switch size when using the switch port, but can use a full 64K linux-linux. Anything involving Solaris will be limited to 16000, and any connections to Legacy linux will be limited to 1500 bytes.

If the port for a particular destination changes and the new port has a smaller MTU, the packets will trigger an ICMP PMTUD notification and any active connections will continue to work at the smaller MTU, by PMTUD design.

								+-DLS