get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 840489,
    "url": "http://patchwork.ozlabs.org/api/patches/840489/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20171122185729.29785.42193.stgit@localhost.localdomain/",
    "project": {
        "id": 46,
        "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api",
        "name": "Intel Wired Ethernet development",
        "link_name": "intel-wired-lan",
        "list_id": "intel-wired-lan.osuosl.org",
        "list_email": "intel-wired-lan@osuosl.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20171122185729.29785.42193.stgit@localhost.localdomain>",
    "list_archive_url": null,
    "date": "2017-11-22T18:57:29",
    "name": "[jkirsher/next-queue,13/16] ixgbe: avoid bringing rings up/down as macvlans are added/removed",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "ddf348ac2f253a12e9dd8a54d85ff458153a26d0",
    "submitter": {
        "id": 252,
        "url": "http://patchwork.ozlabs.org/api/people/252/?format=api",
        "name": "Alexander Duyck",
        "email": "alexander.duyck@gmail.com"
    },
    "delegate": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/users/68/?format=api",
        "username": "jtkirshe",
        "first_name": "Jeff",
        "last_name": "Kirsher",
        "email": "jeffrey.t.kirsher@intel.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20171122185729.29785.42193.stgit@localhost.localdomain/mbox/",
    "series": [
        {
            "id": 14756,
            "url": "http://patchwork.ozlabs.org/api/series/14756/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=14756",
            "date": "2017-11-22T18:56:10",
            "name": "ixgbe/fm10k: macvlan fixes",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/14756/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/840489/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/840489/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<intel-wired-lan-bounces@osuosl.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=osuosl.org\n\t(client-ip=140.211.166.137; helo=fraxinus.osuosl.org;\n\tenvelope-from=intel-wired-lan-bounces@osuosl.org;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"Yebl3bJh\"; dkim-atps=neutral"
        ],
        "Received": [
            "from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3yhsXl3BRVz9ryv\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 23 Nov 2017 06:12:39 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id 004548797B;\n\tWed, 22 Nov 2017 19:12:38 +0000 (UTC)",
            "from fraxinus.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id 3YdQPJJ16GSs; Wed, 22 Nov 2017 19:12:35 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id 7214B87AAD;\n\tWed, 22 Nov 2017 19:12:33 +0000 (UTC)",
            "from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n\tby ash.osuosl.org (Postfix) with ESMTP id 2272D1C2314\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 22 Nov 2017 18:57:32 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id 1A7AB8797B\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 22 Nov 2017 18:57:32 +0000 (UTC)",
            "from fraxinus.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id r3DOh9Ufx7KV for <intel-wired-lan@lists.osuosl.org>;\n\tWed, 22 Nov 2017 18:57:30 +0000 (UTC)",
            "from mail-pg0-f65.google.com (mail-pg0-f65.google.com\n\t[74.125.83.65])\n\tby fraxinus.osuosl.org (Postfix) with ESMTPS id C9FFA87963\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 22 Nov 2017 18:57:30 +0000 (UTC)",
            "by mail-pg0-f65.google.com with SMTP id j16so12945928pgn.9\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 22 Nov 2017 10:57:30 -0800 (PST)",
            "from localhost.localdomain ([2001:470:b:9c3:9e5c:8eff:fe4f:f2d0])\n\tby smtp.gmail.com with ESMTPSA id\n\tt2sm33173370pfk.90.2017.11.22.10.57.29\n\tfor <intel-wired-lan@lists.osuosl.org>\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tWed, 22 Nov 2017 10:57:29 -0800 (PST)"
        ],
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=subject:from:to:date:message-id:in-reply-to:references:user-agent\n\t:mime-version:content-transfer-encoding;\n\tbh=aeD5dL2208y1ELti2MWILoZv49tza9uOvKNPVl3RNKg=;\n\tb=Yebl3bJh9Zem2qBmyn3irgJu5Z1Bp/CdrXNFtKNIAes6BlbZzHvAUuExHez0jiQbX0\n\tq/ArpZn1zeIqzoUFVs/YFCDaSZy0QKkxTwo0tpwSZv7n88Yh07pR1digegq9nfgS/0UD\n\tqDgbmWyOmr1k77VbE07oruyAzebIg4508xOEnltPGBJiRw4Op6R8dtOs2BE4rppt4O2K\n\t9UQtL1jZj9DkwJw9lRx7k9vOkNkVK3pyDTQ9oE+hWADXm+EPe7Xe5TxoAwOede183Khp\n\tb++UnGe4Bn4DDsGYzm9DJ6gxJmRch3KrGfrHLZPDUDjLj6UIoDHVckVDYPzxBkp0JZGf\n\tqVoA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:subject:from:to:date:message-id:in-reply-to\n\t:references:user-agent:mime-version:content-transfer-encoding;\n\tbh=aeD5dL2208y1ELti2MWILoZv49tza9uOvKNPVl3RNKg=;\n\tb=SpZnh1QHyMdu8sVKlJ4UgVKxszTk7R3aKK3hTikO7POEoGGLqC+HNFQNbuIptKq2GM\n\tzpCzIICBD+/s0Cg7x+ShgfOPLhhAwP68huQiebo+Yx66fRXwGVAb28TcxSPU6Les1AjR\n\tJgDjXjOSLNQFlwShJ3owDLI3ligCX1epsdMnQEbcC+0Hf/GhbeL0CZkibC1QJClaf9op\n\tNZHe+Xjb5XvuOLVPPEHw/5DkeCR7SnMuPXQ5RKTyebQa9KhgAmTCpCBox/CsQUwmYCGD\n\txcaS1a7VFMsCccKKDbxZlkUtlk8xWBjGuD2rpAiPwDLnZgGYif+kiTrHfWdJaYUbMu5v\n\tsKiQ==",
        "X-Gm-Message-State": "AJaThX7yyPJG9R9IGkQpCErvMCjG6pEc60yk+VGA+dR174iFjnaa25AC\n\tBufcFGgvzbC8WaNPW74MXkCh4Tgu",
        "X-Google-Smtp-Source": "AGs4zMbj9K20NirqwsJiLnfXBjnp1Pbe7L7RMUmI/qhJ1rhTW7BpfDlpxD3K/FmEooU/LvQRUnTzxQ==",
        "X-Received": "by 10.98.215.90 with SMTP id v26mr15337418pfl.174.1511377050056; \n\tWed, 22 Nov 2017 10:57:30 -0800 (PST)",
        "From": "Alexander Duyck <alexander.duyck@gmail.com>",
        "To": "intel-wired-lan@lists.osuosl.org",
        "Date": "Wed, 22 Nov 2017 10:57:29 -0800",
        "Message-ID": "<20171122185729.29785.42193.stgit@localhost.localdomain>",
        "In-Reply-To": "<20171122185256.29785.93548.stgit@localhost.localdomain>",
        "References": "<20171122185256.29785.93548.stgit@localhost.localdomain>",
        "User-Agent": "StGit/0.17.1-dirty",
        "MIME-Version": "1.0",
        "Subject": "[Intel-wired-lan] [jkirsher/next-queue PATCH 13/16] ixgbe: avoid\n\tbringing rings up/down as macvlans are added/removed",
        "X-BeenThere": "intel-wired-lan@osuosl.org",
        "X-Mailman-Version": "2.1.24",
        "Precedence": "list",
        "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.osuosl.org>",
        "List-Unsubscribe": "<https://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>",
        "List-Post": "<mailto:intel-wired-lan@osuosl.org>",
        "List-Help": "<mailto:intel-wired-lan-request@osuosl.org?subject=help>",
        "List-Subscribe": "<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "intel-wired-lan-bounces@osuosl.org",
        "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>"
    },
    "content": "From: Alexander Duyck <alexander.h.duyck@intel.com>\n\nThis change makes it so that instead of bringing rings up/down for various\nwe just update the netdev pointer for the Rx ring and set or clear the MAC\nfilter for the interface. By doing it this way we can avoid a number of\nraces and issues in the code as things were getting messy with the macvlan\nclean-up racing with the interface clean-up to bring the rings down on\nshutdown.\n\nWith this change we opt to leave the rings owned by the PF interface for\nboth Tx and Rx and just direct the packets once they are received to the\nmacvlan netdev.\n\nSigned-off-by: Alexander Duyck <alexander.h.duyck@intel.com>\n---\n drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c  |   28 +++++--\n drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |  102 +++++++++++++------------\n 2 files changed, 72 insertions(+), 58 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c\nindex dc7f3ef2957b..cfe5a6af04d0 100644\n--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c\n+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c\n@@ -46,7 +46,7 @@ static bool ixgbe_cache_ring_dcb_sriov(struct ixgbe_adapter *adapter)\n #endif /* IXGBE_FCOE */\n \tstruct ixgbe_ring_feature *vmdq = &adapter->ring_feature[RING_F_VMDQ];\n \tint i;\n-\tu16 reg_idx;\n+\tu16 reg_idx, pool;\n \tu8 tcs = adapter->hw_tcs;\n \n \t/* verify we have DCB queueing enabled before proceeding */\n@@ -58,12 +58,16 @@ static bool ixgbe_cache_ring_dcb_sriov(struct ixgbe_adapter *adapter)\n \t\treturn false;\n \n \t/* start at VMDq register offset for SR-IOV enabled setups */\n+\tpool = 0;\n \treg_idx = vmdq->offset * __ALIGN_MASK(1, ~vmdq->mask);\n-\tfor (i = 0; i < adapter->num_rx_queues; i++, reg_idx++) {\n+\tfor (i = 0, pool = 0; i < adapter->num_rx_queues; i++, reg_idx++) {\n \t\t/* If we are greater than indices move to next pool */\n-\t\tif ((reg_idx & ~vmdq->mask) >= tcs)\n+\t\tif ((reg_idx & ~vmdq->mask) >= tcs) {\n+\t\t\tpool++;\n \t\t\treg_idx = __ALIGN_MASK(reg_idx, ~vmdq->mask);\n+\t\t}\n \t\tadapter->rx_ring[i]->reg_idx = reg_idx;\n+\t\tadapter->rx_ring[i]->netdev = pool ? NULL : adapter->netdev;\n \t}\n \n \treg_idx = vmdq->offset * __ALIGN_MASK(1, ~vmdq->mask);\n@@ -92,6 +96,7 @@ static bool ixgbe_cache_ring_dcb_sriov(struct ixgbe_adapter *adapter)\n \t\tfor (i = fcoe->offset; i < adapter->num_rx_queues; i++) {\n \t\t\treg_idx = __ALIGN_MASK(reg_idx, ~vmdq->mask) + fcoe_tc;\n \t\t\tadapter->rx_ring[i]->reg_idx = reg_idx;\n+\t\t\tadapter->rx_ring[i]->netdev = adapter->netdev;\n \t\t\treg_idx++;\n \t\t}\n \n@@ -182,6 +187,7 @@ static bool ixgbe_cache_ring_dcb(struct ixgbe_adapter *adapter)\n \t\tfor (i = 0; i < rss_i; i++, tx_idx++, rx_idx++) {\n \t\t\tadapter->tx_ring[offset + i]->reg_idx = tx_idx;\n \t\t\tadapter->rx_ring[offset + i]->reg_idx = rx_idx;\n+\t\t\tadapter->rx_ring[offset + i]->netdev = adapter->netdev;\n \t\t\tadapter->tx_ring[offset + i]->dcb_tc = tc;\n \t\t\tadapter->rx_ring[offset + i]->dcb_tc = tc;\n \t\t}\n@@ -206,14 +212,15 @@ static bool ixgbe_cache_ring_sriov(struct ixgbe_adapter *adapter)\n #endif /* IXGBE_FCOE */\n \tstruct ixgbe_ring_feature *vmdq = &adapter->ring_feature[RING_F_VMDQ];\n \tstruct ixgbe_ring_feature *rss = &adapter->ring_feature[RING_F_RSS];\n+\tu16 reg_idx, pool;\n \tint i;\n-\tu16 reg_idx;\n \n \t/* only proceed if VMDq is enabled */\n \tif (!(adapter->flags & IXGBE_FLAG_VMDQ_ENABLED))\n \t\treturn false;\n \n \t/* start at VMDq register offset for SR-IOV enabled setups */\n+\tpool = 0;\n \treg_idx = vmdq->offset * __ALIGN_MASK(1, ~vmdq->mask);\n \tfor (i = 0; i < adapter->num_rx_queues; i++, reg_idx++) {\n #ifdef IXGBE_FCOE\n@@ -222,15 +229,20 @@ static bool ixgbe_cache_ring_sriov(struct ixgbe_adapter *adapter)\n \t\t\tbreak;\n #endif\n \t\t/* If we are greater than indices move to next pool */\n-\t\tif ((reg_idx & ~vmdq->mask) >= rss->indices)\n+\t\tif ((reg_idx & ~vmdq->mask) >= rss->indices) {\n+\t\t\tpool++;\n \t\t\treg_idx = __ALIGN_MASK(reg_idx, ~vmdq->mask);\n+\t\t}\n \t\tadapter->rx_ring[i]->reg_idx = reg_idx;\n+\t\tadapter->rx_ring[i]->netdev = pool ? NULL : adapter->netdev;\n \t}\n \n #ifdef IXGBE_FCOE\n \t/* FCoE uses a linear block of queues so just assigning 1:1 */\n-\tfor (; i < adapter->num_rx_queues; i++, reg_idx++)\n+\tfor (; i < adapter->num_rx_queues; i++, reg_idx++) {\n \t\tadapter->rx_ring[i]->reg_idx = reg_idx;\n+\t\tadapter->rx_ring[i]->netdev = adapter->netdev;\n+\t}\n \n #endif\n \treg_idx = vmdq->offset * __ALIGN_MASK(1, ~vmdq->mask);\n@@ -267,8 +279,10 @@ static bool ixgbe_cache_ring_rss(struct ixgbe_adapter *adapter)\n {\n \tint i, reg_idx;\n \n-\tfor (i = 0; i < adapter->num_rx_queues; i++)\n+\tfor (i = 0; i < adapter->num_rx_queues; i++) {\n \t\tadapter->rx_ring[i]->reg_idx = i;\n+\t\tadapter->rx_ring[i]->netdev = adapter->netdev;\n+\t}\n \tfor (i = 0, reg_idx = 0; i < adapter->num_tx_queues; i++, reg_idx++)\n \t\tadapter->tx_ring[i]->reg_idx = reg_idx;\n \tfor (i = 0; i < adapter->num_xdp_queues; i++, reg_idx++)\ndiff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c\nindex c21fd98bd45a..bcd05761b8e1 100644\n--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c\n+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c\n@@ -1922,10 +1922,13 @@ static bool ixgbe_cleanup_headers(struct ixgbe_ring *rx_ring,\n \tif (IS_ERR(skb))\n \t\treturn true;\n \n-\t/* verify that the packet does not have any known errors */\n-\tif (unlikely(ixgbe_test_staterr(rx_desc,\n-\t\t\t\t\tIXGBE_RXDADV_ERR_FRAME_ERR_MASK) &&\n-\t    !(netdev->features & NETIF_F_RXALL))) {\n+\t/* Verify netdev is present, and that packet does not have any\n+\t * errors that would be unacceptable to the netdev.\n+\t */\n+\tif (!netdev ||\n+\t    (unlikely(ixgbe_test_staterr(rx_desc,\n+\t\t\t\t\t IXGBE_RXDADV_ERR_FRAME_ERR_MASK) &&\n+\t     !(netdev->features & NETIF_F_RXALL)))) {\n \t\tdev_kfree_skb_any(skb);\n \t\treturn true;\n \t}\n@@ -5335,33 +5338,6 @@ static void ixgbe_clean_rx_ring(struct ixgbe_ring *rx_ring)\n \trx_ring->next_to_use = 0;\n }\n \n-static void ixgbe_disable_fwd_ring(struct ixgbe_fwd_adapter *vadapter,\n-\t\t\t\t   struct ixgbe_ring *rx_ring)\n-{\n-\tstruct ixgbe_adapter *adapter = vadapter->real_adapter;\n-\n-\t/* shutdown specific queue receive and wait for dma to settle */\n-\tixgbe_disable_rx_queue(adapter, rx_ring);\n-\tusleep_range(10000, 20000);\n-\tixgbe_irq_disable_queues(adapter, BIT_ULL(rx_ring->queue_index));\n-\tixgbe_clean_rx_ring(rx_ring);\n-}\n-\n-static int ixgbe_fwd_ring_down(struct net_device *vdev,\n-\t\t\t       struct ixgbe_fwd_adapter *accel)\n-{\n-\tstruct ixgbe_adapter *adapter = accel->real_adapter;\n-\tunsigned int rxbase = accel->rx_base_queue;\n-\tint i;\n-\n-\tfor (i = 0; i < adapter->num_rx_queues_per_pool; i++) {\n-\t\tixgbe_disable_fwd_ring(accel, adapter->rx_ring[rxbase + i]);\n-\t\tadapter->rx_ring[rxbase + i]->netdev = adapter->netdev;\n-\t}\n-\n-\treturn 0;\n-}\n-\n static int ixgbe_fwd_ring_up(struct net_device *vdev,\n \t\t\t     struct ixgbe_fwd_adapter *accel)\n {\n@@ -5381,25 +5357,26 @@ static int ixgbe_fwd_ring_up(struct net_device *vdev,\n \taccel->tx_base_queue = baseq;\n \n \tfor (i = 0; i < adapter->num_rx_queues_per_pool; i++)\n-\t\tixgbe_disable_fwd_ring(accel, adapter->rx_ring[baseq + i]);\n-\n-\tfor (i = 0; i < adapter->num_rx_queues_per_pool; i++) {\n \t\tadapter->rx_ring[baseq + i]->netdev = vdev;\n-\t\tixgbe_configure_rx_ring(adapter, adapter->rx_ring[baseq + i]);\n-\t}\n+\n+\t/* Guarantee all rings are updated before we update the\n+\t * MAC address filter.\n+\t */\n+\twmb();\n \n \t/* ixgbe_add_mac_filter will return an index if it succeeds, so we\n \t * need to only treat it as an error value if it is negative.\n \t */\n \terr = ixgbe_add_mac_filter(adapter, vdev->dev_addr,\n \t\t\t\t   VMDQ_P(accel->pool));\n-\tif (err < 0)\n-\t\tgoto fwd_queue_err;\n+\tif (err >= 0) {\n+\t\tixgbe_macvlan_set_rx_mode(vdev, accel->pool, adapter);\n+\t\treturn 0;\n+\t}\n+\n+\tfor (i = 0; i < adapter->num_rx_queues_per_pool; i++)\n+\t\tadapter->rx_ring[baseq + i]->netdev = NULL;\n \n-\tixgbe_macvlan_set_rx_mode(vdev, VMDQ_P(accel->pool), adapter);\n-\treturn 0;\n-fwd_queue_err:\n-\tixgbe_fwd_ring_down(vdev, accel);\n \treturn err;\n }\n \n@@ -9791,15 +9768,38 @@ static void *ixgbe_fwd_add(struct net_device *pdev, struct net_device *vdev)\n \n static void ixgbe_fwd_del(struct net_device *pdev, void *priv)\n {\n-\tstruct ixgbe_fwd_adapter *fwd_adapter = priv;\n-\tstruct ixgbe_adapter *adapter = fwd_adapter->real_adapter;\n-\tunsigned int limit;\n+\tstruct ixgbe_fwd_adapter *accel = priv;\n+\tstruct ixgbe_adapter *adapter = accel->real_adapter;\n+\tunsigned int rxbase = accel->rx_base_queue;\n+\tunsigned int limit, i;\n \n-\tclear_bit(fwd_adapter->pool, adapter->fwd_bitmask);\n+\t/* delete unicast filter associated with offloaded interface */\n+\tixgbe_del_mac_filter(adapter, accel->netdev->dev_addr,\n+\t\t\t     VMDQ_P(accel->pool));\n \n+\t/* disable ability to receive packets for this pool */\n+\tIXGBE_WRITE_REG(&adapter->hw, IXGBE_VMOLR(accel->pool), 0);\n+\n+\t/* Allow remaining Rx packets to get flushed out of the\n+\t * Rx FIFO before we drop the netdev for the ring.\n+\t */\n+\tusleep_range(10000, 20000);\n+\n+\tfor (i = 0; i < adapter->num_rx_queues_per_pool; i++) {\n+\t\tstruct ixgbe_ring *ring = adapter->rx_ring[rxbase + i];\n+\t\tstruct ixgbe_q_vector *qv = ring->q_vector;\n+\n+\t\t/* Make sure we aren't processing any packets and clear\n+\t\t * netdev to shut down the ring.\n+\t\t */\n+\t\tif (netif_running(adapter->netdev))\n+\t\t\tnapi_synchronize(&qv->napi);\n+\t\tring->netdev = NULL;\n+\t}\n+\n+\tclear_bit(accel->pool, adapter->fwd_bitmask);\n \tlimit = find_last_bit(adapter->fwd_bitmask, adapter->num_rx_pools);\n \tadapter->ring_feature[RING_F_VMDQ].limit = limit + 1;\n-\tixgbe_fwd_ring_down(fwd_adapter->netdev, fwd_adapter);\n \n \t/* go back to full RSS if we're done with our VMQs */\n \tif (adapter->ring_feature[RING_F_VMDQ].limit == 1) {\n@@ -9813,11 +9813,11 @@ static void ixgbe_fwd_del(struct net_device *pdev, void *priv)\n \n \tixgbe_setup_tc(pdev, adapter->hw_tcs);\n \tnetdev_dbg(pdev, \"pool %i:%i queues %i:%i\\n\",\n-\t\t   fwd_adapter->pool, adapter->num_rx_pools,\n-\t\t   fwd_adapter->rx_base_queue,\n-\t\t   fwd_adapter->rx_base_queue +\n+\t\t   accel->pool, adapter->num_rx_pools,\n+\t\t   accel->rx_base_queue,\n+\t\t   accel->rx_base_queue +\n \t\t   adapter->num_rx_queues_per_pool);\n-\tkfree(fwd_adapter);\n+\tkfree(accel);\n }\n \n #define IXGBE_MAX_MAC_HDR_LEN\t\t127\n",
    "prefixes": [
        "jkirsher/next-queue",
        "13/16"
    ]
}