Martin Pieuchot <m...@openbsd.org> writes: > On 30/01/17(Mon) 22:14, Jeremie Courreges-Anglas wrote: >> Very lightly tested. I used the existing percpu counters as examples. > > I like it. > >> I don't like the hardcoding of "32" in ip6_input() but I am not sure how >> to solve it nicely; the easiest way would be to just kill those >> ipv6-specific mbuf stats. Would anyone miss them? > > I believe it's fine to kill it.
Let's do that. >> Thoughts? > > Some comments below. > >> Other netinet6/* counters will follow. > > \o/ > >> @@ -514,14 +514,14 @@ frag6_input(struct mbuf **mp, int *offp, >> m_freem(IP6_REASS_MBUF(af6)); >> free(af6, M_FTABLE, sizeof(*af6)); >> } >> - ip6stat.ip6s_fragdropped += q6->ip6q_nfrag; >> + counters_add(ip6counters, ip6s_fragdropped, q6->ip6q_nfrag); > > What about adding & using ip6stat_add()? Alright. >> Index: netinet6/icmp6.c >> =================================================================== >> RCS file: /d/cvs/src/sys/netinet6/icmp6.c,v >> retrieving revision 1.197 >> diff -u -p -r1.197 icmp6.c >> --- netinet6/icmp6.c 19 Jan 2017 14:49:19 -0000 1.197 >> +++ netinet6/icmp6.c 30 Jan 2017 21:02:30 -0000 >> @@ -1124,8 +1124,13 @@ icmp6_rip6_input(struct mbuf **mp, int o >> } else >> sorwakeup(last->inp_socket); >> } else { >> + struct counters_ref ref; >> + uint64_t *counters; >> + >> m_freem(m); >> - ip6stat.ip6s_delivered--; >> + counters = counters_enter(&ref, ip6counters); >> + counters[ip6s_delivered]--; >> + counters_leave(&ref, ip6counters); > > Looks like you found a use case for introducing counters_dec(). Yes, but I don't know which threshold warrants introducing a new function. So far those are the first cases for counters_dec(); that includes wip rip6stat, icmp6stat, icmpstat and tcpstat. And I'm not even sure those decrements make sense. I guess we can add counters_dec() and then later remove it if it is deemed useless. >> Index: netinet6/ip6_input.c >> =================================================================== >> RCS file: /d/cvs/src/sys/netinet6/ip6_input.c,v >> retrieving revision 1.175 >> diff -u -p -r1.175 ip6_input.c >> --- netinet6/ip6_input.c 29 Jan 2017 19:58:47 -0000 1.175 >> +++ netinet6/ip6_input.c 30 Jan 2017 21:02:30 -0000 >> @@ -117,7 +117,9 @@ >> struct in6_ifaddrhead in6_ifaddr; >> struct niqueue ip6intrq = NIQUEUE_INITIALIZER(IFQ_MAXLEN, NETISR_IPV6); >> >> -struct ip6stat ip6stat; >> +struct cpumem *ip6counters; >> + >> +int ip6_sysctl_ip6stat(void *, size_t *, void *); >> >> int ip6_check_rh0hdr(struct mbuf *, int *); >> >> @@ -158,6 +160,8 @@ ip6_init(void) >> frag6_init(); >> >> mq_init(&ip6send_mq, 64, IPL_SOFTNET); >> + >> + ip6counters = counters_alloc(ip6s_ncounters, M_COUNTERS); > > Could you do me a favor and kill the last argument of counters_alloc(9)? Agreed. >> Index: netinet6/raw_ip6.c >> =================================================================== >> RCS file: /d/cvs/src/sys/netinet6/raw_ip6.c,v >> retrieving revision 1.103 >> diff -u -p -r1.103 raw_ip6.c >> --- netinet6/raw_ip6.c 23 Jan 2017 16:31:24 -0000 1.103 >> +++ netinet6/raw_ip6.c 30 Jan 2017 21:02:30 -0000 >> @@ -211,6 +211,9 @@ rip6_input(struct mbuf **mp, int *offp, >> } else >> sorwakeup(last->inp_socket); >> } else { >> + struct counters_ref ref; >> + uint64_t *counters; >> + >> rip6stat.rip6s_nosock++; >> if (m->m_flags & M_MCAST) >> rip6stat.rip6s_nosockmcast++; >> @@ -222,7 +225,9 @@ rip6_input(struct mbuf **mp, int *offp, >> ICMP6_PARAMPROB_NEXTHEADER, >> prvnxtp - mtod(m, u_int8_t *)); >> } >> - ip6stat.ip6s_delivered--; >> + counters = counters_enter(&ref, ip6counters); >> + counters[ip6s_delivered]--; >> + counters_leave(&ref, ip6counters); > > Should we also use your counters_dec() here or do you think it's better > to merge icmp6_rip6_input() and rip6_input()? I'm fine with using counters_dec(), I can see that those functions are almost twins but I don't want to open a can of worms... -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE