]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/ipv4/af_inet.c
net: cleanups
[net-next-2.6.git] / net / ipv4 / af_inet.c
index 551ce564b035592f54f1d6330d98454570bf3afd..3ceb025b16f29db6cf735b58839c61fa42223657 100644 (file)
@@ -355,6 +355,8 @@ lookup_protocol:
        inet = inet_sk(sk);
        inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
 
+       inet->nodefrag = 0;
+
        if (SOCK_RAW == sock->type) {
                inet->inet_num = protocol;
                if (IPPROTO_RAW == protocol)
@@ -1100,7 +1102,7 @@ static int inet_sk_reselect_saddr(struct sock *sk)
        if (err)
                return err;
 
-       sk_setup_caps(sk, &rt->u.dst);
+       sk_setup_caps(sk, &rt->dst);
 
        new_saddr = rt->rt_src;
 
@@ -1166,7 +1168,7 @@ int inet_sk_rebuild_header(struct sock *sk)
        err = ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0);
 }
        if (!err)
-               sk_setup_caps(sk, &rt->u.dst);
+               sk_setup_caps(sk, &rt->dst);
        else {
                /* Routing failed... */
                sk->sk_route_caps = 0;
@@ -1425,13 +1427,49 @@ unsigned long snmp_fold_field(void __percpu *mib[], int offt)
 }
 EXPORT_SYMBOL_GPL(snmp_fold_field);
 
-int snmp_mib_init(void __percpu *ptr[2], size_t mibsize)
+#if BITS_PER_LONG==32
+
+u64 snmp_fold_field64(void __percpu *mib[], int offt, size_t syncp_offset)
+{
+       u64 res = 0;
+       int cpu;
+
+       for_each_possible_cpu(cpu) {
+               void *bhptr, *userptr;
+               struct u64_stats_sync *syncp;
+               u64 v_bh, v_user;
+               unsigned int start;
+
+               /* first mib used by softirq context, we must use _bh() accessors */
+               bhptr = per_cpu_ptr(SNMP_STAT_BHPTR(mib), cpu);
+               syncp = (struct u64_stats_sync *)(bhptr + syncp_offset);
+               do {
+                       start = u64_stats_fetch_begin_bh(syncp);
+                       v_bh = *(((u64 *) bhptr) + offt);
+               } while (u64_stats_fetch_retry_bh(syncp, start));
+
+               /* second mib used in USER context */
+               userptr = per_cpu_ptr(SNMP_STAT_USRPTR(mib), cpu);
+               syncp = (struct u64_stats_sync *)(userptr + syncp_offset);
+               do {
+                       start = u64_stats_fetch_begin(syncp);
+                       v_user = *(((u64 *) userptr) + offt);
+               } while (u64_stats_fetch_retry(syncp, start));
+
+               res += v_bh + v_user;
+       }
+       return res;
+}
+EXPORT_SYMBOL_GPL(snmp_fold_field64);
+#endif
+
+int snmp_mib_init(void __percpu *ptr[2], size_t mibsize, size_t align)
 {
        BUG_ON(ptr == NULL);
-       ptr[0] = __alloc_percpu(mibsize, __alignof__(unsigned long));
+       ptr[0] = __alloc_percpu(mibsize, align);
        if (!ptr[0])
                goto err0;
-       ptr[1] = __alloc_percpu(mibsize, __alignof__(unsigned long));
+       ptr[1] = __alloc_percpu(mibsize, align);
        if (!ptr[1])
                goto err1;
        return 0;
@@ -1488,25 +1526,32 @@ static const struct net_protocol icmp_protocol = {
 static __net_init int ipv4_mib_init_net(struct net *net)
 {
        if (snmp_mib_init((void __percpu **)net->mib.tcp_statistics,
-                         sizeof(struct tcp_mib)) < 0)
+                         sizeof(struct tcp_mib),
+                         __alignof__(struct tcp_mib)) < 0)
                goto err_tcp_mib;
        if (snmp_mib_init((void __percpu **)net->mib.ip_statistics,
-                         sizeof(struct ipstats_mib)) < 0)
+                         sizeof(struct ipstats_mib),
+                         __alignof__(struct ipstats_mib)) < 0)
                goto err_ip_mib;
        if (snmp_mib_init((void __percpu **)net->mib.net_statistics,
-                         sizeof(struct linux_mib)) < 0)
+                         sizeof(struct linux_mib),
+                         __alignof__(struct linux_mib)) < 0)
                goto err_net_mib;
        if (snmp_mib_init((void __percpu **)net->mib.udp_statistics,
-                         sizeof(struct udp_mib)) < 0)
+                         sizeof(struct udp_mib),
+                         __alignof__(struct udp_mib)) < 0)
                goto err_udp_mib;
        if (snmp_mib_init((void __percpu **)net->mib.udplite_statistics,
-                         sizeof(struct udp_mib)) < 0)
+                         sizeof(struct udp_mib),
+                         __alignof__(struct udp_mib)) < 0)
                goto err_udplite_mib;
        if (snmp_mib_init((void __percpu **)net->mib.icmp_statistics,
-                         sizeof(struct icmp_mib)) < 0)
+                         sizeof(struct icmp_mib),
+                         __alignof__(struct icmp_mib)) < 0)
                goto err_icmp_mib;
        if (snmp_mib_init((void __percpu **)net->mib.icmpmsg_statistics,
-                         sizeof(struct icmpmsg_mib)) < 0)
+                         sizeof(struct icmpmsg_mib),
+                         __alignof__(struct icmpmsg_mib)) < 0)
                goto err_icmpmsg_mib;
 
        tcp_mib_init(net);