udp: Wrong locking code in udp seq_file infrastructure
[safe/jmp/linux-2.6] / net / ipv4 / proc.c
index a631a1f..eb62e58 100644 (file)
@@ -38,6 +38,7 @@
 #include <net/tcp.h>
 #include <net/udp.h>
 #include <net/udplite.h>
+#include <linux/bottom_half.h>
 #include <linux/inetdevice.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 static int sockstat_seq_show(struct seq_file *seq, void *v)
 {
        struct net *net = seq->private;
+       int orphans, sockets;
+
+       local_bh_disable();
+       orphans = percpu_counter_sum_positive(&tcp_orphan_count),
+       sockets = percpu_counter_sum_positive(&tcp_sockets_allocated),
+       local_bh_enable();
 
        socket_seq_show(seq);
        seq_printf(seq, "TCP: inuse %d orphan %d tw %d alloc %d mem %d\n",
-                  sock_prot_inuse_get(net, &tcp_prot),
-                  atomic_read(&tcp_orphan_count),
-                  tcp_death_row.tw_count, atomic_read(&tcp_sockets_allocated),
+                  sock_prot_inuse_get(net, &tcp_prot), orphans,
+                  tcp_death_row.tw_count, sockets,
                   atomic_read(&tcp_memory_allocated));
        seq_printf(seq, "UDP: inuse %d mem %d\n",
                   sock_prot_inuse_get(net, &udp_prot),
@@ -234,6 +240,9 @@ static const struct snmp_mib snmp4_net_list[] = {
        SNMP_MIB_ITEM("TCPSpuriousRTOs", LINUX_MIB_TCPSPURIOUSRTOS),
        SNMP_MIB_ITEM("TCPMD5NotFound", LINUX_MIB_TCPMD5NOTFOUND),
        SNMP_MIB_ITEM("TCPMD5Unexpected", LINUX_MIB_TCPMD5UNEXPECTED),
+       SNMP_MIB_ITEM("TCPSackShifted", LINUX_MIB_SACKSHIFTED),
+       SNMP_MIB_ITEM("TCPSackMerged", LINUX_MIB_SACKMERGED),
+       SNMP_MIB_ITEM("TCPSackShiftFallback", LINUX_MIB_SACKSHIFTFALLBACK),
        SNMP_MIB_SENTINEL
 };