From patchwork Fri Dec 15 18:27:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 849352 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="IFeg56C/"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yyzTB342Jz9sBW for ; Sat, 16 Dec 2017 05:28:30 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755593AbdLOS22 (ORCPT ); Fri, 15 Dec 2017 13:28:28 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:37071 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755718AbdLOS2Y (ORCPT ); Fri, 15 Dec 2017 13:28:24 -0500 Received: by mail-pg0-f66.google.com with SMTP id y6so6326069pgp.4 for ; Fri, 15 Dec 2017 10:28:24 -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=jwT+TnJm6MIjhfEezGe/IPzlPxZo7MRK4Um1X8VcOtg=; b=IFeg56C/66/It+hD8KEt/ky/5v+l58vOgzXqbsZw3dYdHwMbUz7RAqD89cXB+qpoPH vQ2adGSXuDbR+ciFkJ3nJq71BQb18SGybcOlshq9NUT5uefdg7TE4lYaN9Eexsh+o7zH GW5V9tWl2TQTAh98gHEdiYl53dnOhSmWgoesDq2sKQJkVfRGGJGVW7vFg2vkcXx65k4c 4aGTjByyFFvyui62F1T/iIORzImKoGGDtZKSrRpCa4ALV7JzZlFQ8F0VSCO7Pd9caQwe nxOAYkiXnWszukuL4RXqRmvaBDEGG4Yne9wgB5gxsC/vSG7WDjd8iCQehxGmFLALwC70 qPIA== 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=jwT+TnJm6MIjhfEezGe/IPzlPxZo7MRK4Um1X8VcOtg=; b=XXlcqKEtaje1iNff4NtXXYz8YwAkUztC3TxzyOZ5G1tTGyYGgsPeTFpaztLRJ2p2U5 SMJhA8fIo68ejsy2kz3KlVLvx7qhI4Fj03BSP8BqYu1UmRJQYLrWzViQK11wjEdBH6ej bI/kTwwOvkiskxvHvv4sH6HF+toZvKCRGlfo5cX2IRVkFY6zF6BLeZ7qlnF/hGMd6IUj 7dPIK7mZhE07atsyU3idcTyynsO+hX+nIXsI9T2mqyYwW1mw4j49jUmPjb0In58cbXV3 QSnOeReM59bpZjnmWxWNfcL6is0RHo3lL2tEtU6TjseN7TGz/P8ggzsnxtdN4efL2ldA +Imw== X-Gm-Message-State: AKGB3mJU4hTw7JyT9L7nXMwoTpY0FDYnCzpmkbLR7S7mb1gVFbmIVcsR a4bz5R9x6xO/So/58ttwWf84bZmg X-Google-Smtp-Source: ACJfBouvVhaBTWFG7/H5sV60oaxJdTjIIxWAjWaoAkGoyLaChe7N+Vgt6wksu4e3Xhw4nT4yQo0G6Q== X-Received: by 10.98.213.71 with SMTP id d68mr13888412pfg.171.1513362504346; Fri, 15 Dec 2017 10:28:24 -0800 (PST) Received: from localhost.localdomain (67-207-98-108.static.wiline.com. [67.207.98.108]) by smtp.gmail.com with ESMTPSA id 69sm14120903pfj.28.2017.12.15.10.28.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 15 Dec 2017 10:28:23 -0800 (PST) From: Tom Herbert To: davem@davemloft.net Cc: netdev@vger.kernel.org, roopa@cumulusnetworks.com, rohit@quantonium.net, Tom Herbert Subject: [PATCH v4 net-next 2/6] ila: Fix use of rhashtable walk in ila_xlat.c Date: Fri, 15 Dec 2017 10:27:56 -0800 Message-Id: <20171215182800.10248-3-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171215182800.10248-1-tom@quantonium.net> References: <20171215182800.10248-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 missed 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 | 70 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/net/ipv6/ila/ila_xlat.c b/net/ipv6/ila/ila_xlat.c index 44c39c5f0638..887dd5b785b5 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,20 +516,45 @@ 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 entry */ + ila = rhashtable_walk_peek(rhiter); + + if (ila && !IS_ERR(ila) && skip) { + /* Skip over visited entries */ + + while (ila && skip) { + /* Skip over any ila entries in this list that we + * have already dumped. + */ + ila = rcu_access_pointer(ila->next); + skip--; + } + } + skip = 0; + + 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; } @@ -531,15 +563,21 @@ static int ila_nl_dump(struct sk_buff *skb, struct netlink_callback *cb) cb->nlh->nlmsg_seq, NLM_F_MULTI, skb, ILA_CMD_GET); if (ret) - goto done; + goto out; + skip++; ila = rcu_access_pointer(ila->next); } + + skip = 0; + 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; }