From patchwork Fri Dec 15 18:27:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 849356 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="CisAW/WI"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yyzTX1Xr9z9sBW for ; Sat, 16 Dec 2017 05:28:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756320AbdLOS2p (ORCPT ); Fri, 15 Dec 2017 13:28:45 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:37383 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755561AbdLOS2c (ORCPT ); Fri, 15 Dec 2017 13:28:32 -0500 Received: by mail-pf0-f195.google.com with SMTP id n6so6713763pfa.4 for ; Fri, 15 Dec 2017 10:28:31 -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=X7Ovj+WOvHsAQCxHLmWX6FS4WucxSB1gEoHcs4Rqpqk=; b=CisAW/WIk7K6bUfIo0+Gw5qPPjek+a/U/aCepFXl7wcbq9kBHD3hiWFLuHzRTd5iBo qUYmYJwaWYgf7dhMxKRKYvzhFu6l2XvpqJ55VOV+TH53wEHm7RIC4ER83cql91wvXRbI cia43z8MWrFLTthAZa27g1N5hvJCJTUHB52ZNB0OptcTIOE3MROUu2AKRL3cERf3R4Mw j5mEvoZg0hSz1rWuWoHewoA3Vc4g7FxNepJ+PMMf26ZPnK4Kq9sWdBgJvfY8kpilRMvo XCBoXpCUcoeU7QLwd/zUERD77SEZm+QDJ4bU2dTJ8kN8GumPUPdF95nivmYGBOZu7euT ckeQ== 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=X7Ovj+WOvHsAQCxHLmWX6FS4WucxSB1gEoHcs4Rqpqk=; b=t5XN2ZZKHmq8hqaZ8IPDvcuI2fbsqaqxLIabY5c2led85ZNNgKxdN6Mz+MlQ7Lcvll 730adEVSEyz5l/jyW6n1TrFqyPMyMPsJu1QH8cL7k288lgn5An4/xHjPj86FCjA0nucE bObeI5V0wlBiu/duXkslwu/pcXEzBhl93Sl3kj783YaAE61wfwdvnIze5H25NOb1RHjP yvBQbA7BoRhKuBnA/r+uno3TnDDh8Uq4wYPER5EL6e98+g+wvx90UgpbByEc8nAXMkw5 82gFRBBB+FoBLy9Ld7gEL+g4yXuWf6Cg3dFyolSe+5ALYHXfDpjlgA3QF+mQ/dHF1FM3 YYUw== X-Gm-Message-State: AKGB3mIbWmWCHZ+rs8hLP/p4ORDmRAl5l6IEo9BCY7DpSHlqcN4hr60r VbyRmFgSy6yJ86twvNfAyvTKlg== X-Google-Smtp-Source: ACJfBouuSMe4myhTBAqImJAGwqQVyugzM7YsshUYosCywvgo0qYDo3OTalhtYEPJGPpKdeZdmfLzFQ== X-Received: by 10.101.88.201 with SMTP id e9mr12841311pgu.216.1513362511444; Fri, 15 Dec 2017 10:28:31 -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.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 15 Dec 2017 10:28:30 -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 5/6] ila: Flush netlink command to clear xlat table Date: Fri, 15 Dec 2017 10:27:59 -0800 Message-Id: <20171215182800.10248-6-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 Add ILA_CMD_FLUSH netlink command to clear the ILA translation table. Signed-off-by: Tom Herbert --- include/uapi/linux/ila.h | 1 + net/ipv6/ila/ila.h | 1 + net/ipv6/ila/ila_main.c | 6 +++++ net/ipv6/ila/ila_xlat.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 68 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/ila.h b/include/uapi/linux/ila.h index 483b77af4eb8..db45d3e49a12 100644 --- a/include/uapi/linux/ila.h +++ b/include/uapi/linux/ila.h @@ -30,6 +30,7 @@ enum { ILA_CMD_ADD, ILA_CMD_DEL, ILA_CMD_GET, + ILA_CMD_FLUSH, __ILA_CMD_MAX, }; diff --git a/net/ipv6/ila/ila.h b/net/ipv6/ila/ila.h index faba7824ea56..1f747bcbec29 100644 --- a/net/ipv6/ila/ila.h +++ b/net/ipv6/ila/ila.h @@ -123,6 +123,7 @@ void ila_xlat_exit_net(struct net *net); int ila_xlat_nl_cmd_add_mapping(struct sk_buff *skb, struct genl_info *info); int ila_xlat_nl_cmd_del_mapping(struct sk_buff *skb, struct genl_info *info); int ila_xlat_nl_cmd_get_mapping(struct sk_buff *skb, struct genl_info *info); +int ila_xlat_nl_cmd_flush(struct sk_buff *skb, struct genl_info *info); int ila_xlat_nl_dump_start(struct netlink_callback *cb); int ila_xlat_nl_dump_done(struct netlink_callback *cb); int ila_xlat_nl_dump(struct sk_buff *skb, struct netlink_callback *cb); diff --git a/net/ipv6/ila/ila_main.c b/net/ipv6/ila/ila_main.c index f6ac6b14577e..18fac76b9520 100644 --- a/net/ipv6/ila/ila_main.c +++ b/net/ipv6/ila/ila_main.c @@ -27,6 +27,12 @@ static const struct genl_ops ila_nl_ops[] = { .flags = GENL_ADMIN_PERM, }, { + .cmd = ILA_CMD_FLUSH, + .doit = ila_xlat_nl_cmd_flush, + .policy = ila_nl_policy, + .flags = GENL_ADMIN_PERM, + }, + { .cmd = ILA_CMD_GET, .doit = ila_xlat_nl_cmd_get_mapping, .start = ila_xlat_nl_dump_start, diff --git a/net/ipv6/ila/ila_xlat.c b/net/ipv6/ila/ila_xlat.c index d05de891dfb6..51a15ce50a64 100644 --- a/net/ipv6/ila/ila_xlat.c +++ b/net/ipv6/ila/ila_xlat.c @@ -164,9 +164,9 @@ static inline void ila_release(struct ila_map *ila) kfree_rcu(ila, rcu); } -static void ila_free_cb(void *ptr, void *arg) +static void ila_free_node(struct ila_map *ila) { - struct ila_map *ila = (struct ila_map *)ptr, *next; + struct ila_map *next; /* Assume rcu_readlock held */ while (ila) { @@ -176,6 +176,11 @@ static void ila_free_cb(void *ptr, void *arg) } } +static void ila_free_cb(void *ptr, void *arg) +{ + ila_free_node((struct ila_map *)ptr); +} + static int ila_xlat_addr(struct sk_buff *skb, bool sir2ila); static unsigned int @@ -365,6 +370,59 @@ int ila_xlat_nl_cmd_del_mapping(struct sk_buff *skb, struct genl_info *info) return 0; } +static inline spinlock_t *lock_from_ila_map(struct ila_net *ilan, + struct ila_map *ila) +{ + return ila_get_lock(ilan, ila->xp.ip.locator_match); +} + +int ila_xlat_nl_cmd_flush(struct sk_buff *skb, struct genl_info *info) +{ + struct net *net = genl_info_net(info); + struct ila_net *ilan = net_generic(net, ila_net_id); + struct rhashtable_iter iter; + struct ila_map *ila; + spinlock_t *lock; + int ret; + + ret = rhashtable_walk_init(&ilan->xlat.rhash_table, &iter, GFP_KERNEL); + if (ret) + goto done; + + rhashtable_walk_start(&iter); + + for (;;) { + ila = rhashtable_walk_next(&iter); + + if (IS_ERR(ila)) { + if (PTR_ERR(ila) == -EAGAIN) + continue; + ret = PTR_ERR(ila); + goto done; + } else if (!ila) { + break; + } + + lock = lock_from_ila_map(ilan, ila); + + spin_lock(lock); + + ret = rhashtable_remove_fast(&ilan->xlat.rhash_table, + &ila->node, rht_params); + if (!ret) + ila_free_node(ila); + + spin_unlock(lock); + + if (ret) + break; + } + +done: + rhashtable_walk_stop(&iter); + return ret; +} + static int ila_fill_info(struct ila_map *ila, struct sk_buff *msg) { if (nla_put_u64_64bit(msg, ILA_ATTR_LOCATOR,