]> Git Repo - linux.git/blobdiff - drivers/net/xen-netback/rx.c
xen/netback: don't queue unlimited number of packages
[linux.git] / drivers / net / xen-netback / rx.c
index a8511e27d6c132c0217532f2462149e09c041237..dbac4c03d21a14d12a2eee9e7b3418c9cc184d88 100644 (file)
@@ -88,16 +88,19 @@ void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb)
 
        spin_lock_irqsave(&queue->rx_queue.lock, flags);
 
-       if (skb_queue_empty(&queue->rx_queue))
-               xenvif_update_needed_slots(queue, skb);
-
-       __skb_queue_tail(&queue->rx_queue, skb);
-
-       queue->rx_queue_len += skb->len;
-       if (queue->rx_queue_len > queue->rx_queue_max) {
+       if (queue->rx_queue_len >= queue->rx_queue_max) {
                struct net_device *dev = queue->vif->dev;
 
                netif_tx_stop_queue(netdev_get_tx_queue(dev, queue->id));
+               kfree_skb(skb);
+               queue->vif->dev->stats.rx_dropped++;
+       } else {
+               if (skb_queue_empty(&queue->rx_queue))
+                       xenvif_update_needed_slots(queue, skb);
+
+               __skb_queue_tail(&queue->rx_queue, skb);
+
+               queue->rx_queue_len += skb->len;
        }
 
        spin_unlock_irqrestore(&queue->rx_queue.lock, flags);
@@ -147,6 +150,7 @@ static void xenvif_rx_queue_drop_expired(struct xenvif_queue *queue)
                        break;
                xenvif_rx_dequeue(queue);
                kfree_skb(skb);
+               queue->vif->dev->stats.rx_dropped++;
        }
 }
 
This page took 0.028949 seconds and 4 git commands to generate.