On 4/13/16, 9:19 PM, David Miller wrote: > 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.
nice catch. I picked this up straight from rtnl_fill_stats. agree, also thanks for the example below. > > 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); I will submit a separate patch for this with some testing. Will send a v3 out before end of this week. Thank you!.