Skip to contentSkip to conversation

vlan: adds drops accounting

PATCH Applied Eric Dumazet 3 participants 3 messages Sep 3, 2009 – Sep 4, 2009

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 vlan: adds drops accounting

Its hard to tell if vlans are dropping frames, since every frame given to vlan_???_start_xmit() functions is accounted as fully transmitted by lower device.

We can test dev_queue_xmit() return values to properly account for dropped frames.

---
 net/8021q/vlan_dev.c |   29 ++++++++++++++++++++++-------
 1 files changed, 22 insertions(+), 7 deletions(-)
net/8021q/vlan_dev.c +22 -7
index 3938c3e..ca1f6a5 100644
@@ -294,6 +294,8 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
 	int i = skb_get_queue_mapping(skb);
 	struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
 	struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
+	unsigned int len;
+	int ret;
 
 	/* Handle non-VLAN frames if they are sent to us, for example by DHCP.
 	 *
@@ -319,11 +321,17 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
 			vlan_dev_info(dev)->cnt_inc_headroom_on_tx++;
 	}
 
-	txq->tx_packets++;
-	txq->tx_bytes += skb->len;
 
 	skb->dev = vlan_dev_info(dev)->real_dev;
-	dev_queue_xmit(skb);
+	len = skb->len;
+	ret = dev_queue_xmit(skb);
+
+	if (likely(ret == NET_XMIT_SUCCESS)) {
+		txq->tx_packets++;
+		txq->tx_bytes += len;
+	} else
+		txq->tx_dropped++;
+
 	return NETDEV_TX_OK;
 }
 
@@ -333,16 +341,23 @@ static netdev_tx_t vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb,
 	int i = skb_get_queue_mapping(skb);
 	struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
 	u16 vlan_tci;
+	unsigned int len;
+	int ret;
 
 	vlan_tci = vlan_dev_info(dev)->vlan_id;
 	vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
 	skb = __vlan_hwaccel_put_tag(skb, vlan_tci);
 
-	txq->tx_packets++;
-	txq->tx_bytes += skb->len;
-
 	skb->dev = vlan_dev_info(dev)->real_dev;
-	dev_queue_xmit(skb);
+	len = skb->len;
+	ret = dev_queue_xmit(skb);
+
+	if (likely(ret == NET_XMIT_SUCCESS)) {
+		txq->tx_packets++;
+		txq->tx_bytes += len;
+	} else
+		txq->tx_dropped++;
+
 	return NETDEV_TX_OK;
 }
 
maintainer Applied
#1 lore raw

From: Eric Dumazet <[email protected]>
Date: Thu, 03 Sep 2009 12:39:16 +0200

Quoted 8 lines

Its hard to tell if vlans are dropping frames, since every frame given to vlan_???_start_xmit() functions is accounted as fully transmitted by lower device.

We can test dev_queue_xmit() return values to properly account for dropped frames.

Applied.

But, how inappropriate would it be to keep doing the accounting but pass the status back to the caller? Or will that screw up the qdisc running engine?

#2 lore raw
Quoted 10 lines · David Miller

From: Eric Dumazet <[email protected]>
Date: Thu, 03 Sep 2009 12:39:16 +0200

Quoted 7 lines

Its hard to tell if vlans are dropping frames, since every frame given to vlan_???_start_xmit() functions is accounted as fully transmitted by lower device.

We can test dev_queue_xmit() return values to properly account for dropped frames.

Quoted 7 lines
Quoted 1 line

Applied.

But, how inappropriate would it be to keep doing the accounting but pass the status back to the caller? Or will that screw up the qdisc running engine?

Its currently not possible to return the dev_queue_xmit() status from ndo_start_xmit(). My patch to extend the possible return values will allow that. I hope I'm able to take care of it today.