]> Pileus Git - ~andy/linux/blobdiff - net/core/dev.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-nmw
[~andy/linux] / net / core / dev.c
index 1cb0d8a6aa6c5cd3d23741cd5b941a23805b08bd..0ebaea16632fc348f6a48789831b737c7c51b707 100644 (file)
@@ -1632,6 +1632,8 @@ static inline int deliver_skb(struct sk_buff *skb,
                              struct packet_type *pt_prev,
                              struct net_device *orig_dev)
 {
+       if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
+               return -ENOMEM;
        atomic_inc(&skb->users);
        return pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
 }
@@ -1691,7 +1693,8 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
        rcu_read_unlock();
 }
 
-/* netif_setup_tc - Handle tc mappings on real_num_tx_queues change
+/**
+ * netif_setup_tc - Handle tc mappings on real_num_tx_queues change
  * @dev: Network device
  * @txq: number of queues available
  *
@@ -1793,6 +1796,18 @@ int netif_set_real_num_rx_queues(struct net_device *dev, unsigned int rxq)
 EXPORT_SYMBOL(netif_set_real_num_rx_queues);
 #endif
 
+/**
+ * netif_get_num_default_rss_queues - default number of RSS queues
+ *
+ * This routine should set an upper limit on the number of RSS queues
+ * used by default by multiqueue devices.
+ */
+int netif_get_num_default_rss_queues(void)
+{
+       return min_t(int, DEFAULT_MAX_NUM_RSS_QUEUES, num_online_cpus());
+}
+EXPORT_SYMBOL(netif_get_num_default_rss_queues);
+
 static inline void __netif_reschedule(struct Qdisc *q)
 {
        struct softnet_data *sd;
@@ -2458,6 +2473,23 @@ static void skb_update_prio(struct sk_buff *skb)
 static DEFINE_PER_CPU(int, xmit_recursion);
 #define RECURSION_LIMIT 10
 
+/**
+ *     dev_loopback_xmit - loop back @skb
+ *     @skb: buffer to transmit
+ */
+int dev_loopback_xmit(struct sk_buff *skb)
+{
+       skb_reset_mac_header(skb);
+       __skb_pull(skb, skb_network_offset(skb));
+       skb->pkt_type = PACKET_LOOPBACK;
+       skb->ip_summed = CHECKSUM_UNNECESSARY;
+       WARN_ON(!skb_dst(skb));
+       skb_dst_force(skb);
+       netif_rx_ni(skb);
+       return 0;
+}
+EXPORT_SYMBOL(dev_loopback_xmit);
+
 /**
  *     dev_queue_xmit - transmit a buffer
  *     @skb: buffer to transmit
@@ -3141,8 +3173,6 @@ static int __netif_receive_skb(struct sk_buff *skb)
        if (netpoll_receive_skb(skb))
                return NET_RX_DROP;
 
-       if (!skb->skb_iif)
-               skb->skb_iif = skb->dev->ifindex;
        orig_dev = skb->dev;
 
        skb_reset_network_header(skb);
@@ -3154,6 +3184,7 @@ static int __netif_receive_skb(struct sk_buff *skb)
        rcu_read_lock();
 
 another_round:
+       skb->skb_iif = skb->dev->ifindex;
 
        __this_cpu_inc(softnet_data.processed);
 
@@ -3232,7 +3263,10 @@ ncls:
        }
 
        if (pt_prev) {
-               ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
+               if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
+                       ret = -ENOMEM;
+               else
+                       ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
        } else {
                atomic_long_inc(&skb->dev->rx_dropped);
                kfree_skb(skb);
@@ -5646,7 +5680,7 @@ int netdev_refcnt_read(const struct net_device *dev)
 }
 EXPORT_SYMBOL(netdev_refcnt_read);
 
-/*
+/**
  * netdev_wait_allrefs - wait until all references are gone.
  *
  * This is called when unregistering network devices.