get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/818167/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 818167,
    "url": "http://patchwork.ozlabs.org/api/patches/818167/?format=api",
    "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=api",
        "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=api",
        "name": "Simon Horman",
        "email": "simon.horman@netronome.com"
    },
    "delegate": {
        "id": 34,
        "url": "http://patchwork.ozlabs.org/api/users/34/?format=api",
        "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=api",
            "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"
    ]
}