{"id":818167,"url":"http://patchwork.ozlabs.org/api/patches/818167/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/1506335021-32024-6-git-send-email-simon.horman@netronome.com/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/projects/7/?format=json","name":"Linux network development","link_name":"netdev","list_id":"netdev.vger.kernel.org","list_email":"netdev@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<1506335021-32024-6-git-send-email-simon.horman@netronome.com>","list_archive_url":null,"date":"2017-09-25T10:23:39","name":"[net-next,5/7] nfp: offload vxlan IPv4 endpoints of flower rules","commit_ref":null,"pull_url":null,"state":"accepted","archived":true,"hash":"5c3fb969b226ae807bd914463f73370a5d240341","submitter":{"id":64714,"url":"http://patchwork.ozlabs.org/api/people/64714/?format=json","name":"Simon Horman","email":"simon.horman@netronome.com"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/1506335021-32024-6-git-send-email-simon.horman@netronome.com/mbox/","series":[{"id":4932,"url":"http://patchwork.ozlabs.org/api/series/4932/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/list/?series=4932","date":"2017-09-25T10:23:34","name":"nfp: flower vxlan tunnel offload","version":1,"mbox":"http://patchwork.ozlabs.org/series/4932/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/818167/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/818167/checks/","tags":{},"related":[],"headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=netronome-com.20150623.gappssmtp.com\n\theader.i=@netronome-com.20150623.gappssmtp.com\n\theader.b=\"z0s63QHG\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y10ZS5nyHz9tX3\n\tfor <patchwork-incoming@ozlabs.org>;\n\tMon, 25 Sep 2017 20:24:48 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S934554AbdIYKYi (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tMon, 25 Sep 2017 06:24:38 -0400","from mail-wr0-f180.google.com ([209.85.128.180]:48399 \"EHLO\n\tmail-wr0-f180.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S934318AbdIYKYH (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Mon, 25 Sep 2017 06:24:07 -0400","by mail-wr0-f180.google.com with SMTP id 108so6901733wra.5\n\tfor <netdev@vger.kernel.org>; Mon, 25 Sep 2017 03:24:06 -0700 (PDT)","from penelope.horms.nl ([217.111.208.18])\n\tby smtp.gmail.com with ESMTPSA id\n\t10sm6816818wrt.59.2017.09.25.03.24.04\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tMon, 25 Sep 2017 03:24:05 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=netronome-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=uuaYM0heuuGOgDy3yDxEedhthXP212DE1fWMfOdIGkc=;\n\tb=z0s63QHGfr3/s0WTqQhspEpL2pRQfWjLZmLJWSiNxzKl4lzAdBY9YmsWT9rGXpZy1z\n\tzZto2D4UOSpgCQsGchXI6HpMqr9b6/88vXXDOXVmG4/Gvbo6o6TB1RI1AChd8viFbYl1\n\txixFR+dR+z7yV9SUn8/0/axGcFneWRMT+OADSpIyFA06PGA/wLuLs3MMwwniw+Ca0oEV\n\tyZzQZm0lhPYzDAqg3gfDq1yvNVsB1qCf7V9A0yZxPRjB6UROqBmnMqn+vbBg5TqgYRke\n\tVbyPq0X/00hk5DOgY4S2xns3Ihd5SDOcmrSQ5PwOaQdNi1ZaGKuZ7s5w7v2DNfEIoGYp\n\tb0TA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=uuaYM0heuuGOgDy3yDxEedhthXP212DE1fWMfOdIGkc=;\n\tb=oB30/kjvhdE8YnlHqwIeyCSM41Nwf9GCJptbITTPLMlqC8agMePVMZI7TDTH2zmPgo\n\tk+kCWPIO/QfXpd0GX1iIJLIAcankMQYgVXDgOhpESi+qpGgwuzRQ5+oFoW3RWoQ56186\n\trXDo70x8J3yOMq2ennb2eIEY+POqeWmOxWRZR3SO7xkkqO/HmQRiY2QRq0rtuqbGt8cx\n\tG8+aDymsLf+uI8u2gstUMNMhoTORbZiRy3S9RZCAgrU8aTPnhujzLfumOwVsaPuBM+YQ\n\tF2tWqiDmjLHzWbLkSCnR6p75EDcBEB0E6FjHxYYErxOkkZ9LhyJu34o5umaugkSEDAYN\n\tFJNw==","X-Gm-Message-State":"AHPjjUitvDa6VR3lJiCh9UHLZhCbvpu3hpm27tRsvf0JUwTV9DaQwnW8\n\tWol2qlmIXHYkfq6WgtrGB+XYzQq50gQ=","X-Google-Smtp-Source":"AOwi7QAQioLI343aJGwiMD6gSic2W3M6iMMG6bTDhTdKokvwDhEnPkorV1VmJgMfxkjMjAP8nDmj7Q==","X-Received":"by 10.223.197.72 with SMTP id s8mr6439581wrf.120.1506335045690; \n\tMon, 25 Sep 2017 03:24:05 -0700 (PDT)","From":"Simon Horman <simon.horman@netronome.com>","To":"David Miller <davem@davemloft.net>,\n\tJakub Kicinski <jakub.kicinski@netronome.com>","Cc":"netdev@vger.kernel.org, oss-drivers@netronome.com,\n\tJohn Hurley <john.hurley@netronome.com>,\n\tSimon Horman <simon.horman@netronome.com>","Subject":"[PATCH net-next 5/7] nfp: offload vxlan IPv4 endpoints of flower\n\trules","Date":"Mon, 25 Sep 2017 12:23:39 +0200","Message-Id":"<1506335021-32024-6-git-send-email-simon.horman@netronome.com>","X-Mailer":"git-send-email 2.1.4","In-Reply-To":"<1506335021-32024-1-git-send-email-simon.horman@netronome.com>","References":"<1506335021-32024-1-git-send-email-simon.horman@netronome.com>","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"From: John Hurley <john.hurley@netronome.com>\n\nMaintain a list of IPv4 addresses used as the tunnel destination IP match\nfields in currently active flower rules. Offload the entire list of\nNFP_FL_IPV4_ADDRS_MAX (even if some are unused) when new IPs are added or\nremoved. The NFP should only be aware of tunnel end points that are\ncurrently used by rules on the device\n\nSigned-off-by: John Hurley <john.hurley@netronome.com>\nReviewed-by: Simon Horman <simon.horman@netronome.com>\nSigned-off-by: Simon Horman <simon.horman@netronome.com>\n---\n drivers/net/ethernet/netronome/nfp/flower/cmsg.h   |   1 +\n drivers/net/ethernet/netronome/nfp/flower/main.h   |   7 ++\n drivers/net/ethernet/netronome/nfp/flower/match.c  |  14 ++-\n .../net/ethernet/netronome/nfp/flower/offload.c    |   4 +\n .../ethernet/netronome/nfp/flower/tunnel_conf.c    | 120 +++++++++++++++++++++\n 5 files changed, 143 insertions(+), 3 deletions(-)","diff":"diff --git a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h\nindex dc248193c996..6540bb1ceefb 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h\n+++ b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h\n@@ -318,6 +318,7 @@ enum nfp_flower_cmsg_type_port {\n \tNFP_FLOWER_CMSG_TYPE_MAC_REPR =\t\t7,\n \tNFP_FLOWER_CMSG_TYPE_PORT_MOD =\t\t8,\n \tNFP_FLOWER_CMSG_TYPE_TUN_MAC =\t\t11,\n+\tNFP_FLOWER_CMSG_TYPE_TUN_IPS =\t\t14,\n \tNFP_FLOWER_CMSG_TYPE_FLOW_STATS =\t15,\n \tNFP_FLOWER_CMSG_TYPE_PORT_ECHO =\t16,\n \tNFP_FLOWER_CMSG_TYPE_MAX =\t\t32,\ndiff --git a/drivers/net/ethernet/netronome/nfp/flower/main.h b/drivers/net/ethernet/netronome/nfp/flower/main.h\nindex 9de375acc254..53306af6cfe8 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/main.h\n+++ b/drivers/net/ethernet/netronome/nfp/flower/main.h\n@@ -86,8 +86,10 @@ struct nfp_fl_stats_id {\n  * @cmsg_skbs:\t\tList of skbs for control message processing\n  * @nfp_mac_off_list:\tList of MAC addresses to offload\n  * @nfp_mac_index_list:\tList of unique 8-bit indexes for non NFP netdevs\n+ * @nfp_ipv4_off_list:\tList of IPv4 addresses to offload\n  * @nfp_mac_off_lock:\tLock for the MAC address list\n  * @nfp_mac_index_lock:\tLock for the MAC index list\n+ * @nfp_ipv4_off_lock:\tLock for the IPv4 address list\n  * @nfp_mac_off_ids:\tIDA to manage id assignment for offloaded macs\n  * @nfp_mac_off_count:\tNumber of MACs in address list\n  * @nfp_tun_mac_nb:\tNotifier to monitor link state\n@@ -105,8 +107,10 @@ struct nfp_flower_priv {\n \tstruct sk_buff_head cmsg_skbs;\n \tstruct list_head nfp_mac_off_list;\n \tstruct list_head nfp_mac_index_list;\n+\tstruct list_head nfp_ipv4_off_list;\n \tstruct mutex nfp_mac_off_lock;\n \tstruct mutex nfp_mac_index_lock;\n+\tstruct mutex nfp_ipv4_off_lock;\n \tstruct ida nfp_mac_off_ids;\n \tint nfp_mac_off_count;\n \tstruct notifier_block nfp_tun_mac_nb;\n@@ -142,6 +146,7 @@ struct nfp_fl_payload {\n \tstruct rcu_head rcu;\n \tspinlock_t lock; /* lock stats */\n \tstruct nfp_fl_stats stats;\n+\t__be32 nfp_tun_ipv4_addr;\n \tchar *unmasked_data;\n \tchar *mask_data;\n \tchar *action_data;\n@@ -182,5 +187,7 @@ void nfp_flower_rx_flow_stats(struct nfp_app *app, struct sk_buff *skb);\n int nfp_tunnel_config_start(struct nfp_app *app);\n void nfp_tunnel_config_stop(struct nfp_app *app);\n void nfp_tunnel_write_macs(struct nfp_app *app);\n+void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4);\n+void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4);\n \n #endif\ndiff --git a/drivers/net/ethernet/netronome/nfp/flower/match.c b/drivers/net/ethernet/netronome/nfp/flower/match.c\nindex cb3ff6c126e8..865a815ab92a 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/match.c\n+++ b/drivers/net/ethernet/netronome/nfp/flower/match.c\n@@ -195,7 +195,7 @@ nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,\n static void\n nfp_flower_compile_vxlan(struct nfp_flower_vxlan *frame,\n \t\t\t struct tc_cls_flower_offload *flow,\n-\t\t\t bool mask_version)\n+\t\t\t bool mask_version, __be32 *tun_dst)\n {\n \tstruct fl_flow_key *target = mask_version ? flow->mask : flow->key;\n \tstruct flow_dissector_key_ipv4_addrs *vxlan_ips;\n@@ -223,6 +223,7 @@ nfp_flower_compile_vxlan(struct nfp_flower_vxlan *frame,\n \t\t\t\t\t     target);\n \t\tframe->ip_src = vxlan_ips->src;\n \t\tframe->ip_dst = vxlan_ips->dst;\n+\t\t*tun_dst = vxlan_ips->dst;\n \t}\n }\n \n@@ -232,6 +233,7 @@ int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,\n \t\t\t\t  struct nfp_fl_payload *nfp_flow)\n {\n \tenum nfp_flower_tun_type tun_type = NFP_FL_TUNNEL_NONE;\n+\t__be32 tun_dst, tun_dst_mask = 0;\n \tstruct nfp_repr *netdev_repr;\n \tint err;\n \tu8 *ext;\n@@ -336,10 +338,10 @@ int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,\n \tif (key_ls->key_layer & NFP_FLOWER_LAYER_VXLAN) {\n \t\t/* Populate Exact VXLAN Data. */\n \t\tnfp_flower_compile_vxlan((struct nfp_flower_vxlan *)ext,\n-\t\t\t\t\t flow, false);\n+\t\t\t\t\t flow, false, &tun_dst);\n \t\t/* Populate Mask VXLAN Data. */\n \t\tnfp_flower_compile_vxlan((struct nfp_flower_vxlan *)msk,\n-\t\t\t\t\t flow, true);\n+\t\t\t\t\t flow, true, &tun_dst_mask);\n \t\text += sizeof(struct nfp_flower_vxlan);\n \t\tmsk += sizeof(struct nfp_flower_vxlan);\n \n@@ -347,6 +349,12 @@ int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,\n \t\tif (nfp_netdev_is_nfp_repr(netdev)) {\n \t\t\tnetdev_repr = netdev_priv(netdev);\n \t\t\tnfp_tunnel_write_macs(netdev_repr->app);\n+\n+\t\t\t/* Store the tunnel destination in the rule data.\n+\t\t\t * This must be present and be an exact match.\n+\t\t\t */\n+\t\t\tnfp_flow->nfp_tun_ipv4_addr = tun_dst;\n+\t\t\tnfp_tunnel_add_ipv4_off(netdev_repr->app, tun_dst);\n \t\t}\n \t}\n \ndiff --git a/drivers/net/ethernet/netronome/nfp/flower/offload.c b/drivers/net/ethernet/netronome/nfp/flower/offload.c\nindex 637372ba8f55..3d9537ebdea4 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/offload.c\n+++ b/drivers/net/ethernet/netronome/nfp/flower/offload.c\n@@ -306,6 +306,7 @@ nfp_flower_allocate_new(struct nfp_fl_key_ls *key_layer)\n \tif (!flow_pay->action_data)\n \t\tgoto err_free_mask;\n \n+\tflow_pay->nfp_tun_ipv4_addr = 0;\n \tflow_pay->meta.flags = 0;\n \tspin_lock_init(&flow_pay->lock);\n \n@@ -415,6 +416,9 @@ nfp_flower_del_offload(struct nfp_app *app, struct net_device *netdev,\n \tif (err)\n \t\tgoto err_free_flow;\n \n+\tif (nfp_flow->nfp_tun_ipv4_addr)\n+\t\tnfp_tunnel_del_ipv4_off(app, nfp_flow->nfp_tun_ipv4_addr);\n+\n \terr = nfp_flower_xmit_flow(netdev, nfp_flow,\n \t\t\t\t   NFP_FLOWER_CMSG_TYPE_FLOW_DEL);\n \tif (err)\ndiff --git a/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c b/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c\nindex 34be85803020..185505140f5e 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c\n+++ b/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c\n@@ -32,6 +32,7 @@\n  */\n \n #include <linux/etherdevice.h>\n+#include <linux/inetdevice.h>\n #include <linux/idr.h>\n #include <net/dst_metadata.h>\n \n@@ -40,6 +41,30 @@\n #include \"../nfp_net_repr.h\"\n #include \"../nfp_net.h\"\n \n+#define NFP_FL_IPV4_ADDRS_MAX        32\n+\n+/**\n+ * struct nfp_tun_ipv4_addr - set the IP address list on the NFP\n+ * @count:\tnumber of IPs populated in the array\n+ * @ipv4_addr:\tarray of IPV4_ADDRS_MAX 32 bit IPv4 addresses\n+ */\n+struct nfp_tun_ipv4_addr {\n+\t__be32 count;\n+\t__be32 ipv4_addr[NFP_FL_IPV4_ADDRS_MAX];\n+};\n+\n+/**\n+ * struct nfp_ipv4_addr_entry - cached IPv4 addresses\n+ * @ipv4_addr:\tIP address\n+ * @ref_count:\tnumber of rules currently using this IP\n+ * @list:\tlist pointer\n+ */\n+struct nfp_ipv4_addr_entry {\n+\t__be32 ipv4_addr;\n+\tint ref_count;\n+\tstruct list_head list;\n+};\n+\n /**\n  * struct nfp_tun_mac_addr - configure MAC address of tunnel EP on NFP\n  * @reserved:\treserved for future use\n@@ -112,6 +137,87 @@ nfp_flower_xmit_tun_conf(struct nfp_app *app, u8 mtype, u16 plen, void *pdata)\n \treturn 0;\n }\n \n+static void nfp_tun_write_ipv4_list(struct nfp_app *app)\n+{\n+\tstruct nfp_flower_priv *priv = app->priv;\n+\tstruct nfp_ipv4_addr_entry *entry;\n+\tstruct nfp_tun_ipv4_addr payload;\n+\tstruct list_head *ptr, *storage;\n+\tint count;\n+\n+\tmemset(&payload, 0, sizeof(struct nfp_tun_ipv4_addr));\n+\tmutex_lock(&priv->nfp_ipv4_off_lock);\n+\tcount = 0;\n+\tlist_for_each_safe(ptr, storage, &priv->nfp_ipv4_off_list) {\n+\t\tif (count >= NFP_FL_IPV4_ADDRS_MAX) {\n+\t\t\tmutex_unlock(&priv->nfp_ipv4_off_lock);\n+\t\t\tnfp_flower_cmsg_warn(app, \"IPv4 offload exceeds limit.\\n\");\n+\t\t\treturn;\n+\t\t}\n+\t\tentry = list_entry(ptr, struct nfp_ipv4_addr_entry, list);\n+\t\tpayload.ipv4_addr[count++] = entry->ipv4_addr;\n+\t}\n+\tpayload.count = cpu_to_be32(count);\n+\tmutex_unlock(&priv->nfp_ipv4_off_lock);\n+\n+\tnfp_flower_xmit_tun_conf(app, NFP_FLOWER_CMSG_TYPE_TUN_IPS,\n+\t\t\t\t sizeof(struct nfp_tun_ipv4_addr),\n+\t\t\t\t &payload);\n+}\n+\n+void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4)\n+{\n+\tstruct nfp_flower_priv *priv = app->priv;\n+\tstruct nfp_ipv4_addr_entry *entry;\n+\tstruct list_head *ptr, *storage;\n+\n+\tmutex_lock(&priv->nfp_ipv4_off_lock);\n+\tlist_for_each_safe(ptr, storage, &priv->nfp_ipv4_off_list) {\n+\t\tentry = list_entry(ptr, struct nfp_ipv4_addr_entry, list);\n+\t\tif (entry->ipv4_addr == ipv4) {\n+\t\t\tentry->ref_count++;\n+\t\t\tmutex_unlock(&priv->nfp_ipv4_off_lock);\n+\t\t\treturn;\n+\t\t}\n+\t}\n+\n+\tentry = kmalloc(sizeof(*entry), GFP_KERNEL);\n+\tif (!entry) {\n+\t\tmutex_unlock(&priv->nfp_ipv4_off_lock);\n+\t\tnfp_flower_cmsg_warn(app, \"Mem error when offloading IP address.\\n\");\n+\t\treturn;\n+\t}\n+\tentry->ipv4_addr = ipv4;\n+\tentry->ref_count = 1;\n+\tlist_add_tail(&entry->list, &priv->nfp_ipv4_off_list);\n+\tmutex_unlock(&priv->nfp_ipv4_off_lock);\n+\n+\tnfp_tun_write_ipv4_list(app);\n+}\n+\n+void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4)\n+{\n+\tstruct nfp_flower_priv *priv = app->priv;\n+\tstruct nfp_ipv4_addr_entry *entry;\n+\tstruct list_head *ptr, *storage;\n+\n+\tmutex_lock(&priv->nfp_ipv4_off_lock);\n+\tlist_for_each_safe(ptr, storage, &priv->nfp_ipv4_off_list) {\n+\t\tentry = list_entry(ptr, struct nfp_ipv4_addr_entry, list);\n+\t\tif (entry->ipv4_addr == ipv4) {\n+\t\t\tentry->ref_count--;\n+\t\t\tif (!entry->ref_count) {\n+\t\t\t\tlist_del(&entry->list);\n+\t\t\t\tkfree(entry);\n+\t\t\t}\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\tmutex_unlock(&priv->nfp_ipv4_off_lock);\n+\n+\tnfp_tun_write_ipv4_list(app);\n+}\n+\n void nfp_tunnel_write_macs(struct nfp_app *app)\n {\n \tstruct nfp_flower_priv *priv = app->priv;\n@@ -324,6 +430,10 @@ int nfp_tunnel_config_start(struct nfp_app *app)\n \tINIT_LIST_HEAD(&priv->nfp_mac_index_list);\n \tida_init(&priv->nfp_mac_off_ids);\n \n+\t/* Initialise priv data for IPv4 offloading. */\n+\tmutex_init(&priv->nfp_ipv4_off_lock);\n+\tINIT_LIST_HEAD(&priv->nfp_ipv4_off_list);\n+\n \terr = register_netdevice_notifier(&priv->nfp_tun_mac_nb);\n \tif (err)\n \t\tgoto err_free_mac_ida;\n@@ -346,6 +456,7 @@ void nfp_tunnel_config_stop(struct nfp_app *app)\n \tstruct nfp_tun_mac_offload_entry *mac_entry;\n \tstruct nfp_flower_priv *priv = app->priv;\n \tstruct nfp_tun_mac_non_nfp_idx *mac_idx;\n+\tstruct nfp_ipv4_addr_entry *ip_entry;\n \tstruct list_head *ptr, *storage;\n \n \tunregister_netdevice_notifier(&priv->nfp_tun_mac_nb);\n@@ -371,4 +482,13 @@ void nfp_tunnel_config_stop(struct nfp_app *app)\n \tmutex_unlock(&priv->nfp_mac_index_lock);\n \n \tida_destroy(&priv->nfp_mac_off_ids);\n+\n+\t/* Free any memory that may be occupied by ipv4 list. */\n+\tmutex_lock(&priv->nfp_ipv4_off_lock);\n+\tlist_for_each_safe(ptr, storage, &priv->nfp_ipv4_off_list) {\n+\t\tip_entry = list_entry(ptr, struct nfp_ipv4_addr_entry, list);\n+\t\tlist_del(&ip_entry->list);\n+\t\tkfree(ip_entry);\n+\t}\n+\tmutex_unlock(&priv->nfp_ipv4_off_lock);\n }\n","prefixes":["net-next","5/7"]}