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.

Reply via email to