From patchwork Thu Dec 21 19:33:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 852086 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="iReOqdjI"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z2hf83M1Pz9sMN for ; Fri, 22 Dec 2017 06:34:08 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755422AbdLUTeG (ORCPT ); Thu, 21 Dec 2017 14:34:06 -0500 Received: from mail-pl0-f65.google.com ([209.85.160.65]:44882 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755297AbdLUTeD (ORCPT ); Thu, 21 Dec 2017 14:34:03 -0500 Received: by mail-pl0-f65.google.com with SMTP id n13so11556949plp.11 for ; Thu, 21 Dec 2017 11:34:02 -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=iReOqdjIB6e2YwLs1f0lMGvpb86YZuUgmeV1PTu26BTM7DGmrub6E0SefdJPCGhpkT ZMaWg5h7AGFGUxRUE4ZWe0Y2E6aCLOTLFFFx8rL6h2IKJUfsmpXBT7XDqbrpFBRkdCrP SxKk+NSF31BV43rCzzSfnsGIeOvOGroQml8qcTotL0L7HgC0FlYCQceyGkWCCcoJmpZY eHlEnDKyS+9oJlR3KoOSEBW86ag59hEOw2wcaafRDNuIrMMSOQslGp9MT3WHI6iO7dw+ ea08bDIGp5j1GfSyZNVuCaU0xPPAEIMSc+4E6bLsPuT67GrBowiPV5o+VRL7N/pu6eWT U40A== 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=hir6d0j7JEb8RFXn61L/folkuQbMKTQ7RiI17/XdpsEsDpNVM/FGy29H0wlMxJ/Fnf ZtGwh0ZWfkdEW9QKIWxaVJTszc5VFK5KbBXUmcj3sDl/BUlanDIlCRkqrK4l/HGv+Ijl ZOP+eJPGYwdGBBcyl2FcGDEHAR2TJnp4G/SUrqls99OBTWRAdUZMjc9b6GaP6bOGS+M2 14Ur1XdKfgg5DE2rjUxBBuWPA9WOXbNMQ0xjLF8HUM+QowZ9eU0qYCBysXKip/yNjtwm qWDuRkV3ijK94CKDfxIRIAYXVryC3cmJHJ0oW0gUlML5kMackXxKYOadsApI67Ce+YmV hzSw== X-Gm-Message-State: AKGB3mLoIr7NH2OoffwwfRB9+Oepu6MUUePfYgm1cjw9VFl/KuOz35w8 Rh6htzbuIPEGNJDvNxWd8GxLdg== X-Google-Smtp-Source: ACJfBos4dPFGcaKl7wCcDQ5BcgCyWoSRC7PJNMgbVy0k+y7Rmc6O6X4xABECHtdlqdtIrSf2/uE53w== X-Received: by 10.159.235.143 with SMTP id f15mr11358206plr.56.1513884842514; Thu, 21 Dec 2017 11:34:02 -0800 (PST) Received: from localhost.localdomain (c-73-162-13-107.hsd1.ca.comcast.net. [73.162.13.107]) by smtp.gmail.com with ESMTPSA id p126sm35384464pga.58.2017.12.21.11.34.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 21 Dec 2017 11:34:01 -0800 (PST) From: Tom Herbert To: davem@davemloft.net Cc: netdev@vger.kernel.org, roopa@cumulusnetworks.com, rohit@quantonium.net, Tom Herbert Subject: [PATCH v5 net-next 3/7] ila: Fix use of rhashtable walk in ila_xlat.c Date: Thu, 21 Dec 2017 11:33:28 -0800 Message-Id: <20171221193332.15303-4-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171221193332.15303-1-tom@quantonium.net> References: <20171221193332.15303-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; }