get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 809190,
    "url": "http://patchwork.ozlabs.org/api/patches/809190/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170903012605.7435-2-jakub.kicinski@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": "<20170903012605.7435-2-jakub.kicinski@netronome.com>",
    "list_archive_url": null,
    "date": "2017-09-03T01:26:00",
    "name": "[net-next,1/6] nfp: separate app vNIC init/clean from alloc/free",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "9b9dc7c434be9030ee000edf610f11c60bab5c23",
    "submitter": {
        "id": 67484,
        "url": "http://patchwork.ozlabs.org/api/people/67484/?format=api",
        "name": "Jakub Kicinski",
        "email": "jakub.kicinski@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/20170903012605.7435-2-jakub.kicinski@netronome.com/mbox/",
    "series": [
        {
            "id": 1191,
            "url": "http://patchwork.ozlabs.org/api/series/1191/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=1191",
            "date": "2017-09-03T01:26:03",
            "name": "nfp: refactor app init, and minor flower fixes",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/1191/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/809190/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/809190/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=\"UdfZcIN0\"; dkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xlFgm0PMCz9sPk\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSun,  3 Sep 2017 11:26:44 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1753019AbdICB0l (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tSat, 2 Sep 2017 21:26:41 -0400",
            "from mail-pg0-f41.google.com ([74.125.83.41]:35662 \"EHLO\n\tmail-pg0-f41.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752952AbdICB0O (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Sat, 2 Sep 2017 21:26:14 -0400",
            "by mail-pg0-f41.google.com with SMTP id 63so9891469pgc.2\n\tfor <netdev@vger.kernel.org>; Sat, 02 Sep 2017 18:26:14 -0700 (PDT)",
            "from jkicinski-Precision-T1700.netronome.com ([75.53.12.129])\n\tby smtp.gmail.com with ESMTPSA id\n\tb187sm5180400pfg.133.2017.09.02.18.26.13\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tSat, 02 Sep 2017 18:26:13 -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=ystPk9DGDvQYTvM2/LDf/xVInVSUk4tHMRDbVBb1/1E=;\n\tb=UdfZcIN0jxf3HJCCOOggfOE4DkZ9YfKZumbgAVwaxXjnsVgm1xN2exCn3eDQouv/BP\n\tP35zkEerhlVRVW3hUIRKxoev23sEPCuvH2Nnp1Yzp7ZUs9lps/kVLKTYZpb7myGzfABF\n\tthcxQ0jFXcB/I1DxJW6rxmh1Bqn6qToGzKaHISDTHM9QxmS+VeVf3y1NEjOtB/EfbOi5\n\t5isNQ7fzbsASo1bb2HYkvRcgVVRfZ1B0sCKcEgwYRKygqGBt5N5JGEhWJlVQhrfuNU+R\n\tBxbTWjG7Fee4oD613oubmleg0Au6viIdulE0uTZqhjqV4Ecoa2c9aZXVciIjIEXgFQjE\n\tLQ/A==",
        "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=ystPk9DGDvQYTvM2/LDf/xVInVSUk4tHMRDbVBb1/1E=;\n\tb=WviSKvg4XuhaVyoEN5rwpWgb2aXbC66mdZP3n6wvPArazk5t2+DhHhg+h3CHlkHG2T\n\txYmlx2aTh7/S8ZYHryeRSsgl6yvIApXbkrzd8niIMfFO7R8qt+iOfmmeisK30lVuGugi\n\tkE0W27buj1VpIT4PhyCvIyJOTT25N6Bj5knXfSEdtc19vEps/YfZT8zKyZS82bKz60aZ\n\t7kFP0FBDQ/4Ekn7O7OUKvPChraiHd9aaRIRiMahYKX1Ld4iBSZ6ULVX00QucVkhE8GwA\n\thqabLex/JZPKRRxi49FfPXN01IoddvoNSHyR3EuphSSRcYdQMkA3lUoAfapGgAoGkUup\n\tmXzQ==",
        "X-Gm-Message-State": "AHPjjUi31Wo9VWzT81/gTP7M5uUmuP1xUtyBacbMVyaRIgM5lqbd4dlF\n\teCvwpXgA3mE2dC1CZ+k=",
        "X-Google-Smtp-Source": "ADKCNb4LGpFnJmJDLosmi9JbBoDZTQ6+ZT9skOGgYm6v4Y3VUruwHUXlDKQhSoxRk5zFP7uIL1fWtw==",
        "X-Received": "by 10.84.133.6 with SMTP id 6mr8140216plf.128.1504401973738;\n\tSat, 02 Sep 2017 18:26:13 -0700 (PDT)",
        "From": "Jakub Kicinski <jakub.kicinski@netronome.com>",
        "To": "netdev@vger.kernel.org",
        "Cc": "oss-drivers@netronome.com, Jakub Kicinski <jakub.kicinski@netronome.com>",
        "Subject": "[PATCH net-next 1/6] nfp: separate app vNIC init/clean from\n\talloc/free",
        "Date": "Sat,  2 Sep 2017 18:26:00 -0700",
        "Message-Id": "<20170903012605.7435-2-jakub.kicinski@netronome.com>",
        "X-Mailer": "git-send-email 2.14.1",
        "In-Reply-To": "<20170903012605.7435-1-jakub.kicinski@netronome.com>",
        "References": "<20170903012605.7435-1-jakub.kicinski@netronome.com>",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "We currently only have one app callback for vNIC creation\nand destruction.  This is insufficient, because some actions\nhave to be taken before netdev is registered, after it's\nregistered and after it's unregistered.  Old callbacks\nwere really corresponding to alloc/free actions.  Rename\nthem and add proper init/clean.  Apps using representors\nwill be able to use new callbacks to manage lifetime of\nupper devices.\n\nSigned-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>\nReviewed-by: Simon Horman <simon.horman@netronome.com>\n---\n drivers/net/ethernet/netronome/nfp/bpf/main.c     | 10 +++----\n drivers/net/ethernet/netronome/nfp/flower/cmsg.c  |  2 +-\n drivers/net/ethernet/netronome/nfp/flower/main.c  | 27 +++++++++++++----\n drivers/net/ethernet/netronome/nfp/flower/main.h  |  2 ++\n drivers/net/ethernet/netronome/nfp/nfp_app.c      |  2 +-\n drivers/net/ethernet/netronome/nfp/nfp_app.h      | 35 +++++++++++++++++------\n drivers/net/ethernet/netronome/nfp/nfp_app_nic.c  |  4 +--\n drivers/net/ethernet/netronome/nfp/nfp_net_main.c | 16 +++++++++--\n drivers/net/ethernet/netronome/nfp/nic/main.c     |  2 +-\n 9 files changed, 73 insertions(+), 27 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c\nindex f4de3a7377b0..be2cf10a2cd7 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/main.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c\n@@ -84,7 +84,7 @@ static const char *nfp_bpf_extra_cap(struct nfp_app *app, struct nfp_net *nn)\n }\n \n static int\n-nfp_bpf_vnic_init(struct nfp_app *app, struct nfp_net *nn, unsigned int id)\n+nfp_bpf_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id)\n {\n \tstruct nfp_net_bpf_priv *priv;\n \tint ret;\n@@ -106,14 +106,14 @@ nfp_bpf_vnic_init(struct nfp_app *app, struct nfp_net *nn, unsigned int id)\n \tsetup_timer(&priv->rx_filter_stats_timer,\n \t\t    nfp_net_filter_stats_timer, (unsigned long)nn);\n \n-\tret = nfp_app_nic_vnic_init(app, nn, id);\n+\tret = nfp_app_nic_vnic_alloc(app, nn, id);\n \tif (ret)\n \t\tkfree(priv);\n \n \treturn ret;\n }\n \n-static void nfp_bpf_vnic_clean(struct nfp_app *app, struct nfp_net *nn)\n+static void nfp_bpf_vnic_free(struct nfp_app *app, struct nfp_net *nn)\n {\n \tif (nn->dp.bpf_offload_xdp)\n \t\tnfp_bpf_xdp_offload(app, nn, NULL);\n@@ -149,8 +149,8 @@ const struct nfp_app_type app_bpf = {\n \n \t.extra_cap\t= nfp_bpf_extra_cap,\n \n-\t.vnic_init\t= nfp_bpf_vnic_init,\n-\t.vnic_clean\t= nfp_bpf_vnic_clean,\n+\t.vnic_alloc\t= nfp_bpf_vnic_alloc,\n+\t.vnic_free\t= nfp_bpf_vnic_free,\n \n \t.setup_tc\t= nfp_bpf_setup_tc,\n \t.tc_busy\t= nfp_bpf_tc_busy,\ndiff --git a/drivers/net/ethernet/netronome/nfp/flower/cmsg.c b/drivers/net/ethernet/netronome/nfp/flower/cmsg.c\nindex 806924b82adc..d82d9888d676 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/cmsg.c\n+++ b/drivers/net/ethernet/netronome/nfp/flower/cmsg.c\n@@ -203,7 +203,7 @@ void nfp_flower_cmsg_process_rx(struct work_struct *work)\n \tpriv = container_of(work, struct nfp_flower_priv, cmsg_work);\n \n \twhile ((skb = skb_dequeue(&priv->cmsg_skbs)))\n-\t\tnfp_flower_cmsg_process_one_rx(priv->nn->app, skb);\n+\t\tnfp_flower_cmsg_process_one_rx(priv->app, skb);\n }\n \n void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb)\ndiff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c\nindex 126a6b5233bf..db59858c0f19 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/main.c\n+++ b/drivers/net/ethernet/netronome/nfp/flower/main.c\n@@ -313,18 +313,14 @@ static int nfp_flower_start(struct nfp_app *app)\n \t\t\t\t\t   NFP_REPR_TYPE_PF, 1);\n }\n \n-static int nfp_flower_vnic_init(struct nfp_app *app, struct nfp_net *nn,\n-\t\t\t\tunsigned int id)\n+static int nfp_flower_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t\t unsigned int id)\n {\n-\tstruct nfp_flower_priv *priv = app->priv;\n-\n \tif (id > 0) {\n \t\tnfp_warn(app->cpp, \"FlowerNIC doesn't support more than one data vNIC\\n\");\n \t\tgoto err_invalid_port;\n \t}\n \n-\tpriv->nn = nn;\n-\n \teth_hw_addr_random(nn->dp.netdev);\n \tnetif_keep_dst(nn->dp.netdev);\n \n@@ -335,6 +331,22 @@ static int nfp_flower_vnic_init(struct nfp_app *app, struct nfp_net *nn,\n \treturn PTR_ERR_OR_ZERO(nn->port);\n }\n \n+static void nfp_flower_vnic_clean(struct nfp_app *app, struct nfp_net *nn)\n+{\n+\tstruct nfp_flower_priv *priv = app->priv;\n+\n+\tpriv->nn = NULL;\n+}\n+\n+static int nfp_flower_vnic_init(struct nfp_app *app, struct nfp_net *nn)\n+{\n+\tstruct nfp_flower_priv *priv = app->priv;\n+\n+\tpriv->nn = nn;\n+\n+\treturn 0;\n+}\n+\n static int nfp_flower_init(struct nfp_app *app)\n {\n \tconst struct nfp_pf *pf = app->pf;\n@@ -374,6 +386,7 @@ static int nfp_flower_init(struct nfp_app *app)\n \t\treturn -ENOMEM;\n \n \tapp->priv = app_priv;\n+\tapp_priv->app = app;\n \tskb_queue_head_init(&app_priv->cmsg_skbs);\n \tINIT_WORK(&app_priv->cmsg_work, nfp_flower_cmsg_process_rx);\n \n@@ -410,7 +423,9 @@ const struct nfp_app_type app_flower = {\n \t.init\t\t= nfp_flower_init,\n \t.clean\t\t= nfp_flower_clean,\n \n+\t.vnic_alloc\t= nfp_flower_vnic_alloc,\n \t.vnic_init\t= nfp_flower_vnic_init,\n+\t.vnic_clean\t= nfp_flower_vnic_clean,\n \n \t.repr_open\t= nfp_flower_repr_netdev_open,\n \t.repr_stop\t= nfp_flower_repr_netdev_stop,\ndiff --git a/drivers/net/ethernet/netronome/nfp/flower/main.h b/drivers/net/ethernet/netronome/nfp/flower/main.h\nindex b7043ca9b9fc..c20dd00a1cae 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/main.h\n+++ b/drivers/net/ethernet/netronome/nfp/flower/main.h\n@@ -72,6 +72,7 @@ struct nfp_fl_stats_id {\n \n /**\n  * struct nfp_flower_priv - Flower APP per-vNIC priv data\n+ * @app:\t\tBack pointer to app\n  * @nn:\t\t\tPointer to vNIC\n  * @mask_id_seed:\tSeed used for mask hash table\n  * @flower_version:\tHW version of flower\n@@ -83,6 +84,7 @@ struct nfp_fl_stats_id {\n  * @cmsg_skbs:\t\tList of skbs for control message processing\n  */\n struct nfp_flower_priv {\n+\tstruct nfp_app *app;\n \tstruct nfp_net *nn;\n \tu32 mask_id_seed;\n \tu64 flower_version;\ndiff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.c b/drivers/net/ethernet/netronome/nfp/nfp_app.c\nindex 505e63f47419..82c290763529 100644\n--- a/drivers/net/ethernet/netronome/nfp/nfp_app.c\n+++ b/drivers/net/ethernet/netronome/nfp/nfp_app.c\n@@ -125,7 +125,7 @@ struct nfp_app *nfp_app_alloc(struct nfp_pf *pf, enum nfp_app_id id)\n \t\treturn ERR_PTR(-EINVAL);\n \t}\n \n-\tif (WARN_ON(!apps[i]->name || !apps[i]->vnic_init))\n+\tif (WARN_ON(!apps[i]->name || !apps[i]->vnic_alloc))\n \t\treturn ERR_PTR(-EINVAL);\n \n \tapp = kzalloc(sizeof(*app), GFP_KERNEL);\ndiff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h\nindex c13b9bbe7e62..af640b5c2108 100644\n--- a/drivers/net/ethernet/netronome/nfp/nfp_app.h\n+++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h\n@@ -69,8 +69,10 @@ extern const struct nfp_app_type app_flower;\n  * @init:\tperform basic app checks and init\n  * @clean:\tclean app state\n  * @extra_cap:\textra capabilities string\n- * @vnic_init:\tinit vNICs (assign port types, etc.)\n- * @vnic_clean:\tclean up app's vNIC state\n+ * @vnic_alloc:\tallocate vNICs (assign port types, etc.)\n+ * @vnic_free:\tfree up app's vNIC state\n+ * @vnic_init:\tvNIC netdev was registered\n+ * @vnic_clean:\tvNIC netdev about to be unregistered\n  * @repr_open:\trepresentor netdev open callback\n  * @repr_stop:\trepresentor netdev stop callback\n  * @start:\tstart application logic\n@@ -95,8 +97,10 @@ struct nfp_app_type {\n \n \tconst char *(*extra_cap)(struct nfp_app *app, struct nfp_net *nn);\n \n-\tint (*vnic_init)(struct nfp_app *app, struct nfp_net *nn,\n-\t\t\t unsigned int id);\n+\tint (*vnic_alloc)(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t  unsigned int id);\n+\tvoid (*vnic_free)(struct nfp_app *app, struct nfp_net *nn);\n+\tint (*vnic_init)(struct nfp_app *app, struct nfp_net *nn);\n \tvoid (*vnic_clean)(struct nfp_app *app, struct nfp_net *nn);\n \n \tint (*repr_open)(struct nfp_app *app, struct nfp_repr *repr);\n@@ -157,10 +161,23 @@ static inline void nfp_app_clean(struct nfp_app *app)\n \t\tapp->type->clean(app);\n }\n \n-static inline int nfp_app_vnic_init(struct nfp_app *app, struct nfp_net *nn,\n-\t\t\t\t    unsigned int id)\n+static inline int nfp_app_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t\t     unsigned int id)\n {\n-\treturn app->type->vnic_init(app, nn, id);\n+\treturn app->type->vnic_alloc(app, nn, id);\n+}\n+\n+static inline void nfp_app_vnic_free(struct nfp_app *app, struct nfp_net *nn)\n+{\n+\tif (app->type->vnic_free)\n+\t\tapp->type->vnic_free(app, nn);\n+}\n+\n+static inline int nfp_app_vnic_init(struct nfp_app *app, struct nfp_net *nn)\n+{\n+\tif (!app->type->vnic_init)\n+\t\treturn 0;\n+\treturn app->type->vnic_init(app, nn);\n }\n \n static inline void nfp_app_vnic_clean(struct nfp_app *app, struct nfp_net *nn)\n@@ -308,7 +325,7 @@ void nfp_app_free(struct nfp_app *app);\n \n /* Callbacks shared between apps */\n \n-int nfp_app_nic_vnic_init(struct nfp_app *app, struct nfp_net *nn,\n-\t\t\t  unsigned int id);\n+int nfp_app_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t   unsigned int id);\n \n #endif\ndiff --git a/drivers/net/ethernet/netronome/nfp/nfp_app_nic.c b/drivers/net/ethernet/netronome/nfp/nfp_app_nic.c\nindex 4e37c81f9eaf..2a2f2fbc8850 100644\n--- a/drivers/net/ethernet/netronome/nfp/nfp_app_nic.c\n+++ b/drivers/net/ethernet/netronome/nfp/nfp_app_nic.c\n@@ -60,8 +60,8 @@ nfp_app_nic_vnic_init_phy_port(struct nfp_pf *pf, struct nfp_app *app,\n \treturn nn->port->type == NFP_PORT_INVALID;\n }\n \n-int nfp_app_nic_vnic_init(struct nfp_app *app, struct nfp_net *nn,\n-\t\t\t  unsigned int id)\n+int nfp_app_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t   unsigned int id)\n {\n \tint err;\n \ndiff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c\nindex 7c22cc4654b7..f2a1a4e2ce8b 100644\n--- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c\n+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c\n@@ -161,6 +161,8 @@ nfp_net_pf_map_rtsym(struct nfp_pf *pf, const char *name, const char *sym_fmt,\n \n static void nfp_net_pf_free_vnic(struct nfp_pf *pf, struct nfp_net *nn)\n {\n+\tif (nfp_net_is_data_vnic(nn))\n+\t\tnfp_app_vnic_free(pf->app, nn);\n \tnfp_port_free(nn->port);\n \tlist_del(&nn->vnic_list);\n \tpf->num_vnics--;\n@@ -205,7 +207,7 @@ nfp_net_pf_alloc_vnic(struct nfp_pf *pf, bool needs_netdev,\n \tnn->stride_tx = stride;\n \n \tif (needs_netdev) {\n-\t\terr = nfp_app_vnic_init(pf->app, nn, id);\n+\t\terr = nfp_app_vnic_alloc(pf->app, nn, id);\n \t\tif (err) {\n \t\t\tnfp_net_free(nn);\n \t\t\treturn ERR_PTR(err);\n@@ -243,8 +245,17 @@ nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id)\n \n \tnfp_net_info(nn);\n \n+\tif (nfp_net_is_data_vnic(nn)) {\n+\t\terr = nfp_app_vnic_init(pf->app, nn);\n+\t\tif (err)\n+\t\t\tgoto err_devlink_port_clean;\n+\t}\n+\n \treturn 0;\n \n+err_devlink_port_clean:\n+\tif (nn->port)\n+\t\tnfp_devlink_port_unregister(nn->port);\n err_dfs_clean:\n \tnfp_net_debugfs_dir_clean(&nn->debugfs_dir);\n \tnfp_net_clean(nn);\n@@ -288,11 +299,12 @@ nfp_net_pf_alloc_vnics(struct nfp_pf *pf, void __iomem *ctrl_bar,\n \n static void nfp_net_pf_clean_vnic(struct nfp_pf *pf, struct nfp_net *nn)\n {\n+\tif (nfp_net_is_data_vnic(nn))\n+\t\tnfp_app_vnic_clean(pf->app, nn);\n \tif (nn->port)\n \t\tnfp_devlink_port_unregister(nn->port);\n \tnfp_net_debugfs_dir_clean(&nn->debugfs_dir);\n \tnfp_net_clean(nn);\n-\tnfp_app_vnic_clean(pf->app, nn);\n }\n \n static int nfp_net_pf_alloc_irqs(struct nfp_pf *pf)\ndiff --git a/drivers/net/ethernet/netronome/nfp/nic/main.c b/drivers/net/ethernet/netronome/nfp/nic/main.c\nindex 8287a85d22c1..d5b587fccaa3 100644\n--- a/drivers/net/ethernet/netronome/nfp/nic/main.c\n+++ b/drivers/net/ethernet/netronome/nfp/nic/main.c\n@@ -63,7 +63,7 @@ const struct nfp_app_type app_nic = {\n \t.name\t\t= \"nic\",\n \n \t.init\t\t= nfp_nic_init,\n-\t.vnic_init\t= nfp_app_nic_vnic_init,\n+\t.vnic_alloc\t= nfp_app_nic_vnic_alloc,\n \n \t.sriov_enable\t= nfp_nic_sriov_enable,\n \t.sriov_disable\t= nfp_nic_sriov_disable,\n",
    "prefixes": [
        "net-next",
        "1/6"
    ]
}