From: Roopa Prabhu <ro...@cumulusnetworks.com> Date: Fri, 8 Apr 2016 23:38:11 -0700
> This patch adds a new RTM_GETSTATS message to query link stats via netlink > from the kernel. RTM_NEWLINK also dumps stats today, but RTM_NEWLINK > returns a lot more than just stats and is expensive in some cases when > frequent polling for stats from userspace is a common operation. Great work. One thing catches my eye: > + if (filter_mask & IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK64)) { > + attr = nla_reserve(skb, IFLA_STATS_LINK64, > + sizeof(struct rtnl_link_stats64)); > + if (!attr) > + return -EMSGSIZE; > + > + stats = dev_get_stats(dev, &temp); > + > + copy_rtnl_link_stats64(nla_data(attr), stats); This extra copy bothers me, so I tried to figure out what is going on here. dev_get_stats() always returns the rtnl_link_stats64 pointer it was given. We should be able to pass, therefore, nla_data(attr), straight there to avoid the copy. Bonding even uses dev_get_stats() in this way. The existing rtnl_fill_stats() can be improved similarly but is of course a separate change. In that case, we'd do something like: struct rtnl_link_stats64 *sp; attr = nla_reserve(skb, IFLA_STATS64, sizeof(struct rtnl_link_stats64)); if (!attr) return -EMSGSIZE; sp = nla_data(attr); dev_get_stats(dev, sp); attr = nla_reserve(skb, IFLA_STATS, sizeof(struct rtnl_link_stats)); if (!attr) return -EMSGSIZE; copy_rtnl_link_stats(nla_data(attr), sp); Thanks.