mib: add struct net to IP, TCP and NET macros
Subsystems (7)
cover mib: add struct net to IP, TCP and NET macros
This is actually the last very scattered set, that changes many calls to MIB accounting macros. What is left requires less patching.
David, I hope this (and a finalizing set, I will prepare after this one is accepted) can go to current 2.6.27 merge window, but it is OK with me if your decision is to delay this till 2.6.28.
PATCH 1/20 ipv4: prepare net initialization for IP accounting
Some places, that deal with IP statistics already have where to get a struct net from, but use it directly, without declaring a separate variable on the stack.
So, save this net on the stack for future IP_XXX_STATS macros.
--- net/ipv4/inet_connection_sock.c | 3 ++- net/ipv4/ip_fragment.c | 6 +++--- net/ipv4/udp.c | 4 +++- 3 files changed, 8 insertions(+), 5 deletions(-)
net/ipv4/inet_connection_sock.c +2 -1
@@ -338,9 +338,10 @@ struct dst_entry* inet_csk_route_req(struct sock *sk, .uli_u = { .ports = { .sport = inet_sk(sk)->sport, .dport = ireq->rmt_port } } }; +struct net *net =sock_net (sk);security_req_classify_flow (req, &fl); -if (ip_route_output_flow (sock_net (sk), &rt, &fl, sk,0 )) { +if (ip_route_output_flow (net, &rt, &fl, sk,0 )) {IP_INC_STATS_BH (IPSTATS_MIB_OUTNOROUTES );return NULL ; }
net/ipv4/ip_fragment.c +3 -3
@@ -187,8 +187,10 @@ static void ip_evictor(struct net *net)static void ip_expire (unsigned long arg) {struct ipq *qp; +struct net *net; qp = container_of((struct inet_frag_queue *) arg, struct ipq, q); + net = container_of(qp->q.net, struct net, ipv4.frags);spin_lock (&qp->q.lock);
@@ -202,9 +204,7 @@ static void ip_expire(unsigned long arg)if ((qp->q.last_in &INET_FRAG_FIRST_IN ) && qp->q.fragments !=NULL ) {struct sk_buff *head = qp->q.fragments; -struct net *net; - net = container_of(qp->q.net, struct net, ipv4.frags);/* Send an ICMP "Fragment Reassembly Timeout" message. */ if ((head->dev =dev_get_by_index (net, qp->iif)) !=NULL ) {icmp_send (head,ICMP_TIME_EXCEEDED ,ICMP_EXC_FRAGTIME ,0 );
@@ -570,9 +570,9 @@ int ip_defrag(struct sk_buff *skb, u32 user)struct ipq *qp;struct net *net; + net = skb->dev ?dev_net (skb->dev) :dev_net (skb->dst->dev);IP_INC_STATS_BH (IPSTATS_MIB_REASMREQDS ); - net = skb->dev ?dev_net (skb->dev) :dev_net (skb->dst->dev);/* Start by cleaning up the memory. */ if (atomic_read (&net->ipv4.frags.mem) > net->ipv4.frags.high_thresh)ip_evictor (net);
net/ipv4/udp.c +3 -1
@@ -656,8 +656,10 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, .uli_u = { .ports = { .sport = inet->sport, .dport = dport } } }; +struct net *net =sock_net (sk); +security_sk_classify_flow (sk, &fl); - err =ip_route_output_flow (sock_net (sk), &rt, &fl, sk,1 ); + err =ip_route_output_flow (net, &rt, &fl, sk,1 );if (err) {if (err == -ENETUNREACH )IP_INC_STATS_BH (IPSTATS_MIB_OUTNOROUTES );
Signature · 1 line
1.5.5.1
PATCH 2/20 mib: drop unused IP_INC_STATS_USER
In reply to Pavel Emelyanov--- include/net/ip.h | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
include/net/ip.h +0 -1
@@ -159,7 +159,6 @@ extern struct ipv4_config ipv4_config; DECLARE_SNMP_STAT(struct ipstats_mib, ip_statistics);#define IP_INC_STATS (field) SNMP_INC_STATS(ip_statistics, field)#define IP_INC_STATS_BH (field) SNMP_INC_STATS_BH(ip_statistics, field) -#define IP_INC_STATS_USER (field) SNMP_INC_STATS_USER(ip_statistics, field)#define IP_ADD_STATS_BH (field, val) SNMP_ADD_STATS_BH(ip_statistics, field, val) DECLARE_SNMP_STAT(struct linux_mib, net_statistics);#define NET_INC_STATS (field) SNMP_INC_STATS(net_statistics, field)
Signature · 1 line
1.5.5.1
PATCH 3/20 mib: add net to IP_INC_STATS
In reply to Pavel EmelyanovAll the callers already have either the net itself, or the place where to get it from.
--- include/net/ip.h | 2 +- net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_output.c | 30 +++++++++++++++--------------- net/ipv4/raw.c | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-)
include/net/ip.h +1 -1
@@ -157,7 +157,7 @@ struct ipv4_configextern struct ipv4_config ipv4_config; DECLARE_SNMP_STAT(struct ipstats_mib, ip_statistics); -#define IP_INC_STATS (field) SNMP_INC_STATS(ip_statistics, field) +#define IP_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(ip_statistics, field); } while (0)#define IP_INC_STATS_BH (field) SNMP_INC_STATS_BH(ip_statistics, field)#define IP_ADD_STATS_BH (field, val) SNMP_ADD_STATS_BH(ip_statistics, field, val) DECLARE_SNMP_STAT(struct linux_mib, net_statistics);
net/ipv4/ip_forward.c +1 -1
@@ -88,7 +88,7 @@ int ip_forward(struct sk_buff *skb)if (unlikely (skb->len >dst_mtu (&rt->u.dst) && !skb_is_gso (skb) && (ip_hdr (skb)->frag_off &htons (IP_DF ))) && !skb->local_df) { -IP_INC_STATS (IPSTATS_MIB_FRAGFAILS ); +IP_INC_STATS (dev_net (rt->u.dst.dev),IPSTATS_MIB_FRAGFAILS );icmp_send (skb,ICMP_DEST_UNREACH ,ICMP_FRAG_NEEDED ,htonl (dst_mtu (&rt->u.dst))); goto drop;
net/ipv4/ip_output.c +15 -15
@@ -182,9 +182,9 @@ static inline int ip_finish_output2(struct sk_buff *skb)unsigned int hh_len =LL_RESERVED_SPACE (dev);if (rt->rt_type ==RTN_MULTICAST ) -IP_INC_STATS (IPSTATS_MIB_OUTMCASTPKTS ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_OUTMCASTPKTS );else if (rt->rt_type ==RTN_BROADCAST ) -IP_INC_STATS (IPSTATS_MIB_OUTBCASTPKTS ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_OUTBCASTPKTS );/* Be paranoid, rather than too clever. */ if (unlikely (skb_headroom (skb) < hh_len && dev->header_ops)) {
@@ -244,7 +244,7 @@ int ip_mc_output(struct sk_buff *skb)/* * If the indicated interface is up and running, send the packet. */ -IP_INC_STATS (IPSTATS_MIB_OUTREQUESTS ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_OUTREQUESTS ); skb->dev = dev; skb->protocol =htons (ETH_P_IP );
@@ -298,7 +298,7 @@ int ip_output(struct sk_buff *skb) {struct net_device *dev = skb->dst->dev; -IP_INC_STATS (IPSTATS_MIB_OUTREQUESTS ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_OUTREQUESTS ); skb->dev = dev; skb->protocol =htons (ETH_P_IP );
@@ -389,7 +389,7 @@ packet_routed:return ip_local_out (skb); no_route: -IP_INC_STATS (IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS (sock_net (sk),IPSTATS_MIB_OUTNOROUTES );kfree_skb (skb);return -EHOSTUNREACH ; }
@@ -451,7 +451,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) iph =ip_hdr (skb);if (unlikely ((iph->frag_off &htons (IP_DF )) && !skb->local_df)) { -IP_INC_STATS (IPSTATS_MIB_FRAGFAILS ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_FRAGFAILS );icmp_send (skb,ICMP_DEST_UNREACH ,ICMP_FRAG_NEEDED ,htonl (ip_skb_dst_mtu (skb)));kfree_skb (skb);
@@ -542,7 +542,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) err =output (skb);if (!err) -IP_INC_STATS (IPSTATS_MIB_FRAGCREATES ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_FRAGCREATES );if (err || !frag)break ;
@@ -552,7 +552,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) }if (err ==0 ) { -IP_INC_STATS (IPSTATS_MIB_FRAGOKS ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_FRAGOKS );return 0 ; }
@@ -561,7 +561,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))kfree_skb (frag); frag = skb; } -IP_INC_STATS (IPSTATS_MIB_FRAGFAILS ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_FRAGFAILS );return err; }
@@ -673,15 +673,15 @@ slow_path:if (err) goto fail; -IP_INC_STATS (IPSTATS_MIB_FRAGCREATES ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_FRAGCREATES ); }kfree_skb (skb); -IP_INC_STATS (IPSTATS_MIB_FRAGOKS ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_FRAGOKS );return err; fail:kfree_skb (skb); -IP_INC_STATS (IPSTATS_MIB_FRAGFAILS ); +IP_INC_STATS (dev_net (dev),IPSTATS_MIB_FRAGFAILS );return err; }
@@ -1047,7 +1047,7 @@ alloc_new_skb: error: inet->cork.length -= length; -IP_INC_STATS (IPSTATS_MIB_OUTDISCARDS ); +IP_INC_STATS (sock_net (sk),IPSTATS_MIB_OUTDISCARDS );return err; }
@@ -1189,7 +1189,7 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, error: inet->cork.length -= size; -IP_INC_STATS (IPSTATS_MIB_OUTDISCARDS ); +IP_INC_STATS (sock_net (sk),IPSTATS_MIB_OUTDISCARDS );return err; }
@@ -1298,7 +1298,7 @@ out:return err; error: -IP_INC_STATS (IPSTATS_MIB_OUTDISCARDS ); +IP_INC_STATS (net,IPSTATS_MIB_OUTDISCARDS ); goto out; }
net/ipv4/raw.c +1 -1
@@ -385,7 +385,7 @@ error_fault: err = -EFAULT ;kfree_skb (skb); error: -IP_INC_STATS (IPSTATS_MIB_OUTDISCARDS ); +IP_INC_STATS (net,IPSTATS_MIB_OUTDISCARDS );return err; }
Signature · 1 line
1.5.5.1
PATCH 4/20 mib: add net to IP_INC_STATS_BH
In reply to Pavel Emelyanov--- include/net/ip.h | 2 +- net/dccp/ipv4.c | 2 +- net/ipv4/datagram.c | 2 +- net/ipv4/inet_connection_sock.c | 4 ++-- net/ipv4/ip_forward.c | 4 ++-- net/ipv4/ip_fragment.c | 17 ++++++++++------- net/ipv4/ip_input.c | 30 ++++++++++++++++-------------- net/ipv4/ipmr.c | 4 ++-- net/ipv4/route.c | 3 ++- net/ipv4/tcp_ipv4.c | 2 +- net/ipv4/udp.c | 2 +- net/sctp/output.c | 3 ++- 12 files changed, 41 insertions(+), 34 deletions(-)
include/net/ip.h +1 -1
@@ -158,7 +158,7 @@ struct ipv4_configextern struct ipv4_config ipv4_config; DECLARE_SNMP_STAT(struct ipstats_mib, ip_statistics);#define IP_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(ip_statistics, field); } while (0) -#define IP_INC_STATS_BH (field) SNMP_INC_STATS_BH(ip_statistics, field) +#define IP_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(ip_statistics, field); } while (0)#define IP_ADD_STATS_BH (field, val) SNMP_ADD_STATS_BH(ip_statistics, field, val) DECLARE_SNMP_STAT(struct linux_mib, net_statistics);#define NET_INC_STATS (field) SNMP_INC_STATS(net_statistics, field)
net/dccp/ipv4.c +1 -1
@@ -465,7 +465,7 @@ static struct dst_entry* dccp_v4_route_skb(struct net *net, struct sock *sk,security_skb_classify_flow (skb, &fl);if (ip_route_output_flow (net, &rt, &fl, sk,0 )) { -IP_INC_STATS_BH (IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS_BH (net,IPSTATS_MIB_OUTNOROUTES );return NULL ; }
net/ipv4/datagram.c +1 -1
@@ -52,7 +52,7 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) inet->sport, usin->sin_port, sk, 1);if (err) {if (err == -ENETUNREACH ) -IP_INC_STATS_BH (IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS_BH (sock_net (sk),IPSTATS_MIB_OUTNOROUTES );return err; }
net/ipv4/inet_connection_sock.c +2 -2
@@ -342,12 +342,12 @@ struct dst_entry* inet_csk_route_req(struct sock *sk,security_req_classify_flow (req, &fl);if (ip_route_output_flow (net, &rt, &fl, sk,0 )) { -IP_INC_STATS_BH (IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS_BH (net,IPSTATS_MIB_OUTNOROUTES );return NULL ; }if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway) {ip_rt_put (rt); -IP_INC_STATS_BH (IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS_BH (net,IPSTATS_MIB_OUTNOROUTES );return NULL ; }return &rt->u.dst;
net/ipv4/ip_forward.c +2 -2
@@ -42,7 +42,7 @@ static int ip_forward_finish(struct sk_buff *skb) {struct ip_options * opt = &(IPCB (skb)->opt); -IP_INC_STATS_BH (IPSTATS_MIB_OUTFORWDATAGRAMS ); +IP_INC_STATS_BH (dev_net (skb->dst->dev),IPSTATS_MIB_OUTFORWDATAGRAMS );if (unlikely (opt->optlen))ip_forward_options (skb);
@@ -123,7 +123,7 @@ sr_failed: too_many_hops:/* Tell the sender its packet died... */ -IP_INC_STATS_BH (IPSTATS_MIB_INHDRERRORS ); +IP_INC_STATS_BH (dev_net (skb->dst->dev),IPSTATS_MIB_INHDRERRORS );icmp_send (skb,ICMP_TIME_EXCEEDED ,ICMP_EXC_TTL ,0 ); drop:kfree_skb (skb);
net/ipv4/ip_fragment.c +10 -7
@@ -199,8 +199,8 @@ static void ip_expire(unsigned long arg)ipq_kill (qp); -IP_INC_STATS_BH (IPSTATS_MIB_REASMTIMEOUT ); -IP_INC_STATS_BH (IPSTATS_MIB_REASMFAILS ); +IP_INC_STATS_BH (net,IPSTATS_MIB_REASMTIMEOUT ); +IP_INC_STATS_BH (net,IPSTATS_MIB_REASMFAILS );if ((qp->q.last_in &INET_FRAG_FIRST_IN ) && qp->q.fragments !=NULL ) {struct sk_buff *head = qp->q.fragments;
@@ -261,7 +261,10 @@ static inline int ip_frag_too_far(struct ipq *qp) rc = qp->q.fragments && (end - start) > max;if (rc) { -IP_INC_STATS_BH (IPSTATS_MIB_REASMFAILS ); +struct net *net; + + net = container_of(qp->q.net, struct net, ipv4.frags); +IP_INC_STATS_BH (net,IPSTATS_MIB_REASMFAILS ); }return rc;
@@ -545,7 +548,7 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, iph =ip_hdr (head); iph->frag_off =0 ; iph->tot_len =htons (len); -IP_INC_STATS_BH (IPSTATS_MIB_REASMOKS ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_REASMOKS ); qp->q.fragments =NULL ;return 0 ;
@@ -560,7 +563,7 @@ out_oversize:"Oversized IP packet from " NIPQUAD_FMT ".\n" , NIPQUAD(qp->saddr)); out_fail: -IP_INC_STATS_BH (IPSTATS_MIB_REASMFAILS ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_REASMFAILS );return err; }
@@ -571,7 +574,7 @@ int ip_defrag(struct sk_buff *skb, u32 user)struct net *net; net = skb->dev ?dev_net (skb->dev) :dev_net (skb->dst->dev); -IP_INC_STATS_BH (IPSTATS_MIB_REASMREQDS ); +IP_INC_STATS_BH (net,IPSTATS_MIB_REASMREQDS );/* Start by cleaning up the memory. */ if (atomic_read (&net->ipv4.frags.mem) > net->ipv4.frags.high_thresh)
@@ -590,7 +593,7 @@ int ip_defrag(struct sk_buff *skb, u32 user)return ret; } -IP_INC_STATS_BH (IPSTATS_MIB_REASMFAILS ); +IP_INC_STATS_BH (net,IPSTATS_MIB_REASMFAILS );kfree_skb (skb);return -ENOMEM ; }
net/ipv4/ip_input.c +16 -14
@@ -230,16 +230,16 @@ static int ip_local_deliver_finish(struct sk_buff *skb) protocol = -ret; goto resubmit; } -IP_INC_STATS_BH (IPSTATS_MIB_INDELIVERS ); +IP_INC_STATS_BH (net,IPSTATS_MIB_INDELIVERS ); }else {if (!raw) {if (xfrm4_policy_check (NULL ,XFRM_POLICY_IN , skb)) { -IP_INC_STATS_BH (IPSTATS_MIB_INUNKNOWNPROTOS ); +IP_INC_STATS_BH (net,IPSTATS_MIB_INUNKNOWNPROTOS );icmp_send (skb,ICMP_DEST_UNREACH ,ICMP_PROT_UNREACH ,0 ); } }else -IP_INC_STATS_BH (IPSTATS_MIB_INDELIVERS ); +IP_INC_STATS_BH (net,IPSTATS_MIB_INDELIVERS );kfree_skb (skb); } }
@@ -281,7 +281,7 @@ static inline int ip_rcv_options(struct sk_buff *skb)--ANK (980813) */ if (skb_cow (skb,skb_headroom (skb))) { -IP_INC_STATS_BH (IPSTATS_MIB_INDISCARDS ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_INDISCARDS ); goto drop; }
@@ -290,7 +290,7 @@ static inline int ip_rcv_options(struct sk_buff *skb) opt->optlen = iph->ihl*4 -sizeof (struct iphdr );if (ip_options_compile (dev_net (dev), opt, skb)) { -IP_INC_STATS_BH (IPSTATS_MIB_INHDRERRORS ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_INHDRERRORS ); goto drop; }
@@ -334,9 +334,11 @@ static int ip_rcv_finish(struct sk_buff *skb) skb->dev);if (unlikely (err)) {if (err == -EHOSTUNREACH ) -IP_INC_STATS_BH (IPSTATS_MIB_INADDRERRORS ); +IP_INC_STATS_BH (dev_net (skb->dev), +IPSTATS_MIB_INADDRERRORS );else if (err == -ENETUNREACH ) -IP_INC_STATS_BH (IPSTATS_MIB_INNOROUTES ); +IP_INC_STATS_BH (dev_net (skb->dev), +IPSTATS_MIB_INNOROUTES ); goto drop; } }
@@ -357,9 +359,9 @@ static int ip_rcv_finish(struct sk_buff *skb) rt = skb->rtable;if (rt->rt_type ==RTN_MULTICAST ) -IP_INC_STATS_BH (IPSTATS_MIB_INMCASTPKTS ); +IP_INC_STATS_BH (dev_net (rt->u.dst.dev),IPSTATS_MIB_INMCASTPKTS );else if (rt->rt_type ==RTN_BROADCAST ) -IP_INC_STATS_BH (IPSTATS_MIB_INBCASTPKTS ); +IP_INC_STATS_BH (dev_net (rt->u.dst.dev),IPSTATS_MIB_INBCASTPKTS );return dst_input (skb);
@@ -382,10 +384,10 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,if (skb->pkt_type ==PACKET_OTHERHOST ) goto drop; -IP_INC_STATS_BH (IPSTATS_MIB_INRECEIVES ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_INRECEIVES );if ((skb =skb_share_check (skb,GFP_ATOMIC )) ==NULL ) { -IP_INC_STATS_BH (IPSTATS_MIB_INDISCARDS ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_INDISCARDS ); goto out; }
@@ -418,7 +420,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, len =ntohs (iph->tot_len);if (skb->len < len) { -IP_INC_STATS_BH (IPSTATS_MIB_INTRUNCATEDPKTS ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_INTRUNCATEDPKTS ); goto drop; }else if (len < (iph->ihl*4 )) goto inhdr_error;
@@ -428,7 +430,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,* Note this now means skb->len holds ntohs(iph->tot_len). */ if (pskb_trim_rcsum (skb, len)) { -IP_INC_STATS_BH (IPSTATS_MIB_INDISCARDS ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_INDISCARDS ); goto drop; }
@@ -439,7 +441,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, ip_rcv_finish); inhdr_error: -IP_INC_STATS_BH (IPSTATS_MIB_INHDRERRORS ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_INHDRERRORS ); drop:kfree_skb (skb); out:
net/ipv4/ipmr.c +2 -2
@@ -1178,7 +1178,7 @@ static inline int ipmr_forward_finish(struct sk_buff *skb) {struct ip_options * opt = &(IPCB (skb)->opt); -IP_INC_STATS_BH (IPSTATS_MIB_OUTFORWDATAGRAMS ); +IP_INC_STATS_BH (dev_net (skb->dst->dev),IPSTATS_MIB_OUTFORWDATAGRAMS );if (unlikely (opt->optlen))ip_forward_options (skb);
@@ -1241,7 +1241,7 @@ static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi)to blackhole. */ -IP_INC_STATS_BH (IPSTATS_MIB_FRAGFAILS ); +IP_INC_STATS_BH (dev_net (dev),IPSTATS_MIB_FRAGFAILS );ip_rt_put (rt); goto out_free; }
net/ipv4/route.c +2 -1
@@ -1429,7 +1429,8 @@ static int ip_error(struct sk_buff *skb)break ;case ENETUNREACH : code =ICMP_NET_UNREACH ; -IP_INC_STATS_BH (IPSTATS_MIB_INNOROUTES ); +IP_INC_STATS_BH (dev_net (rt->u.dst.dev), +IPSTATS_MIB_INNOROUTES );break ;case EACCES : code =ICMP_PKT_FILTERED ;
net/ipv4/tcp_ipv4.c +1 -1
@@ -175,7 +175,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) inet->sport, usin->sin_port, sk, 1);if (tmp <0 ) {if (tmp == -ENETUNREACH ) -IP_INC_STATS_BH (IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS_BH (sock_net (sk),IPSTATS_MIB_OUTNOROUTES );return tmp; }
net/ipv4/udp.c +1 -1
@@ -662,7 +662,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, err =ip_route_output_flow (net, &rt, &fl, sk,1 );if (err) {if (err == -ENETUNREACH ) -IP_INC_STATS_BH (IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS_BH (net,IPSTATS_MIB_OUTNOROUTES ); goto out; }
net/sctp/output.c +2 -1
@@ -50,6 +50,7 @@#include <linux/init.h> #include <net/inet_ecn.h> #include <net/icmp.h> +#include <net/net_namespace.h> #ifndef TEST_FRAME #include <net/tcp.h>
@@ -595,7 +596,7 @@ out:return err; no_route:kfree_skb (nskb); -IP_INC_STATS_BH (IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS_BH (&init_net,IPSTATS_MIB_OUTNOROUTES );/* FIXME: Returning the 'err' will effect all the associations * associated with a socket, although only one of the paths of the
Signature · 1 line
1.5.5.1
PATCH 5/20 mib: add net to IP_ADD_STATS_BH
In reply to Pavel EmelyanovVery simple - only ip_evictor (fragments) requires such. This patch ends up the IP_XXX_STATS patching.
--- include/net/ip.h | 2 +- net/ipv4/ip_fragment.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/net/ip.h +1 -1
@@ -159,7 +159,7 @@ extern struct ipv4_config ipv4_config; DECLARE_SNMP_STAT(struct ipstats_mib, ip_statistics);#define IP_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(ip_statistics, field); } while (0)#define IP_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(ip_statistics, field); } while (0) -#define IP_ADD_STATS_BH (field, val) SNMP_ADD_STATS_BH(ip_statistics, field, val) +#define IP_ADD_STATS_BH (net, field, val) SNMP_ADD_STATS_BH(ip_statistics, field, val) DECLARE_SNMP_STAT(struct linux_mib, net_statistics);#define NET_INC_STATS (field) SNMP_INC_STATS(net_statistics, field)#define NET_INC_STATS_BH (field) SNMP_INC_STATS_BH(net_statistics, field)
net/ipv4/ip_fragment.c +1 -1
@@ -178,7 +178,7 @@ static void ip_evictor(struct net *net) evicted =inet_frag_evictor (&net->ipv4.frags, &ip4_frags);if (evicted) -IP_ADD_STATS_BH (IPSTATS_MIB_REASMFAILS , evicted); +IP_ADD_STATS_BH (net,IPSTATS_MIB_REASMFAILS , evicted); }/*
Signature · 1 line
1.5.5.1
PATCH 6/20 inet: prepare struct net for TCP MIB accounting
In reply to Pavel EmelyanovThis is the same as the first patch in the set, but preparing the net for TCP_XXX_STATS - save the struct net on the stack where required and possible.
--- net/ipv4/tcp_ipv4.c | 10 +++++++--- net/ipv6/tcp_ipv6.c | 3 ++- 2 files changed, 9 insertions(+), 4 deletions(-)
net/ipv4/tcp_ipv4.c +7 -3
@@ -544,6 +544,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)#ifdef CONFIG_TCP_MD5SIG struct tcp_md5sig_key *key;#endif +struct net *net;/* Never send a reset in response to a reset. */ if (th->rst)
@@ -594,7 +595,8 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) sizeof(struct tcphdr), IPPROTO_TCP, 0); arg.csumoffset = offsetof(struct tcphdr , check) /2 ; -ip_send_reply (dev_net (skb->dst->dev)->ipv4.tcp_sock, skb, + net =dev_net (skb->dst->dev); +ip_send_reply (net->ipv4.tcp_sock, skb, &arg, arg.iov[0 ].iov_len);TCP_INC_STATS_BH (TCP_MIB_OUTSEGS );
@@ -619,6 +621,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack, ]; } rep;struct ip_reply_arg arg; +struct net *net =dev_net (skb->dev);memset (&rep.th,0 ,sizeof (struct tcphdr ));memset (&arg,0 ,sizeof (arg));
@@ -668,7 +671,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,if (oif) arg.bound_dev_if = oif; -ip_send_reply (dev_net (skb->dev)->ipv4.tcp_sock, skb, +ip_send_reply (net->ipv4.tcp_sock, skb, &arg, arg.iov[0 ].iov_len);TCP_INC_STATS_BH (TCP_MIB_OUTSEGS );
@@ -1505,6 +1508,7 @@ int tcp_v4_rcv(struct sk_buff *skb)struct tcphdr *th;struct sock *sk;int ret; +struct net *net =dev_net (skb->dev);if (skb->pkt_type !=PACKET_HOST ) goto discard_it;
@@ -1539,7 +1543,7 @@ int tcp_v4_rcv(struct sk_buff *skb)TCP_SKB_CB (skb)->flags = iph->tos;TCP_SKB_CB (skb)->sacked =0 ; - sk =__inet_lookup (dev_net (skb->dev), &tcp_hashinfo, iph->saddr, + sk =__inet_lookup (net, &tcp_hashinfo, iph->saddr, th->source, iph->daddr, th->dest,inet_iif (skb));if (!sk) goto no_tcp_socket;
net/ipv6/tcp_ipv6.c +2 -1
@@ -1617,6 +1617,7 @@ static int tcp_v6_rcv(struct sk_buff *skb)struct tcphdr *th;struct sock *sk;int ret; +struct net *net =dev_net (skb->dev);if (skb->pkt_type !=PACKET_HOST ) goto discard_it;
@@ -1648,7 +1649,7 @@ static int tcp_v6_rcv(struct sk_buff *skb)TCP_SKB_CB (skb)->flags =ipv6_get_dsfield (ipv6_hdr (skb));TCP_SKB_CB (skb)->sacked =0 ; - sk =__inet6_lookup (dev_net (skb->dev), &tcp_hashinfo, + sk =__inet6_lookup (net, &tcp_hashinfo, &ipv6_hdr (skb)->saddr, th->source, &ipv6_hdr (skb)->daddr,ntohs (th->dest),inet6_iif (skb));
Signature · 1 line
1.5.5.1
PATCH 8/20 tcp: add net to tcp_mib_init
In reply to Pavel EmelyanovThis one sets TCP MIBs after zeroing them, and thus requires the net.
The existing single caller can use init_net (temporarily).
--- include/net/tcp.h | 2 +- net/ipv4/af_inet.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/net/tcp.h +1 -1
@@ -1024,7 +1024,7 @@ static inline int tcp_paws_check(const struct tcp_options_received *rx_opt, int#define TCP_CHECK_TIMER (sk) do { } while (0) -static inline void tcp_mib_init (void ) +static inline void tcp_mib_init (struct net *net) {/* See RFC 2012 */ TCP_ADD_STATS_USER (TCP_MIB_RTOALGORITHM ,1 );
net/ipv4/af_inet.c +1 -1
@@ -1363,7 +1363,7 @@ static int __init init_ipv4_mibs(void) sizeof(struct udp_mib)) < 0) goto err_udplite_mib; -tcp_mib_init (); +tcp_mib_init (&init_net);return 0 ;
Signature · 1 line
1.5.5.1
PATCH 9/20 mib: add net to TCP_INC_STATS
In reply to Pavel EmelyanovFortunately (almost) all the TCP code has a sock to get the net from :)
--- include/net/tcp.h | 2 +- net/ipv4/tcp.c | 4 ++-- net/ipv4/tcp_output.c | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-)
include/net/tcp.h +1 -1
@@ -266,7 +266,7 @@ static inline int tcp_too_many_orphans(struct sock *sk, int num)extern struct proto tcp_prot; DECLARE_SNMP_STAT(struct tcp_mib, tcp_statistics); -#define TCP_INC_STATS (field) SNMP_INC_STATS(tcp_statistics, field) +#define TCP_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(tcp_statistics, field); } while (0)#define TCP_INC_STATS_BH (field) SNMP_INC_STATS_BH(tcp_statistics, field)#define TCP_DEC_STATS (field) SNMP_DEC_STATS(tcp_statistics, field)#define TCP_ADD_STATS_USER (field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val)
net/ipv4/tcp.c +2 -2
@@ -1668,12 +1668,12 @@ void tcp_set_state(struct sock *sk, int state)switch (state) {case TCP_ESTABLISHED :if (oldstate !=TCP_ESTABLISHED ) -TCP_INC_STATS (TCP_MIB_CURRESTAB ); +TCP_INC_STATS (sock_net (sk),TCP_MIB_CURRESTAB );break ;case TCP_CLOSE :if (oldstate ==TCP_CLOSE_WAIT || oldstate ==TCP_ESTABLISHED ) -TCP_INC_STATS (TCP_MIB_ESTABRESETS ); +TCP_INC_STATS (sock_net (sk),TCP_MIB_ESTABRESETS ); sk->sk_prot->unhash (sk); if (inet_csk(sk)->icsk_bind_hash &&
net/ipv4/tcp_output.c +5 -5
@@ -618,7 +618,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,tcp_event_data_sent (tp, skb, sk);if (after (tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq) -TCP_INC_STATS (TCP_MIB_OUTSEGS ); +TCP_INC_STATS (sock_net (sk),TCP_MIB_OUTSEGS ); err = icsk->icsk_af_ops->queue_xmit (skb,0 );if (likely (err <=0 ))
@@ -1910,7 +1910,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)if (err ==0 ) {/* Update global TCP statistics. */ -TCP_INC_STATS (TCP_MIB_RETRANSSEGS ); +TCP_INC_STATS (sock_net (sk),TCP_MIB_RETRANSSEGS ); tp->total_retrans++;
@@ -2132,7 +2132,7 @@ void tcp_send_active_reset(struct sock *sk, gfp_t priority)if (tcp_transmit_skb (sk, skb,0 , priority))NET_INC_STATS (LINUX_MIB_TCPABORTFAILED ); -TCP_INC_STATS (TCP_MIB_OUTRSTS ); +TCP_INC_STATS (sock_net (sk),TCP_MIB_OUTRSTS ); }/* WARNING: This routine must only be called when we have already sent
@@ -2258,7 +2258,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst, ); th->doff = (tcp_header_size >>2 ); -TCP_INC_STATS (TCP_MIB_OUTSEGS ); +TCP_INC_STATS (sock_net (sk),TCP_MIB_OUTSEGS );#ifdef CONFIG_TCP_MD5SIG /* Okay, we have all we need - do the md5 hash if needed */
@@ -2367,7 +2367,7 @@ int tcp_connect(struct sock *sk)*/ tp->snd_nxt = tp->write_seq; tp->pushed_seq = tp->write_seq; -TCP_INC_STATS (TCP_MIB_ACTIVEOPENS ); +TCP_INC_STATS (sock_net (sk),TCP_MIB_ACTIVEOPENS );/* Timer for repeating the SYN until an answer. */ inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
Signature · 1 line
1.5.5.1
PATCH 10/20 mib: add net to TCP_INC_STATS_BH
In reply to Pavel EmelyanovSame as before - the sock is always there to get the net from, but there are also some places with the net already saved on the stack.
--- include/net/tcp.h | 2 +- net/ipv4/tcp.c | 2 +- net/ipv4/tcp_input.c | 6 +++--- net/ipv4/tcp_ipv4.c | 14 +++++++------- net/ipv4/tcp_minisocks.c | 4 ++-- net/ipv6/tcp_ipv6.c | 14 +++++++------- 6 files changed, 21 insertions(+), 21 deletions(-)
include/net/tcp.h +1 -1
@@ -267,7 +267,7 @@ extern struct proto tcp_prot; DECLARE_SNMP_STAT(struct tcp_mib, tcp_statistics);#define TCP_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(tcp_statistics, field); } while (0) -#define TCP_INC_STATS_BH (field) SNMP_INC_STATS_BH(tcp_statistics, field) +#define TCP_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(tcp_statistics, field); } while (0)#define TCP_DEC_STATS (field) SNMP_DEC_STATS(tcp_statistics, field)#define TCP_ADD_STATS_USER (field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val)
net/ipv4/tcp.c +1 -1
@@ -2663,7 +2663,7 @@ EXPORT_SYMBOL(__tcp_put_md5sig_pool);void tcp_done (struct sock *sk) {if (sk->sk_state ==TCP_SYN_SENT || sk->sk_state ==TCP_SYN_RECV ) -TCP_INC_STATS_BH (TCP_MIB_ATTEMPTFAILS ); +TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_ATTEMPTFAILS );tcp_set_state (sk,TCP_CLOSE );tcp_clear_xmit_timers (sk);
net/ipv4/tcp_input.c +3 -3
@@ -4795,7 +4795,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,tcp_data_snd_check (sk);return 0 ; }else {/* Header too small */ -TCP_INC_STATS_BH (TCP_MIB_INERRS ); +TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_INERRS ); goto discard; } }else {
@@ -4934,7 +4934,7 @@ slow_path:tcp_replace_ts_recent (tp,TCP_SKB_CB (skb)->seq);if (th->syn && !before (TCP_SKB_CB (skb)->seq, tp->rcv_nxt)) { -TCP_INC_STATS_BH (TCP_MIB_INERRS ); +TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_INERRS );NET_INC_STATS_BH (LINUX_MIB_TCPABORTONSYN );tcp_reset (sk);return 1 ;
@@ -4957,7 +4957,7 @@ step5:return 0 ; csum_error: -TCP_INC_STATS_BH (TCP_MIB_INERRS ); +TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_INERRS ); discard:__kfree_skb (skb);
net/ipv4/tcp_ipv4.c +7 -7
@@ -599,8 +599,8 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)ip_send_reply (net->ipv4.tcp_sock, skb, &arg, arg.iov[0 ].iov_len); -TCP_INC_STATS_BH (TCP_MIB_OUTSEGS ); -TCP_INC_STATS_BH (TCP_MIB_OUTRSTS ); +TCP_INC_STATS_BH (net,TCP_MIB_OUTSEGS ); +TCP_INC_STATS_BH (net,TCP_MIB_OUTRSTS ); }/* The code following below sending ACKs in SYN-RECV and TIME-WAIT states
@@ -674,7 +674,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,ip_send_reply (net->ipv4.tcp_sock, skb, &arg, arg.iov[0 ].iov_len); -TCP_INC_STATS_BH (TCP_MIB_OUTSEGS ); +TCP_INC_STATS_BH (net,TCP_MIB_OUTSEGS ); }static void tcp_v4_timewait_ack (struct sock *sk,struct sk_buff *skb)
@@ -1494,7 +1494,7 @@ discard:return 0 ; csum_err: -TCP_INC_STATS_BH (TCP_MIB_INERRS ); +TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_INERRS ); goto discard; }
@@ -1514,7 +1514,7 @@ int tcp_v4_rcv(struct sk_buff *skb) goto discard_it;/* Count it even if it's bad */ -TCP_INC_STATS_BH (TCP_MIB_INSEGS ); +TCP_INC_STATS_BH (net,TCP_MIB_INSEGS );if (!pskb_may_pull (skb,sizeof (struct tcphdr ))) goto discard_it;
@@ -1590,7 +1590,7 @@ no_tcp_socket:if (skb->len < (th->doff <<2 ) ||tcp_checksum_complete (skb)) { bad_packet: -TCP_INC_STATS_BH (TCP_MIB_INERRS ); +TCP_INC_STATS_BH (net,TCP_MIB_INERRS ); }else {tcp_v4_send_reset (NULL , skb); }
@@ -1611,7 +1611,7 @@ do_time_wait: }if (skb->len < (th->doff <<2 ) ||tcp_checksum_complete (skb)) { -TCP_INC_STATS_BH (TCP_MIB_INERRS ); +TCP_INC_STATS_BH (net,TCP_MIB_INERRS );inet_twsk_put (inet_twsk (sk)); goto discard_it; }
net/ipv4/tcp_minisocks.c +2 -2
@@ -480,7 +480,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, newtp->rx_opt.mss_clamp = req->mss;TCP_ECN_openreq_child (newtp, req); -TCP_INC_STATS_BH (TCP_MIB_PASSIVEOPENS ); +TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_PASSIVEOPENS ); }return newsk; }
@@ -630,7 +630,7 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,* "fourth, check the SYN bit" */ if (flg & (TCP_FLAG_RST |TCP_FLAG_SYN )) { -TCP_INC_STATS_BH (TCP_MIB_ATTEMPTFAILS ); +TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_ATTEMPTFAILS ); goto embryonic_reset; }
net/ipv6/tcp_ipv6.c +7 -7
@@ -1004,8 +1004,8 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)if (xfrm_lookup (&buff->dst, &fl,NULL ,0 ) >=0 ) {ip6_xmit (ctl_sk, buff, &fl,NULL ,0 ); -TCP_INC_STATS_BH (TCP_MIB_OUTSEGS ); -TCP_INC_STATS_BH (TCP_MIB_OUTRSTS ); +TCP_INC_STATS_BH (net,TCP_MIB_OUTSEGS ); +TCP_INC_STATS_BH (net,TCP_MIB_OUTRSTS );return ; } }
@@ -1089,7 +1089,7 @@ static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32if (!ip6_dst_lookup (ctl_sk, &buff->dst, &fl)) {if (xfrm_lookup (&buff->dst, &fl,NULL ,0 ) >=0 ) {ip6_xmit (ctl_sk, buff, &fl,NULL ,0 ); -TCP_INC_STATS_BH (TCP_MIB_OUTSEGS ); +TCP_INC_STATS_BH (net,TCP_MIB_OUTSEGS );return ; } }
@@ -1579,7 +1579,7 @@ discard:kfree_skb (skb);return 0 ; csum_err: -TCP_INC_STATS_BH (TCP_MIB_INERRS ); +TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_INERRS ); goto discard;
@@ -1625,7 +1625,7 @@ static int tcp_v6_rcv(struct sk_buff *skb)/* * Count it even if it's bad. */ -TCP_INC_STATS_BH (TCP_MIB_INSEGS ); +TCP_INC_STATS_BH (net,TCP_MIB_INSEGS );if (!pskb_may_pull (skb,sizeof (struct tcphdr ))) goto discard_it;
@@ -1697,7 +1697,7 @@ no_tcp_socket:if (skb->len < (th->doff<<2 ) ||tcp_checksum_complete (skb)) { bad_packet: -TCP_INC_STATS_BH (TCP_MIB_INERRS ); +TCP_INC_STATS_BH (net,TCP_MIB_INERRS ); }else {tcp_v6_send_reset (NULL , skb); }
@@ -1722,7 +1722,7 @@ do_time_wait: }if (skb->len < (th->doff<<2 ) ||tcp_checksum_complete (skb)) { -TCP_INC_STATS_BH (TCP_MIB_INERRS ); +TCP_INC_STATS_BH (net,TCP_MIB_INERRS );inet_twsk_put (inet_twsk (sk)); goto discard_it; }
Signature · 1 line
1.5.5.1
PATCH 11/20 mib: add net to TCP_DEC_STATS
In reply to Pavel Emelyanov--- include/net/tcp.h | 2 +- net/ipv4/tcp.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/net/tcp.h +1 -1
@@ -268,7 +268,7 @@ extern struct proto tcp_prot; DECLARE_SNMP_STAT(struct tcp_mib, tcp_statistics);#define TCP_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(tcp_statistics, field); } while (0)#define TCP_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(tcp_statistics, field); } while (0) -#define TCP_DEC_STATS (field) SNMP_DEC_STATS(tcp_statistics, field) +#define TCP_DEC_STATS (net, field) do { (void)net; SNMP_DEC_STATS(tcp_statistics, field); } while (0)#define TCP_ADD_STATS_USER (field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val)extern void tcp_v4_err (struct sk_buff *skb,u32 );
net/ipv4/tcp.c +1 -1
@@ -1682,7 +1682,7 @@ void tcp_set_state(struct sock *sk, int state)/* fall through */ default :if (oldstate==TCP_ESTABLISHED ) -TCP_DEC_STATS (TCP_MIB_CURRESTAB ); +TCP_DEC_STATS (sock_net (sk),TCP_MIB_CURRESTAB ); }/* Change state AFTER socket is unhashed to avoid closed
Signature · 1 line
1.5.5.1
PATCH 12/20 mib: add net to TCP_ADD_STATS_USER
In reply to Pavel EmelyanovNow we're done with the TCP_XXX_STATS macros.
--- include/net/tcp.h | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)
include/net/tcp.h +5 -5
@@ -269,7 +269,7 @@ DECLARE_SNMP_STAT(struct tcp_mib, tcp_statistics);#define TCP_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(tcp_statistics, field); } while (0)#define TCP_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(tcp_statistics, field); } while (0)#define TCP_DEC_STATS (net, field) do { (void)net; SNMP_DEC_STATS(tcp_statistics, field); } while (0) -#define TCP_ADD_STATS_USER (field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val) +#define TCP_ADD_STATS_USER (net, field, val) do { (void)net; SNMP_ADD_STATS_USER(tcp_statistics, field, val); } while (0)extern void tcp_v4_err (struct sk_buff *skb,u32 );
@@ -1027,10 +1027,10 @@ static inline int tcp_paws_check(const struct tcp_options_received *rx_opt, intstatic inline void tcp_mib_init (struct net *net) {/* See RFC 2012 */ -TCP_ADD_STATS_USER (TCP_MIB_RTOALGORITHM ,1 ); -TCP_ADD_STATS_USER (TCP_MIB_RTOMIN ,TCP_RTO_MIN *1000 /HZ ); -TCP_ADD_STATS_USER (TCP_MIB_RTOMAX ,TCP_RTO_MAX *1000 /HZ ); -TCP_ADD_STATS_USER (TCP_MIB_MAXCONN ,-1 ); +TCP_ADD_STATS_USER (net,TCP_MIB_RTOALGORITHM ,1 ); +TCP_ADD_STATS_USER (net,TCP_MIB_RTOMIN ,TCP_RTO_MIN *1000 /HZ ); +TCP_ADD_STATS_USER (net,TCP_MIB_RTOMAX ,TCP_RTO_MAX *1000 /HZ ); +TCP_ADD_STATS_USER (net,TCP_MIB_MAXCONN ,-1 ); }/* from STCP */
Signature · 1 line
1.5.5.1
PATCH 13/20 sock: add net to prot->enter_memory_pressure callback
In reply to Pavel EmelyanovThe tcp_enter_memory_pressure calls NET_INC_STATS, but doesn't have where to get the net from.
I decided to add a sk argument, not the net itself, only to factor all the required sock_net(sk) calls inside the enter_memory_pressure callback itself.
--- include/net/sock.h | 4 ++-- include/net/tcp.h | 2 +- net/core/sock.c | 2 +- net/decnet/af_decnet.c | 2 +- net/ipv4/tcp.c | 4 ++-- net/sctp/socket.c | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-)
include/net/sock.h +2 -2
@@ -565,7 +565,7 @@ struct proto {#endif /* Memory pressure */ -void (*enter_memory_pressure)(void ); +void (*enter_memory_pressure)(struct sock *sk);atomic_t *memory_allocated;/* Current allocated memory. */ atomic_t *sockets_allocated;/* Current number of sockets. */ /*
@@ -1210,7 +1210,7 @@ static inline struct page *sk_stream_alloc_page(struct sock *sk) page =alloc_pages (sk->sk_allocation,0 );if (!page) { - sk->sk_prot->enter_memory_pressure (); + sk->sk_prot->enter_memory_pressure (sk);sk_stream_moderate_sndbuf (sk); }return page;
include/net/tcp.h +1 -1
@@ -975,7 +975,7 @@ static inline void tcp_openreq_init(struct request_sock *req, ireq->rmt_port =tcp_hdr (skb)->source; } -extern void tcp_enter_memory_pressure (void ); +extern void tcp_enter_memory_pressure (struct sock *sk);static inline int keepalive_intvl_when (const struct tcp_sock *tp) {
net/core/sock.c +1 -1
@@ -1442,7 +1442,7 @@ int __sk_mem_schedule(struct sock *sk, int size, int kind)/* Under pressure. */ if (allocated > prot->sysctl_mem[1 ])if (prot->enter_memory_pressure) - prot->enter_memory_pressure (); + prot->enter_memory_pressure (sk);/* Over hard limit. */ if (allocated > prot->sysctl_mem[2 ])
net/decnet/af_decnet.c +1 -1
@@ -451,7 +451,7 @@ static void dn_destruct(struct sock *sk)static int dn_memory_pressure; -static void dn_enter_memory_pressure (void ) +static void dn_enter_memory_pressure (struct sock *sk) {if (!dn_memory_pressure) { dn_memory_pressure =1 ;
net/ipv4/tcp.c +2 -2
@@ -316,7 +316,7 @@ int tcp_memory_pressure __read_mostly;EXPORT_SYMBOL (tcp_memory_pressure); -void tcp_enter_memory_pressure (void ) +void tcp_enter_memory_pressure (struct sock *sk) {if (!tcp_memory_pressure) {NET_INC_STATS (LINUX_MIB_TCPMEMORYPRESSURES );
@@ -649,7 +649,7 @@ struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp) }__kfree_skb (skb); }else { - sk->sk_prot->enter_memory_pressure (); + sk->sk_prot->enter_memory_pressure (sk);sk_stream_moderate_sndbuf (sk); }return NULL ;
net/sctp/socket.c +1 -1
@@ -116,7 +116,7 @@ static int sctp_memory_pressure;static atomic_t sctp_memory_allocated;static atomic_t sctp_sockets_allocated; -static void sctp_enter_memory_pressure (void ) +static void sctp_enter_memory_pressure (struct sock *sk) { sctp_memory_pressure =1 ; }
Signature · 1 line
1.5.5.1
PATCH 14/20 inet: prepare net on the stack for NET accounting macros
In reply to Pavel Emelyanov--- net/dccp/ipv6.c | 3 ++- net/ipv4/arp.c | 3 ++- net/ipv6/tcp_ipv6.c | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-)
net/dccp/ipv6.c +2 -1
@@ -93,8 +93,9 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,struct sock *sk;int err;__u64 seq; +struct net *net =dev_net (skb->dev); - sk =inet6_lookup (dev_net (skb->dev), &dccp_hashinfo, + sk =inet6_lookup (net, &dccp_hashinfo, &hdr->daddr, dh->dccph_dport, &hdr->saddr, dh->dccph_sport,inet6_iif (skb));
net/ipv4/arp.c +2 -1
@@ -421,8 +421,9 @@ static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)struct rtable *rt;int flag =0 ;/*unsigned long now; */ +struct net *net =dev_net (dev); -if (ip_route_output_key (dev_net (dev), &rt, &fl) <0 ) +if (ip_route_output_key (net, &rt, &fl) <0 )return 1 ;if (rt->u.dst.dev != dev) {NET_INC_STATS_BH (LINUX_MIB_ARPFILTER );
net/ipv6/tcp_ipv6.c +2 -1
@@ -323,8 +323,9 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,int err;struct tcp_sock *tp;__u32 seq; +struct net *net =dev_net (skb->dev); - sk =inet6_lookup (dev_net (skb->dev), &tcp_hashinfo, &hdr->daddr, + sk =inet6_lookup (net, &tcp_hashinfo, &hdr->daddr, th->dest, &hdr->saddr, th->source, skb->dev->ifindex);if (sk ==NULL ) {
Signature · 1 line
1.5.5.1
PATCH 15/20 tcp: replace tcp_sock argument with sock in some places
In reply to Pavel EmelyanovThese places have a tcp_sock, but we'd prefer the sock itself to get net from it. Fortunately, tcp_sk macro is just a type cast, so this replace is really cheap.
--- net/ipv4/tcp_input.c | 31 ++++++++++++++++++------------- 1 files changed, 18 insertions(+), 13 deletions(-)
net/ipv4/tcp_input.c +18 -13
@@ -1169,10 +1169,11 @@ static void tcp_mark_lost_retrans(struct sock *sk) tp->lost_retrans_low = new_low_seq; } -static int tcp_check_dsack (struct tcp_sock *tp,struct sk_buff *ack_skb, +static int tcp_check_dsack (struct sock *sk,struct sk_buff *ack_skb,struct tcp_sack_block_wire *sp,int num_sacks,u32 prior_snd_una) { +struct tcp_sock *tp =tcp_sk (sk);u32 start_seq_0 =get_unaligned_be32 (&sp[0 ].start_seq);u32 end_seq_0 =get_unaligned_be32 (&sp[0 ].end_seq);int dup_sack =0 ;
@@ -1434,7 +1435,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb,tcp_highest_sack_reset (sk); } - found_dup_sack =tcp_check_dsack (tp, ack_skb, sp_wire, + found_dup_sack =tcp_check_dsack (sk, ack_skb, sp_wire, num_sacks, prior_snd_una);if (found_dup_sack) flag |=FLAG_DSACKING_ACK ;
@@ -3711,8 +3712,10 @@ static inline int tcp_sack_extend(struct tcp_sack_block *sp, u32 seq,return 0 ; } -static void tcp_dsack_set (struct tcp_sock *tp,u32 seq,u32 end_seq) +static void tcp_dsack_set (struct sock *sk,u32 seq,u32 end_seq) { +struct tcp_sock *tp =tcp_sk (sk); +if (tcp_is_sack (tp) && sysctl_tcp_dsack) {int mib_idx;
@@ -3731,10 +3734,12 @@ static void tcp_dsack_set(struct tcp_sock *tp, u32 seq, u32 end_seq) } } -static void tcp_dsack_extend (struct tcp_sock *tp,u32 seq,u32 end_seq) +static void tcp_dsack_extend (struct sock *sk,u32 seq,u32 end_seq) { +struct tcp_sock *tp =tcp_sk (sk); +if (!tp->rx_opt.dsack) -tcp_dsack_set (tp, seq, end_seq); +tcp_dsack_set (sk, seq, end_seq);else tcp_sack_extend (tp->duplicate_sack, seq, end_seq); }
@@ -3753,7 +3758,7 @@ static void tcp_send_dupack(struct sock *sk, struct sk_buff *skb)if (after (TCP_SKB_CB (skb)->end_seq, tp->rcv_nxt)) end_seq = tp->rcv_nxt; -tcp_dsack_set (tp,TCP_SKB_CB (skb)->seq, end_seq); +tcp_dsack_set (sk,TCP_SKB_CB (skb)->seq, end_seq); } }
@@ -3906,7 +3911,7 @@ static void tcp_ofo_queue(struct sock *sk)__u32 dsack = dsack_high;if (before (TCP_SKB_CB (skb)->end_seq, dsack_high)) dsack_high =TCP_SKB_CB (skb)->end_seq; -tcp_dsack_extend (tp,TCP_SKB_CB (skb)->seq, dsack); +tcp_dsack_extend (sk,TCP_SKB_CB (skb)->seq, dsack); }if (!after (TCP_SKB_CB (skb)->end_seq, tp->rcv_nxt)) {
@@ -4035,7 +4040,7 @@ queue_and_out:if (!after (TCP_SKB_CB (skb)->end_seq, tp->rcv_nxt)) {/* A retransmit, 2nd most common case. Force an immediate ack. */ NET_INC_STATS_BH (LINUX_MIB_DELAYEDACKLOST ); -tcp_dsack_set (tp,TCP_SKB_CB (skb)->seq,TCP_SKB_CB (skb)->end_seq); +tcp_dsack_set (sk,TCP_SKB_CB (skb)->seq,TCP_SKB_CB (skb)->end_seq); out_of_window:tcp_enter_quickack_mode (sk);
@@ -4057,7 +4062,7 @@ drop: tp->rcv_nxt,TCP_SKB_CB (skb)->seq, TCP_SKB_CB(skb)->end_seq); -tcp_dsack_set (tp,TCP_SKB_CB (skb)->seq, tp->rcv_nxt); +tcp_dsack_set (sk,TCP_SKB_CB (skb)->seq, tp->rcv_nxt);/* If window is closed, drop tail of packet. But after * remembering D-SACK for its head made in previous line.
@@ -4122,12 +4127,12 @@ drop:if (!after (end_seq,TCP_SKB_CB (skb1)->end_seq)) {/* All the bits are present. Drop. */ __kfree_skb (skb); -tcp_dsack_set (tp, seq, end_seq); +tcp_dsack_set (sk, seq, end_seq); goto add_sack; }if (after (seq,TCP_SKB_CB (skb1)->seq)) {/* Partial overlap. */ -tcp_dsack_set (tp, seq, +tcp_dsack_set (sk, seq,TCP_SKB_CB (skb1)->end_seq); }else { skb1 = skb1->prev;
@@ -4140,12 +4145,12 @@ drop: (struct sk_buff *)&tp->out_of_order_queue && after(end_seq, TCP_SKB_CB(skb1)->seq)) {if (before (end_seq,TCP_SKB_CB (skb1)->end_seq)) { -tcp_dsack_extend (tp,TCP_SKB_CB (skb1)->seq, +tcp_dsack_extend (sk,TCP_SKB_CB (skb1)->seq, end_seq);break ; }__skb_unlink (skb1, &tp->out_of_order_queue); -tcp_dsack_extend (tp,TCP_SKB_CB (skb1)->seq, +tcp_dsack_extend (sk,TCP_SKB_CB (skb1)->seq,TCP_SKB_CB (skb1)->end_seq);__kfree_skb (skb1); }
Signature · 1 line
1.5.5.1
PATCH 16/20 mib: add net to NET_INC_STATS
In reply to Pavel Emelyanov--- include/net/ip.h | 2 +- net/ipv4/tcp.c | 2 +- net/ipv4/tcp_output.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-)
include/net/ip.h +1 -1
@@ -161,7 +161,7 @@ DECLARE_SNMP_STAT(struct ipstats_mib, ip_statistics);#define IP_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(ip_statistics, field); } while (0)#define IP_ADD_STATS_BH (net, field, val) SNMP_ADD_STATS_BH(ip_statistics, field, val) DECLARE_SNMP_STAT(struct linux_mib, net_statistics); -#define NET_INC_STATS (field) SNMP_INC_STATS(net_statistics, field) +#define NET_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(net_statistics, field); } while (0)#define NET_INC_STATS_BH (field) SNMP_INC_STATS_BH(net_statistics, field)#define NET_INC_STATS_USER (field) SNMP_INC_STATS_USER(net_statistics, field)#define NET_ADD_STATS_BH (field, adnd) SNMP_ADD_STATS_BH(net_statistics, field, adnd)
net/ipv4/tcp.c +1 -1
@@ -319,7 +319,7 @@ EXPORT_SYMBOL(tcp_memory_pressure);void tcp_enter_memory_pressure (struct sock *sk) {if (!tcp_memory_pressure) { -NET_INC_STATS (LINUX_MIB_TCPMEMORYPRESSURES ); +NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPMEMORYPRESSURES ); tcp_memory_pressure =1 ; } }
net/ipv4/tcp_output.c +2 -2
@@ -2119,7 +2119,7 @@ void tcp_send_active_reset(struct sock *sk, gfp_t priority)/* NOTE: No TCP options attached and we never retransmit this. */ skb =alloc_skb (MAX_TCP_HEADER , priority);if (!skb) { -NET_INC_STATS (LINUX_MIB_TCPABORTFAILED ); +NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPABORTFAILED );return ; }
@@ -2130,7 +2130,7 @@ void tcp_send_active_reset(struct sock *sk, gfp_t priority)/* Send it off. */ TCP_SKB_CB (skb)->when = tcp_time_stamp;if (tcp_transmit_skb (sk, skb,0 , priority)) -NET_INC_STATS (LINUX_MIB_TCPABORTFAILED ); +NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPABORTFAILED );TCP_INC_STATS (sock_net (sk),TCP_MIB_OUTRSTS ); }
Signature · 1 line
1.5.5.1
PATCH 17/20 mib: add net to NET_INC_STATS_BH
In reply to Pavel Emelyanov--- include/net/ip.h | 2 +- include/net/tcp.h | 2 +- net/dccp/ipv4.c | 10 +++--- net/dccp/ipv6.c | 8 ++-- net/dccp/timer.c | 4 +- net/ipv4/arp.c | 2 +- net/ipv4/inet_hashtables.c | 4 +- net/ipv4/syncookies.c | 6 ++-- net/ipv4/tcp.c | 6 ++- net/ipv4/tcp_input.c | 65 ++++++++++++++++++++++--------------------- net/ipv4/tcp_ipv4.c | 12 ++++---- net/ipv4/tcp_minisocks.c | 6 ++-- net/ipv4/tcp_output.c | 4 +- net/ipv4/tcp_timer.c | 12 ++++---- net/ipv6/inet6_hashtables.c | 4 +- net/ipv6/syncookies.c | 6 ++-- net/ipv6/tcp_ipv6.c | 10 +++--- net/sctp/input.c | 2 +- 18 files changed, 84 insertions(+), 81 deletions(-)
include/net/ip.h +1 -1
@@ -162,7 +162,7 @@ DECLARE_SNMP_STAT(struct ipstats_mib, ip_statistics);#define IP_ADD_STATS_BH (net, field, val) SNMP_ADD_STATS_BH(ip_statistics, field, val) DECLARE_SNMP_STAT(struct linux_mib, net_statistics);#define NET_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(net_statistics, field); } while (0) -#define NET_INC_STATS_BH (field) SNMP_INC_STATS_BH(net_statistics, field) +#define NET_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(net_statistics, field); } while (0)#define NET_INC_STATS_USER (field) SNMP_INC_STATS_USER(net_statistics, field)#define NET_ADD_STATS_BH (field, adnd) SNMP_ADD_STATS_BH(net_statistics, field, adnd)#define NET_ADD_STATS_USER (field, adnd) SNMP_ADD_STATS_USER(net_statistics, field, adnd)
include/net/tcp.h +1 -1
@@ -894,7 +894,7 @@ static inline int tcp_prequeue(struct sock *sk, struct sk_buff *skb)while ((skb1 =__skb_dequeue (&tp->ucopy.prequeue)) !=NULL ) { sk->sk_backlog_rcv (sk, skb1); -NET_INC_STATS_BH (LINUX_MIB_TCPPREQUEUEDROPPED ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_TCPPREQUEUEDROPPED ); } tp->ucopy.memory =0 ;
net/dccp/ipv4.c +5 -5
@@ -230,7 +230,7 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)* servers this needs to be solved differently. */ if (sock_owned_by_user (sk)) -NET_INC_STATS_BH (LINUX_MIB_LOCKDROPPEDICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_LOCKDROPPEDICMPS );if (sk->sk_state ==DCCP_CLOSED ) goto out;
@@ -239,7 +239,7 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info) seq =dccp_hdr_seq (dh);if ((1 << sk->sk_state) & ~(DCCPF_REQUESTING |DCCPF_LISTEN ) && !between48 (seq, dp->dccps_swl, dp->dccps_swh)) { -NET_INC_STATS_BH (LINUX_MIB_OUTOFWINDOWICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_OUTOFWINDOWICMPS ); goto out; }
@@ -286,7 +286,7 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)BUG_TRAP (!req->sk);if (seq !=dccp_rsk (req)->dreq_iss) { -NET_INC_STATS_BH (LINUX_MIB_OUTOFWINDOWICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_OUTOFWINDOWICMPS ); goto out; }/*
@@ -409,9 +409,9 @@ struct sock *dccp_v4_request_recv_sock(struct sock *sk, struct sk_buff *skb,return newsk; exit_overflow: -NET_INC_STATS_BH (LINUX_MIB_LISTENOVERFLOWS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_LISTENOVERFLOWS ); exit: -NET_INC_STATS_BH (LINUX_MIB_LISTENDROPS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_LISTENDROPS );dst_release (dst);return NULL ; }
net/dccp/ipv6.c +4 -4
@@ -111,7 +111,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,bh_lock_sock (sk);if (sock_owned_by_user (sk)) -NET_INC_STATS_BH (LINUX_MIB_LOCKDROPPEDICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_LOCKDROPPEDICMPS );if (sk->sk_state ==DCCP_CLOSED ) goto out;
@@ -189,7 +189,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,BUG_TRAP (req->sk ==NULL );if (seq !=dccp_rsk (req)->dreq_iss) { -NET_INC_STATS_BH (LINUX_MIB_OUTOFWINDOWICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_OUTOFWINDOWICMPS ); goto out; }
@@ -630,9 +630,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,return newsk; out_overflow: -NET_INC_STATS_BH (LINUX_MIB_LISTENOVERFLOWS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_LISTENOVERFLOWS ); out: -NET_INC_STATS_BH (LINUX_MIB_LISTENDROPS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_LISTENDROPS );if (opt !=NULL && opt != np->opt)sock_kfree_s (sk, opt, opt->tot_len);dst_release (dst);
net/dccp/timer.c +2 -2
@@ -224,7 +224,7 @@ static void dccp_delack_timer(unsigned long data)if (sock_owned_by_user (sk)) {/* Try again later. */ icsk->icsk_ack.blocked =1 ; -NET_INC_STATS_BH (LINUX_MIB_DELAYEDACKLOCKED ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_DELAYEDACKLOCKED );sk_reset_timer (sk, &icsk->icsk_delack_timer, jiffies +TCP_DELACK_MIN ); goto out;
@@ -254,7 +254,7 @@ static void dccp_delack_timer(unsigned long data) icsk->icsk_ack.ato =TCP_ATO_MIN ; }dccp_send_ack (sk); -NET_INC_STATS_BH (LINUX_MIB_DELAYEDACKS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_DELAYEDACKS ); } out:bh_unlock_sock (sk);
net/ipv4/arp.c +1 -1
@@ -426,7 +426,7 @@ static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)if (ip_route_output_key (net, &rt, &fl) <0 )return 1 ;if (rt->u.dst.dev != dev) { -NET_INC_STATS_BH (LINUX_MIB_ARPFILTER ); +NET_INC_STATS_BH (net,LINUX_MIB_ARPFILTER ); flag =1 ; }ip_rt_put (rt);
net/ipv4/inet_hashtables.c +2 -2
@@ -312,11 +312,11 @@ unique:if (twp) { *twp = tw; -NET_INC_STATS_BH (LINUX_MIB_TIMEWAITRECYCLED ); +NET_INC_STATS_BH (net,LINUX_MIB_TIMEWAITRECYCLED ); }else if (tw) {/* Silly. Should hash-dance instead... */ inet_twsk_deschedule (tw, death_row); -NET_INC_STATS_BH (LINUX_MIB_TIMEWAITRECYCLED ); +NET_INC_STATS_BH (net,LINUX_MIB_TIMEWAITRECYCLED );inet_twsk_put (tw); }
net/ipv4/syncookies.c +3 -3
@@ -173,7 +173,7 @@ __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb, __u16 *mssp) ; *mssp = msstab[mssind] +1 ; -NET_INC_STATS_BH (LINUX_MIB_SYNCOOKIESSENT ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_SYNCOOKIESSENT ); return secure_tcp_syn_cookie(iph->saddr, iph->daddr, th->source, th->dest, ntohl(th->seq),
@@ -269,11 +269,11 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,if (time_after (jiffies, tp->last_synq_overflow +TCP_TIMEOUT_INIT ) || (mss =cookie_check (skb, cookie)) ==0 ) { -NET_INC_STATS_BH (LINUX_MIB_SYNCOOKIESFAILED ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_SYNCOOKIESFAILED ); goto out; } -NET_INC_STATS_BH (LINUX_MIB_SYNCOOKIESRECV ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_SYNCOOKIESRECV );/* check for timestamp cookie support */ memset (&tcp_opt,0 ,sizeof (tcp_opt));
net/ipv4/tcp.c +4 -2
@@ -1871,7 +1871,8 @@ adjudge_to_death:if (tp->linger2 <0 ) {tcp_set_state (sk,TCP_CLOSE );tcp_send_active_reset (sk,GFP_ATOMIC ); -NET_INC_STATS_BH (LINUX_MIB_TCPABORTONLINGER ); +NET_INC_STATS_BH (sock_net (sk), +LINUX_MIB_TCPABORTONLINGER ); }else {const int tmo =tcp_fin_time (sk);
@@ -1893,7 +1894,8 @@ adjudge_to_death: "sockets\n");tcp_set_state (sk,TCP_CLOSE );tcp_send_active_reset (sk,GFP_ATOMIC ); -NET_INC_STATS_BH (LINUX_MIB_TCPABORTONMEMORY ); +NET_INC_STATS_BH (sock_net (sk), +LINUX_MIB_TCPABORTONMEMORY ); } }
net/ipv4/tcp_input.c +33 -32
255 lines not on this page · raw message
net/ipv4/tcp_ipv4.c +6 -6
@@ -366,7 +366,7 @@ void tcp_v4_err(struct sk_buff *skb, u32 info)* servers this needs to be solved differently. */ if (sock_owned_by_user (sk)) -NET_INC_STATS_BH (LINUX_MIB_LOCKDROPPEDICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_LOCKDROPPEDICMPS );if (sk->sk_state ==TCP_CLOSE ) goto out;
@@ -375,7 +375,7 @@ void tcp_v4_err(struct sk_buff *skb, u32 info) seq =ntohl (th->seq);if (sk->sk_state !=TCP_LISTEN && !between (seq, tp->snd_una, tp->snd_nxt)) { -NET_INC_STATS_BH (LINUX_MIB_OUTOFWINDOWICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_OUTOFWINDOWICMPS ); goto out; }
@@ -422,7 +422,7 @@ void tcp_v4_err(struct sk_buff *skb, u32 info)BUG_TRAP (!req->sk);if (seq !=tcp_rsk (req)->snt_isn) { -NET_INC_STATS_BH (LINUX_MIB_OUTOFWINDOWICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_OUTOFWINDOWICMPS ); goto out; }
@@ -1251,7 +1251,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)if (get_seconds () < peer->tcp_ts_stamp +TCP_PAWS_MSL && (s32)(peer->tcp_ts - req->ts_recent) >TCP_PAWS_WINDOW ) { -NET_INC_STATS_BH (LINUX_MIB_PAWSPASSIVEREJECTED ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_PAWSPASSIVEREJECTED ); goto drop_and_release; } }
@@ -1365,9 +1365,9 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,return newsk; exit_overflow: -NET_INC_STATS_BH (LINUX_MIB_LISTENOVERFLOWS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_LISTENOVERFLOWS ); exit: -NET_INC_STATS_BH (LINUX_MIB_LISTENDROPS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_LISTENDROPS );dst_release (dst);return NULL ; }
net/ipv4/tcp_minisocks.c +3 -3
@@ -244,7 +244,7 @@ kill: }if (paws_reject) -NET_INC_STATS_BH (LINUX_MIB_PAWSESTABREJECTED ); +NET_INC_STATS_BH (twsk_net (tw),LINUX_MIB_PAWSESTABREJECTED );if (!th->rst) {/* In this case we must reset the TIMEWAIT timer.
@@ -611,7 +611,7 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,if (!(flg &TCP_FLAG_RST )) req->rsk_ops->send_ack (skb, req);if (paws_reject) -NET_INC_STATS_BH (LINUX_MIB_PAWSESTABREJECTED ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_PAWSESTABREJECTED );return NULL ; }
@@ -695,7 +695,7 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb, } embryonic_reset: -NET_INC_STATS_BH (LINUX_MIB_EMBRYONICRSTS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_EMBRYONICRSTS );if (!(flg &TCP_FLAG_RST )) req->rsk_ops->send_reset (sk, skb);
net/ipv4/tcp_output.c +2 -2
@@ -1995,7 +1995,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk) mib_idx =LINUX_MIB_TCPFASTRETRANS ; else mib_idx =LINUX_MIB_TCPSLOWSTARTRETRANS ; -NET_INC_STATS_BH (mib_idx); +NET_INC_STATS_BH (sock_net (sk), mib_idx);if (skb ==tcp_write_queue_head (sk)) inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
@@ -2065,7 +2065,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk)inet_csk (sk)->icsk_rto, TCP_RTO_MAX); -NET_INC_STATS_BH (LINUX_MIB_TCPFORWARDRETRANS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_TCPFORWARDRETRANS ); } }
net/ipv4/tcp_timer.c +6 -6
@@ -48,7 +48,7 @@ static void tcp_write_err(struct sock *sk) sk->sk_error_report (sk);tcp_done (sk); -NET_INC_STATS_BH (LINUX_MIB_TCPABORTONTIMEOUT ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_TCPABORTONTIMEOUT ); }/* Do not allow orphaned sockets to eat all our resources.
@@ -89,7 +89,7 @@ static int tcp_out_of_resources(struct sock *sk, int do_reset)if (do_reset)tcp_send_active_reset (sk,GFP_ATOMIC );tcp_done (sk); -NET_INC_STATS_BH (LINUX_MIB_TCPABORTONMEMORY ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_TCPABORTONMEMORY );return 1 ; }return 0 ;
@@ -179,7 +179,7 @@ static void tcp_delack_timer(unsigned long data)if (sock_owned_by_user (sk)) {/* Try again later. */ icsk->icsk_ack.blocked =1 ; -NET_INC_STATS_BH (LINUX_MIB_DELAYEDACKLOCKED ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_DELAYEDACKLOCKED );sk_reset_timer (sk, &icsk->icsk_delack_timer, jiffies +TCP_DELACK_MIN ); goto out_unlock; }
@@ -198,7 +198,7 @@ static void tcp_delack_timer(unsigned long data)if (!skb_queue_empty (&tp->ucopy.prequeue)) {struct sk_buff *skb; -NET_INC_STATS_BH (LINUX_MIB_TCPSCHEDULERFAILED ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_TCPSCHEDULERFAILED );while ((skb =__skb_dequeue (&tp->ucopy.prequeue)) !=NULL ) sk->sk_backlog_rcv (sk, skb);
@@ -218,7 +218,7 @@ static void tcp_delack_timer(unsigned long data) icsk->icsk_ack.ato =TCP_ATO_MIN ; }tcp_send_ack (sk); -NET_INC_STATS_BH (LINUX_MIB_DELAYEDACKS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_DELAYEDACKS ); }TCP_CHECK_TIMER (sk);
@@ -346,7 +346,7 @@ static void tcp_retransmit_timer(struct sock *sk) }else { mib_idx =LINUX_MIB_TCPTIMEOUTS ; } -NET_INC_STATS_BH (mib_idx); +NET_INC_STATS_BH (sock_net (sk), mib_idx); }if (tcp_use_frto (sk)) {
net/ipv6/inet6_hashtables.c +2 -2
@@ -210,11 +210,11 @@ unique:if (twp !=NULL ) { *twp = tw; -NET_INC_STATS_BH (LINUX_MIB_TIMEWAITRECYCLED ); +NET_INC_STATS_BH (twsk_net (tw),LINUX_MIB_TIMEWAITRECYCLED ); }else if (tw !=NULL ) {/* Silly. Should hash-dance instead... */ inet_twsk_deschedule (tw, death_row); -NET_INC_STATS_BH (LINUX_MIB_TIMEWAITRECYCLED ); +NET_INC_STATS_BH (twsk_net (tw),LINUX_MIB_TIMEWAITRECYCLED );inet_twsk_put (tw); }
net/ipv6/syncookies.c +3 -3
@@ -137,7 +137,7 @@ __u32 cookie_v6_init_sequence(struct sock *sk, struct sk_buff *skb, __u16 *mssp) ; *mssp = msstab[mssind] +1 ; -NET_INC_STATS_BH (LINUX_MIB_SYNCOOKIESSENT ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_SYNCOOKIESSENT ); return secure_tcp_syn_cookie(&iph->saddr, &iph->daddr, th->source, th->dest, ntohl(th->seq),
@@ -177,11 +177,11 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb)if (time_after (jiffies, tp->last_synq_overflow +TCP_TIMEOUT_INIT ) || (mss =cookie_check (skb, cookie)) ==0 ) { -NET_INC_STATS_BH (LINUX_MIB_SYNCOOKIESFAILED ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_SYNCOOKIESFAILED ); goto out; } -NET_INC_STATS_BH (LINUX_MIB_SYNCOOKIESRECV ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_SYNCOOKIESRECV );/* check for timestamp cookie support */ memset (&tcp_opt,0 ,sizeof (tcp_opt));
net/ipv6/tcp_ipv6.c +5 -5
@@ -340,7 +340,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,bh_lock_sock (sk);if (sock_owned_by_user (sk)) -NET_INC_STATS_BH (LINUX_MIB_LOCKDROPPEDICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_LOCKDROPPEDICMPS );if (sk->sk_state ==TCP_CLOSE ) goto out;
@@ -349,7 +349,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, seq =ntohl (th->seq);if (sk->sk_state !=TCP_LISTEN && !between (seq, tp->snd_una, tp->snd_nxt)) { -NET_INC_STATS_BH (LINUX_MIB_OUTOFWINDOWICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_OUTOFWINDOWICMPS ); goto out; }
@@ -424,7 +424,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,BUG_TRAP (req->sk ==NULL );if (seq !=tcp_rsk (req)->snt_isn) { -NET_INC_STATS_BH (LINUX_MIB_OUTOFWINDOWICMPS ); +NET_INC_STATS_BH (net,LINUX_MIB_OUTOFWINDOWICMPS ); goto out; }
@@ -1449,9 +1449,9 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,return newsk; out_overflow: -NET_INC_STATS_BH (LINUX_MIB_LISTENOVERFLOWS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_LISTENOVERFLOWS ); out: -NET_INC_STATS_BH (LINUX_MIB_LISTENDROPS ); +NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_LISTENDROPS );if (opt && opt != np->opt)sock_kfree_s (sk, opt, opt->tot_len);dst_release (dst);
net/sctp/input.c +1 -1
@@ -486,7 +486,7 @@ struct sock *sctp_err_lookup(int family, struct sk_buff *skb,* servers this needs to be solved differently. */ if (sock_owned_by_user (sk)) -NET_INC_STATS_BH (LINUX_MIB_LOCKDROPPEDICMPS ); +NET_INC_STATS_BH (&init_net,LINUX_MIB_LOCKDROPPEDICMPS ); *app = asoc; *tpp = transport;
Signature · 1 line
1.5.5.1
PATCH 18/20 mib: add net to NET_INC_STATS_USER
In reply to Pavel Emelyanov--- include/net/ip.h | 2 +- net/ipv4/tcp.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
include/net/ip.h +1 -1
@@ -163,7 +163,7 @@ DECLARE_SNMP_STAT(struct ipstats_mib, ip_statistics); DECLARE_SNMP_STAT(struct linux_mib, net_statistics);#define NET_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(net_statistics, field); } while (0)#define NET_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(net_statistics, field); } while (0) -#define NET_INC_STATS_USER (field) SNMP_INC_STATS_USER(net_statistics, field) +#define NET_INC_STATS_USER (net, field) do { (void)net; SNMP_INC_STATS_USER(net_statistics, field); } while (0)#define NET_ADD_STATS_BH (field, adnd) SNMP_ADD_STATS_BH(net_statistics, field, adnd)#define NET_ADD_STATS_USER (field, adnd) SNMP_ADD_STATS_USER(net_statistics, field, adnd)
net/ipv4/tcp.c +3 -3
@@ -1153,7 +1153,7 @@ static void tcp_prequeue_process(struct sock *sk)struct sk_buff *skb;struct tcp_sock *tp =tcp_sk (sk); -NET_INC_STATS_USER (LINUX_MIB_TCPPREQUEUED ); +NET_INC_STATS_USER (sock_net (sk),LINUX_MIB_TCPPREQUEUED );/* RX process wants to run with disabled BHs, though it is not * necessary */
@@ -1793,13 +1793,13 @@ void tcp_close(struct sock *sk, long timeout)*/ if (data_was_unread) {/* Unread data was tossed, zap the connection. */ -NET_INC_STATS_USER (LINUX_MIB_TCPABORTONCLOSE ); +NET_INC_STATS_USER (sock_net (sk),LINUX_MIB_TCPABORTONCLOSE );tcp_set_state (sk,TCP_CLOSE );tcp_send_active_reset (sk,GFP_KERNEL ); }else if (sock_flag (sk,SOCK_LINGER ) && !sk->sk_lingertime) {/* Check zero linger _after_ checking for unread data. */ sk->sk_prot->disconnect (sk,0 ); -NET_INC_STATS_USER (LINUX_MIB_TCPABORTONDATA ); +NET_INC_STATS_USER (sock_net (sk),LINUX_MIB_TCPABORTONDATA ); }else if (tcp_close_state (sk)) {/* We FIN if the application ate all the data before * zapping the connection.
Signature · 1 line
1.5.5.1
PATCH 19/20 mib: add net to NET_ADD_STATS_BH
In reply to Pavel EmelyanovThis one is tricky.
The thing is that this macro is only used when killing tw buckets, but since this killer is promiscuous wrt to which net each particular tw belongs to, I have to use it only when NET_NS is off. When the net namespaces are on, I use the INET_INC_STATS_BH for each bucket.
--- include/net/ip.h | 2 +- net/ipv4/inet_timewait_sock.c | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-)
include/net/ip.h +1 -1
@@ -164,7 +164,7 @@ DECLARE_SNMP_STAT(struct linux_mib, net_statistics);#define NET_INC_STATS (net, field) do { (void)net; SNMP_INC_STATS(net_statistics, field); } while (0)#define NET_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(net_statistics, field); } while (0)#define NET_INC_STATS_USER (net, field) do { (void)net; SNMP_INC_STATS_USER(net_statistics, field); } while (0) -#define NET_ADD_STATS_BH (field, adnd) SNMP_ADD_STATS_BH(net_statistics, field, adnd) +#define NET_ADD_STATS_BH (net, field, adnd) do { (void)net; SNMP_ADD_STATS_BH(net_statistics, field, adnd); } while (0)#define NET_ADD_STATS_USER (field, adnd) SNMP_ADD_STATS_USER(net_statistics, field, adnd)extern unsigned long snmp_fold_field (void *mib[],int offt);
net/ipv4/inet_timewait_sock.c +12 -3
@@ -160,6 +160,9 @@ rescan:__inet_twsk_del_dead_node (tw);spin_unlock (&twdr->death_lock);__inet_twsk_kill (tw, twdr->hashinfo); +#ifdef CONFIG_NET_NS +NET_INC_STATS_BH (twsk_net (tw),LINUX_MIB_TIMEWAITED ); +#endif inet_twsk_put (tw); killed++;spin_lock (&twdr->death_lock);
@@ -178,8 +181,9 @@ rescan: } twdr->tw_count -= killed; -NET_ADD_STATS_BH (LINUX_MIB_TIMEWAITED , killed); - +#ifndef CONFIG_NET_NS +NET_ADD_STATS_BH (&init_net,LINUX_MIB_TIMEWAITED , killed); +#endif return ret; }
@@ -372,6 +376,9 @@ void inet_twdr_twcal_tick(unsigned long data) &twdr->twcal_row[slot]) {__inet_twsk_del_dead_node (tw);__inet_twsk_kill (tw, twdr->hashinfo); +#ifdef CONFIG_NET_NS +NET_INC_STATS_BH (twsk_net (tw),LINUX_MIB_TIMEWAITKILLED ); +#endif inet_twsk_put (tw); killed++; }
@@ -395,7 +402,9 @@ void inet_twdr_twcal_tick(unsigned long data) out:if ((twdr->tw_count -= killed) ==0 )del_timer (&twdr->tw_timer); -NET_ADD_STATS_BH (LINUX_MIB_TIMEWAITKILLED , killed); +#ifndef CONFIG_NET_NS +NET_ADD_STATS_BH (&init_net,LINUX_MIB_TIMEWAITKILLED , killed); +#endif spin_unlock (&twdr->death_lock); }
Signature · 1 line
1.5.5.1
PATCH 20/20 mib: add net to NET_ADD_STATS_USER
In reply to Pavel EmelyanovDone with NET_XXX_STATS macros :)
To be continued...
--- include/net/ip.h | 2 +- net/ipv4/tcp.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
include/net/ip.h +1 -1
@@ -165,7 +165,7 @@ DECLARE_SNMP_STAT(struct linux_mib, net_statistics);#define NET_INC_STATS_BH (net, field) do { (void)net; SNMP_INC_STATS_BH(net_statistics, field); } while (0)#define NET_INC_STATS_USER (net, field) do { (void)net; SNMP_INC_STATS_USER(net_statistics, field); } while (0)#define NET_ADD_STATS_BH (net, field, adnd) do { (void)net; SNMP_ADD_STATS_BH(net_statistics, field, adnd); } while (0) -#define NET_ADD_STATS_USER (field, adnd) SNMP_ADD_STATS_USER(net_statistics, field, adnd) +#define NET_ADD_STATS_USER (net, field, adnd) do { (void)net; SNMP_ADD_STATS_USER(net_statistics, field, adnd); } while (0)extern unsigned long snmp_fold_field (void *mib[],int offt);extern int snmp_mib_init (void *ptr[2 ],size_t mibsize);
net/ipv4/tcp.c +3 -3
@@ -1475,7 +1475,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,/* __ Restore normal policy in scheduler __ */ if ((chunk = len - tp->ucopy.len) !=0 ) { -NET_ADD_STATS_USER (LINUX_MIB_TCPDIRECTCOPYFROMBACKLOG , chunk); +NET_ADD_STATS_USER (sock_net (sk),LINUX_MIB_TCPDIRECTCOPYFROMBACKLOG , chunk); len -= chunk; copied += chunk; }
@@ -1486,7 +1486,7 @@ do_prequeue:tcp_prequeue_process (sk);if ((chunk = len - tp->ucopy.len) !=0 ) { -NET_ADD_STATS_USER (LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE , chunk); +NET_ADD_STATS_USER (sock_net (sk),LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE , chunk); len -= chunk; copied += chunk; }
@@ -1601,7 +1601,7 @@ skip_copy:tcp_prequeue_process (sk);if (copied >0 && (chunk = len - tp->ucopy.len) !=0 ) { -NET_ADD_STATS_USER (LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE , chunk); +NET_ADD_STATS_USER (sock_net (sk),LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE , chunk); len -= chunk; copied += chunk; }
Signature · 1 line
1.5.5.1
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 7/20 mib: drop unused TCP MIB accounting macros
The vger rejected triple X in the first version subject, so I resend the patch.
Log:
TCP_INC_STATS_USER and TCP_ADD_STATS_BH are currently unused.
--- include/net/tcp.h | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-)
include/net/tcp.h +0 -2
@@ -268,9 +268,7 @@ extern struct proto tcp_prot; DECLARE_SNMP_STAT(struct tcp_mib, tcp_statistics);#define TCP_INC_STATS (field) SNMP_INC_STATS(tcp_statistics, field)#define TCP_INC_STATS_BH (field) SNMP_INC_STATS_BH(tcp_statistics, field) -#define TCP_INC_STATS_USER (field) SNMP_INC_STATS_USER(tcp_statistics, field)#define TCP_DEC_STATS (field) SNMP_DEC_STATS(tcp_statistics, field) -#define TCP_ADD_STATS_BH (field, val) SNMP_ADD_STATS_BH(tcp_statistics, field, val)#define TCP_ADD_STATS_USER (field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val)extern void tcp_v4_err (struct sk_buff *skb,u32 );
-- 1.5.5.1
David Miller
maintainerFrom: Pavel Emelyanov <[email protected]>
Date: Wed, 16 Jul 2008 12:05:10 +0400
Quoted 8 lines
This is actually the last very scattered set, that changes many calls to MIB accounting macros. What is left requires less patching.
David, I hope this (and a finalizing set, I will prepare after this one is accepted) can go to current 2.6.27 merge window, but it is OK with me if your decision is to delay this till 2.6.28.
Signed-off-by Pavel Emelyanov <[email protected]>
Ok, all applied to net-next-2.6, I'll push after I do some build testing.
Patch 19 is ugly :( But I can't recommend another approach. If you could find a way to clean that stuff up, it would really be appreciated.
If you can get your "finalizing set" to me today or tomorrow, I guess I can apply it.
I plan to merge net-next to Linus either Sunday or Monday.