]> err.no Git - linux-2.6/blobdiff - net/ipv4/af_inet.c
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
[linux-2.6] / net / ipv4 / af_inet.c
index 45ced52c03d46db84900228d10bfb391053d0248..06c08e5740fbcca5b0aa37dade5a90f88609ee42 100644 (file)
@@ -92,7 +92,6 @@
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
-#include <linux/smp_lock.h>
 #include <linux/inet.h>
 #include <linux/igmp.h>
 #include <linux/inetdevice.h>
@@ -1171,6 +1170,9 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features)
        int ihl;
        int id;
 
+       if (!(features & NETIF_F_V4_CSUM))
+               features &= ~NETIF_F_SG;
+
        if (unlikely(skb_shinfo(skb)->gso_type &
                     ~(SKB_GSO_TCPV4 |
                       SKB_GSO_UDP |
@@ -1219,6 +1221,46 @@ out:
        return segs;
 }
 
+unsigned long snmp_fold_field(void *mib[], int offt)
+{
+       unsigned long res = 0;
+       int i;
+
+       for_each_possible_cpu(i) {
+               res += *(((unsigned long *) per_cpu_ptr(mib[0], i)) + offt);
+               res += *(((unsigned long *) per_cpu_ptr(mib[1], i)) + offt);
+       }
+       return res;
+}
+EXPORT_SYMBOL_GPL(snmp_fold_field);
+
+int snmp_mib_init(void *ptr[2], size_t mibsize, size_t mibalign)
+{
+       BUG_ON(ptr == NULL);
+       ptr[0] = __alloc_percpu(mibsize);
+       if (!ptr[0])
+               goto err0;
+       ptr[1] = __alloc_percpu(mibsize);
+       if (!ptr[1])
+               goto err1;
+       return 0;
+err1:
+       free_percpu(ptr[0]);
+       ptr[0] = NULL;
+err0:
+       return -ENOMEM;
+}
+EXPORT_SYMBOL_GPL(snmp_mib_init);
+
+void snmp_mib_free(void *ptr[2])
+{
+       BUG_ON(ptr == NULL);
+       free_percpu(ptr[0]);
+       free_percpu(ptr[1]);
+       ptr[0] = ptr[1] = NULL;
+}
+EXPORT_SYMBOL_GPL(snmp_mib_free);
+
 #ifdef CONFIG_IP_MULTICAST
 static struct net_protocol igmp_protocol = {
        .handler =      igmp_rcv,
@@ -1245,28 +1287,47 @@ static struct net_protocol icmp_protocol = {
 
 static int __init init_ipv4_mibs(void)
 {
-       net_statistics[0] = alloc_percpu(struct linux_mib);
-       net_statistics[1] = alloc_percpu(struct linux_mib);
-       ip_statistics[0] = alloc_percpu(struct ipstats_mib);
-       ip_statistics[1] = alloc_percpu(struct ipstats_mib);
-       icmp_statistics[0] = alloc_percpu(struct icmp_mib);
-       icmp_statistics[1] = alloc_percpu(struct icmp_mib);
-       tcp_statistics[0] = alloc_percpu(struct tcp_mib);
-       tcp_statistics[1] = alloc_percpu(struct tcp_mib);
-       udp_statistics[0] = alloc_percpu(struct udp_mib);
-       udp_statistics[1] = alloc_percpu(struct udp_mib);
-       udplite_statistics[0] = alloc_percpu(struct udp_mib);
-       udplite_statistics[1] = alloc_percpu(struct udp_mib);
-       if (!
-           (net_statistics[0] && net_statistics[1] && ip_statistics[0]
-            && ip_statistics[1] && tcp_statistics[0] && tcp_statistics[1]
-            && udp_statistics[0] && udp_statistics[1]
-            && udplite_statistics[0] && udplite_statistics[1]             ) )
-               return -ENOMEM;
-
-       (void) tcp_mib_init();
+       if (snmp_mib_init((void **)net_statistics,
+                         sizeof(struct linux_mib),
+                         __alignof__(struct linux_mib)) < 0)
+               goto err_net_mib;
+       if (snmp_mib_init((void **)ip_statistics,
+                         sizeof(struct ipstats_mib),
+                         __alignof__(struct ipstats_mib)) < 0)
+               goto err_ip_mib;
+       if (snmp_mib_init((void **)icmp_statistics,
+                         sizeof(struct icmp_mib),
+                         __alignof__(struct icmp_mib)) < 0)
+               goto err_icmp_mib;
+       if (snmp_mib_init((void **)tcp_statistics,
+                         sizeof(struct tcp_mib),
+                         __alignof__(struct tcp_mib)) < 0)
+               goto err_tcp_mib;
+       if (snmp_mib_init((void **)udp_statistics,
+                         sizeof(struct udp_mib),
+                         __alignof__(struct udp_mib)) < 0)
+               goto err_udp_mib;
+       if (snmp_mib_init((void **)udplite_statistics,
+                         sizeof(struct udp_mib),
+                         __alignof__(struct udp_mib)) < 0)
+               goto err_udplite_mib;
+
+       tcp_mib_init();
 
        return 0;
+
+err_udplite_mib:
+       snmp_mib_free((void **)udp_statistics);
+err_udp_mib:
+       snmp_mib_free((void **)tcp_statistics);
+err_tcp_mib:
+       snmp_mib_free((void **)icmp_statistics);
+err_icmp_mib:
+       snmp_mib_free((void **)ip_statistics);
+err_ip_mib:
+       snmp_mib_free((void **)net_statistics);
+err_net_mib:
+       return -ENOMEM;
 }
 
 static int ipv4_proc_init(void);