sunvnet: allow admin to set sunvnet MTU
Subsystems (3)
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
@@ -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
@@ -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
@@ -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
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.
Signed-off-by David L Stevens <[email protected]>---
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@@ -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@@ -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
-1dev->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@@ -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
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