From patchwork Mon Dec 11 20:38:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 847212 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=quantonium-net.20150623.gappssmtp.com header.i=@quantonium-net.20150623.gappssmtp.com header.b="tx+kAO8+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3ywZYs6WNZz9sRm for ; Tue, 12 Dec 2017 07:39:13 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752523AbdLKUjK (ORCPT ); Mon, 11 Dec 2017 15:39:10 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:42425 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752486AbdLKUjG (ORCPT ); Mon, 11 Dec 2017 15:39:06 -0500 Received: by mail-pg0-f65.google.com with SMTP id e14so11752601pgr.9 for ; Mon, 11 Dec 2017 12:39:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MdSMg6wf/qqmk1ij2DZfJmFZFwIKVZ3R/K55gFoVw+o=; b=tx+kAO8+w5hQsWYnGyBwa9oFhNs8mpQcZgRQ/zESxPU29/KMgRhXz9yd0tlGnRFPHl XkMRD3osVIXP5D3vC94kLsjCYNXy2Ox8rrm5v7UkBW9E/RA77Guk6/8GWB075XfTaq2O M6gdTTmsmOWe6WO7jGnKUN8X+t+fCnKyb0myZS3vwcrS0+ICFYXnhu7aXTcAil8Sklet Co4zpX9cAgXV49ynLKka9oWtMuhDnMQzF3wbeoy7ChmfCnAQhiQDtgk4kjtopobAXl1g +bHcFSRWkomAehkfeHAo0FdidBy+Zy3Ll8IIIy2hcs73NG1lTGtgKPgqn+mAPYNqjI1M mewQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MdSMg6wf/qqmk1ij2DZfJmFZFwIKVZ3R/K55gFoVw+o=; b=Rv0X6l+Ocy49RNJYmm6FT4aAUT1LMzoiAKLgkwIVOyii0r4cORUeynRF53MzMj8kEC LVpgzC1Ch7vUW5qZWQCvJaVJKxKLY2qxOy3q8O0djWeMcnaHTZ7TmVugPv8uz+Ldspvz nKxQ/S3ZWLPMb1gpHqOysL0WM99BXY0hg/Jsh6VUtOJ8HmIwONWGV22qrtVCIOD9EIEB fxlPfjRWZiQJ9rs26qUSbuyGnDu5UXXVpVieF9Xcu9GV0/AnwJ2BHhmyqUMQOSKe78MN QSm/2aoTlBBb6g2DefBY5ha9EuOUofoo76Cy/Dn3Vh5aqQ2x//DxAC+Mew0EVDdy6S8S ZqFQ== X-Gm-Message-State: AKGB3mKCqVssFZNwh2TjC/0eUQCij8i/XjJ77xXjFqKRWRNz2w+hL2y5 /xEzp1g4lEKVERFieKTh9q3H2A== X-Google-Smtp-Source: ACJfBosiowGRODZ8aB4chxbZHfjISqxEV9aMJpkNxJgtFuVZ9z8I27gExa0f//mt2B3bfyb+K9fjgQ== X-Received: by 10.84.238.136 with SMTP id v8mr1505271plk.381.1513024745495; Mon, 11 Dec 2017 12:39:05 -0800 (PST) Received: from localhost.localdomain (67-207-98-108.static.wiline.com. [67.207.98.108]) by smtp.gmail.com with ESMTPSA id t6sm26426790pfl.76.2017.12.11.12.39.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 12:39:04 -0800 (PST) From: Tom Herbert To: davem@davemloft.net Cc: netdev@vger.kernel.org, roopa@cumulusnetworks.com, rohit@quantonium.net, Tom Herbert Subject: [PATCH v3 net-next 2/9] ila: Fix use of rhashtable walk in ila_xlat.c Date: Mon, 11 Dec 2017 12:38:30 -0800 Message-Id: <20171211203837.2540-3-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171211203837.2540-1-tom@quantonium.net> References: <20171211203837.2540-1-tom@quantonium.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Perform better EAGAIN handling, handle case where ila_dump_info fails and we miss mis objects in the dump, and add a skip index to skip over ila entires in a list on a rhashtable node that have already been visited (by a previous call to ila_nl_dump). Signed-off-by: Tom Herbert --- net/ipv6/ila/ila_xlat.c | 60 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/net/ipv6/ila/ila_xlat.c b/net/ipv6/ila/ila_xlat.c index 44c39c5f0638..9fca75b9cab3 100644 --- a/net/ipv6/ila/ila_xlat.c +++ b/net/ipv6/ila/ila_xlat.c @@ -474,24 +474,31 @@ static int ila_nl_cmd_get_mapping(struct sk_buff *skb, struct genl_info *info) struct ila_dump_iter { struct rhashtable_iter rhiter; + int skip; }; static int ila_nl_dump_start(struct netlink_callback *cb) { struct net *net = sock_net(cb->skb->sk); struct ila_net *ilan = net_generic(net, ila_net_id); - struct ila_dump_iter *iter = (struct ila_dump_iter *)cb->args[0]; + struct ila_dump_iter *iter; + int ret; - if (!iter) { - iter = kmalloc(sizeof(*iter), GFP_KERNEL); - if (!iter) - return -ENOMEM; + iter = kmalloc(sizeof(*iter), GFP_KERNEL); + if (!iter) + return -ENOMEM; - cb->args[0] = (long)iter; + ret = rhashtable_walk_init(&ilan->rhash_table, &iter->rhiter, + GFP_KERNEL); + if (ret) { + kfree(iter); + return ret; } - return rhashtable_walk_init(&ilan->rhash_table, &iter->rhiter, - GFP_KERNEL); + iter->skip = 0; + cb->args[0] = (long)iter; + + return ret; } static int ila_nl_dump_done(struct netlink_callback *cb) @@ -509,37 +516,58 @@ static int ila_nl_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct ila_dump_iter *iter = (struct ila_dump_iter *)cb->args[0]; struct rhashtable_iter *rhiter = &iter->rhiter; + int skip = iter->skip; struct ila_map *ila; int ret; rhashtable_walk_start(rhiter); - for (;;) { - ila = rhashtable_walk_next(rhiter); + /* Get first entty */ + ila = rhashtable_walk_peek(rhiter); + for (;;) { if (IS_ERR(ila)) { - if (PTR_ERR(ila) == -EAGAIN) - continue; ret = PTR_ERR(ila); - goto done; + if (ret == -EAGAIN) { + /* Table has changed and iter has reset. Return + * -EAGAIN to the application even if we have + * written data to the skb. The application + * needs to deal with this. + */ + + goto out_ret; + } else { + break; + } } else if (!ila) { + ret = 0; break; } + while (ila && skip) { + /* Skip over any ila entries in this list that we + * have already dumped. + */ + ila = rcu_access_pointer(ila->next); + skip--; + } while (ila) { ret = ila_dump_info(ila, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, NLM_F_MULTI, skb, ILA_CMD_GET); if (ret) - goto done; + goto out; ila = rcu_access_pointer(ila->next); } + ila = rhashtable_walk_next(rhiter); } - ret = skb->len; +out: + iter->skip = skip; + ret = (skb->len ? : ret); -done: +out_ret: rhashtable_walk_stop(rhiter); return ret; }