From patchwork Wed Apr 27 16:18:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikolay Aleksandrov X-Patchwork-Id: 615728 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qw4rp6xTKz9t73 for ; Thu, 28 Apr 2016 02:18:34 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b=gm+C5bkN; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752749AbcD0QSc (ORCPT ); Wed, 27 Apr 2016 12:18:32 -0400 Received: from mail-wm0-f42.google.com ([74.125.82.42]:37525 "EHLO mail-wm0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752403AbcD0QSa (ORCPT ); Wed, 27 Apr 2016 12:18:30 -0400 Received: by mail-wm0-f42.google.com with SMTP id a17so22920436wme.0 for ; Wed, 27 Apr 2016 09:18:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=C8lkQcd1/zMFRSfrR339V4yz7MdWjMGf1BtNFVFAvkA=; b=gm+C5bkNL2PXQ+Twm+jOCAnBAgoyvyO1XJF5hyQmktHTfaeQENMlIPJ8CUJ0AZLIaL dMkBocEyIDQduMfsLu7b5E8bCT2z/QOpsx3VEkKFqw8v1BZgYthe8ZshFivPORkMjYI6 aoJYvnCEWC06pQ4TXE7enwKzNnm51ZX9R+3V0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=C8lkQcd1/zMFRSfrR339V4yz7MdWjMGf1BtNFVFAvkA=; b=Tc+MlLVus87v00kcn8jW30Au1/Yd4IHlBRc4QcxCxKf2kk8dniDmvi2Vp7wiwe3M2F 3x4AI8qkeDg6WD93FI0zG1asiUATOllUJ1qplFbPde0xdbSp1wx4N5+ByqZdXz734Giq OTKnXUeOSS9M1poutORw2RYbgaMn7heIC7AxQCdDGMEjg0rMHUCMZZxMYFyRQQPh447T efzxFO4gWx4x969otbfym7YfYS3LjKsTcN8JKrCEEkZUPdsW7juFfBbYgjU/b8iE6Bfc 1YzT9Hk1iD0G6nWBCl72s6ijbYSs21GQjvOF9HjpzwgUbp2nTVbZup+KV+ymfzOrGRYN qJmg== X-Gm-Message-State: AOPr4FXwwAVJAjbrrVogpfT2RDb4PrkYO/vSpUKjHcVv59Bum9fswi+7oTmflHwoXnhX0LCM X-Received: by 10.194.123.102 with SMTP id lz6mr10933235wjb.2.1461773909305; Wed, 27 Apr 2016 09:18:29 -0700 (PDT) Received: from debil.lan (ip4-62-4-104-109.cust.nbox.cz. [62.4.104.109]) by smtp.gmail.com with ESMTPSA id ck9sm4835403wjc.22.2016.04.27.09.18.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Apr 2016 09:18:28 -0700 (PDT) From: Nikolay Aleksandrov To: netdev@vger.kernel.org Cc: roopa@cumulusnetworks.com, davem@davemloft.net, stephen@networkplumber.org, jhs@mojatatu.com, Nikolay Aleksandrov Subject: [PATCH net-next 1/7] net: rtnetlink: allow rtnl_fill_statsinfo to save private state counter Date: Wed, 27 Apr 2016 18:18:16 +0200 Message-Id: <1461773902-13528-2-git-send-email-nikolay@cumulusnetworks.com> X-Mailer: git-send-email 2.4.11 In-Reply-To: <1461773902-13528-1-git-send-email-nikolay@cumulusnetworks.com> References: <1461773902-13528-1-git-send-email-nikolay@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The new lidx argument allows the current dumping device to save a private state counter which would enable it to continue dumping from where it left off. Signed-off-by: Nikolay Aleksandrov --- net/core/rtnetlink.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 5ec059d52823..aeb2fa9b1cda 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -3446,11 +3446,13 @@ out: static int rtnl_fill_statsinfo(struct sk_buff *skb, struct net_device *dev, int type, u32 pid, u32 seq, u32 change, - unsigned int flags, unsigned int filter_mask) + unsigned int flags, unsigned int filter_mask, + int *lidx) { struct if_stats_msg *ifsm; struct nlmsghdr *nlh; struct nlattr *attr; + int s_lidx = *lidx; ASSERT_RTNL(); @@ -3480,7 +3482,11 @@ static int rtnl_fill_statsinfo(struct sk_buff *skb, struct net_device *dev, return 0; nla_put_failure: - nlmsg_cancel(skb, nlh); + /* If we haven't made progress, it's a real error */ + if (s_lidx == *lidx) + nlmsg_cancel(skb, nlh); + else + nlmsg_end(skb, nlh); return -EMSGSIZE; } @@ -3507,6 +3513,7 @@ static int rtnl_stats_get(struct sk_buff *skb, struct nlmsghdr *nlh) struct net_device *dev = NULL; struct sk_buff *nskb; u32 filter_mask; + int lidx = 0; int err; ifsm = nlmsg_data(nlh); @@ -3528,7 +3535,7 @@ static int rtnl_stats_get(struct sk_buff *skb, struct nlmsghdr *nlh) err = rtnl_fill_statsinfo(nskb, dev, RTM_NEWSTATS, NETLINK_CB(skb).portid, nlh->nlmsg_seq, 0, - 0, filter_mask); + 0, filter_mask, &lidx); if (err < 0) { /* -EMSGSIZE implies BUG in if_nlmsg_stats_size */ WARN_ON(err == -EMSGSIZE); @@ -3545,7 +3552,7 @@ static int rtnl_stats_dump(struct sk_buff *skb, struct netlink_callback *cb) struct net *net = sock_net(skb->sk); struct if_stats_msg *ifsm; int h, s_h; - int idx = 0, s_idx; + int idx = 0, s_idx, s_lidx; struct net_device *dev; struct hlist_head *head; unsigned int flags = NLM_F_MULTI; @@ -3554,6 +3561,7 @@ static int rtnl_stats_dump(struct sk_buff *skb, struct netlink_callback *cb) s_h = cb->args[0]; s_idx = cb->args[1]; + s_lidx = cb->args[2]; cb->seq = net->dev_base_seq; @@ -3571,7 +3579,7 @@ static int rtnl_stats_dump(struct sk_buff *skb, struct netlink_callback *cb) err = rtnl_fill_statsinfo(skb, dev, RTM_NEWSTATS, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, 0, - flags, filter_mask); + flags, filter_mask, &s_lidx); /* If we ran out of room on the first message, * we're in trouble */ @@ -3579,13 +3587,14 @@ static int rtnl_stats_dump(struct sk_buff *skb, struct netlink_callback *cb) if (err < 0) goto out; - + s_lidx = 0; nl_dump_check_consistent(cb, nlmsg_hdr(skb)); cont: idx++; } } out: + cb->args[2] = s_lidx; cb->args[1] = idx; cb->args[0] = h;