summaryrefslogtreecommitdiffstats
path: root/sys/net/rtsock.c
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2014-03-05 01:17:47 +0000
committerglebius <glebius@FreeBSD.org>2014-03-05 01:17:47 +0000
commit8a3e4bbebb00c94db1ecf732ad3a6e3aa982384d (patch)
treec94a610c690dc0167aec575edf34ac5b23f1f498 /sys/net/rtsock.c
parentc23c087e5b36b9341d9242aae6bd8eb7835dfd43 (diff)
downloadFreeBSD-src-8a3e4bbebb00c94db1ecf732ad3a6e3aa982384d.zip
FreeBSD-src-8a3e4bbebb00c94db1ecf732ad3a6e3aa982384d.tar.gz
- Remove rt_metrics_lite and simply put its members into rtentry.
- Use counter(9) for rt_pksent (former rt_rmx.rmx_pksent). This removes another cache trashing ++ from packet forwarding path. - Create zini/fini methods for the rtentry UMA zone. Via initialize mutex and counter in them. - Fix reporting of rmx_pksent to routing socket. - Fix netstat(1) to report "Use" both in kvm(3) and sysctl(3) mode. The change is mostly targeted for stable/10 merge. For head, rt_pksent is expected to just disappear. Discussed with: melifaro Sponsored by: Netflix Sponsored by: Nginx, Inc.
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r--sys/net/rtsock.c58
1 files changed, 23 insertions, 35 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index f7d5580..691eb62 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -189,10 +189,8 @@ static int sysctl_dumpentry(struct radix_node *rn, void *vw);
static int sysctl_iflist(int af, struct walkarg *w);
static int sysctl_ifmalist(int af, struct walkarg *w);
static int route_output(struct mbuf *m, struct socket *so);
-static void rt_setmetrics(u_long which, const struct rt_metrics *in,
- struct rt_metrics_lite *out);
-static void rt_getmetrics(const struct rt_metrics_lite *in,
- struct rt_metrics *out);
+static void rt_setmetrics(const struct rt_msghdr *rtm, struct rtentry *rt);
+static void rt_getmetrics(const struct rtentry *rt, struct rt_metrics *out);
static void rt_dispatch(struct mbuf *, sa_family_t);
static struct netisr_handler rtsock_nh = {
@@ -680,8 +678,7 @@ route_output(struct mbuf *m, struct socket *so)
rti_need_deembed = (V_deembed_scopeid) ? 1 : 0;
#endif
RT_LOCK(saved_nrt);
- rt_setmetrics(rtm->rtm_inits,
- &rtm->rtm_rmx, &saved_nrt->rt_rmx);
+ rt_setmetrics(rtm, saved_nrt);
rtm->rtm_index = saved_nrt->rt_ifp->if_index;
RT_REMREF(saved_nrt);
RT_UNLOCK(saved_nrt);
@@ -850,7 +847,7 @@ route_output(struct mbuf *m, struct socket *so)
(rt->rt_flags & ~RTF_GWFLAG_COMPAT);
else
rtm->rtm_flags = rt->rt_flags;
- rt_getmetrics(&rt->rt_rmx, &rtm->rtm_rmx);
+ rt_getmetrics(rt, &rtm->rtm_rmx);
rtm->rtm_addrs = info.rti_addrs;
break;
@@ -913,8 +910,7 @@ route_output(struct mbuf *m, struct socket *so)
/* Allow some flags to be toggled on change. */
rt->rt_flags = (rt->rt_flags & ~RTF_FMASK) |
(rtm->rtm_flags & RTF_FMASK);
- rt_setmetrics(rtm->rtm_inits, &rtm->rtm_rmx,
- &rt->rt_rmx);
+ rt_setmetrics(rtm, rt);
rtm->rtm_index = rt->rt_ifp->if_index;
if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest)
rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, &info);
@@ -1002,34 +998,30 @@ flush:
}
static void
-rt_setmetrics(u_long which, const struct rt_metrics *in,
- struct rt_metrics_lite *out)
+rt_setmetrics(const struct rt_msghdr *rtm, struct rtentry *rt)
{
-#define metric(f, e) if (which & (f)) out->e = in->e;
- /*
- * Only these are stored in the routing entry since introduction
- * of tcp hostcache. The rest is ignored.
- */
- metric(RTV_MTU, rmx_mtu);
- metric(RTV_WEIGHT, rmx_weight);
- /* Userland -> kernel timebase conversion. */
- if (which & RTV_EXPIRE)
- out->rmx_expire = in->rmx_expire ?
- in->rmx_expire - time_second + time_uptime : 0;
-#undef metric
+
+ if (rtm->rtm_inits & RTV_MTU)
+ rt->rt_mtu = rtm->rtm_rmx.rmx_mtu;
+ if (rtm->rtm_inits & RTV_WEIGHT)
+ rt->rt_weight = rtm->rtm_rmx.rmx_weight;
+ /* Kernel -> userland timebase conversion. */
+ if (rtm->rtm_inits & RTV_EXPIRE)
+ rt->rt_expire = rtm->rtm_rmx.rmx_expire ?
+ rtm->rtm_rmx.rmx_expire - time_second + time_uptime : 0;
}
static void
-rt_getmetrics(const struct rt_metrics_lite *in, struct rt_metrics *out)
+rt_getmetrics(const struct rtentry *rt, struct rt_metrics *out)
{
-#define metric(e) out->e = in->e;
+
bzero(out, sizeof(*out));
- metric(rmx_mtu);
- metric(rmx_weight);
+ out->rmx_mtu = rt->rt_mtu;
+ out->rmx_weight = rt->rt_weight;
+ out->rmx_pksent = counter_u64_fetch(rt->rt_pksent);
/* Kernel -> userland timebase conversion. */
- out->rmx_expire = in->rmx_expire ?
- in->rmx_expire - time_uptime + time_second : 0;
-#undef metric
+ out->rmx_expire = rt->rt_expire ?
+ rt->rt_expire - time_uptime + time_second : 0;
}
/*
@@ -1596,11 +1588,7 @@ sysctl_dumpentry(struct radix_node *rn, void *vw)
(rt->rt_flags & ~RTF_GWFLAG_COMPAT);
else
rtm->rtm_flags = rt->rt_flags;
- /*
- * let's be honest about this being a retarded hack
- */
- rtm->rtm_fmask = rt->rt_rmx.rmx_pksent;
- rt_getmetrics(&rt->rt_rmx, &rtm->rtm_rmx);
+ rt_getmetrics(rt, &rtm->rtm_rmx);
rtm->rtm_index = rt->rt_ifp->if_index;
rtm->rtm_errno = rtm->rtm_pid = rtm->rtm_seq = 0;
rtm->rtm_addrs = info.rti_addrs;
OpenPOWER on IntegriCloud