get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 894794,
    "url": "http://patchwork.ozlabs.org/api/patches/894794/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20180403211609.7880.1015.stgit@ahduyck-green-test.jf.intel.com/",
    "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": "<20180403211609.7880.1015.stgit@ahduyck-green-test.jf.intel.com>",
    "list_archive_url": null,
    "date": "2018-04-03T21:16:09",
    "name": "[iwl,next-queue,03/10] macvlan: Use software path for offloaded local, broadcast, and multicast traffic",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "68cde95428c734a64291481e6605e1094580ac3f",
    "submitter": {
        "id": 251,
        "url": "http://patchwork.ozlabs.org/api/people/251/?format=api",
        "name": "Duyck, Alexander H",
        "email": "alexander.h.duyck@intel.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/20180403211609.7880.1015.stgit@ahduyck-green-test.jf.intel.com/mbox/",
    "series": [
        {
            "id": 37262,
            "url": "http://patchwork.ozlabs.org/api/series/37262/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=37262",
            "date": "2018-04-03T21:15:53",
            "name": "Clean-up macvlan offloading",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/37262/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/894794/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/894794/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.136; helo=silver.osuosl.org;\n\tenvelope-from=intel-wired-lan-bounces@osuosl.org;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org;\n\tdmarc=none (p=none dis=none) header.from=intel.com"
        ],
        "Received": [
            "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\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 40G2B11TdHz9s1b\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed,  4 Apr 2018 07:22:49 +1000 (AEST)",
            "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id A6C4130AFB;\n\tTue,  3 Apr 2018 21:22:47 +0000 (UTC)",
            "from silver.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id OoOPmJKxTeMi; Tue,  3 Apr 2018 21:22:46 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby silver.osuosl.org (Postfix) with ESMTP id 362862E78D;\n\tTue,  3 Apr 2018 21:22:46 +0000 (UTC)",
            "from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\tby ash.osuosl.org (Postfix) with ESMTP id 97B481C039A\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tTue,  3 Apr 2018 21:22:45 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 948358A576\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tTue,  3 Apr 2018 21:22:45 +0000 (UTC)",
            "from whitealder.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id 0Ls6jgd27CSY for <intel-wired-lan@lists.osuosl.org>;\n\tTue,  3 Apr 2018 21:22:44 +0000 (UTC)",
            "from mga18.intel.com (mga18.intel.com [134.134.136.126])\n\tby whitealder.osuosl.org (Postfix) with ESMTPS id A843B8A572\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tTue,  3 Apr 2018 21:22:44 +0000 (UTC)",
            "from orsmga004.jf.intel.com ([10.7.209.38])\n\tby orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t03 Apr 2018 14:22:44 -0700",
            "from ahduyck-green-test.jf.intel.com ([10.166.244.179])\n\tby orsmga004.jf.intel.com with ESMTP; 03 Apr 2018 14:22:44 -0700"
        ],
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6",
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.48,402,1517904000\"; d=\"scan'208\";a=\"188404636\"",
        "From": "Alexander Duyck <alexander.h.duyck@intel.com>",
        "To": "intel-wired-lan@lists.osuosl.org, jeffrey.t.kirsher@intel.com",
        "Date": "Tue, 03 Apr 2018 17:16:09 -0400",
        "Message-ID": "<20180403211609.7880.1015.stgit@ahduyck-green-test.jf.intel.com>",
        "In-Reply-To": "<20180403211519.7880.70243.stgit@ahduyck-green-test.jf.intel.com>",
        "References": "<20180403211519.7880.70243.stgit@ahduyck-green-test.jf.intel.com>",
        "User-Agent": "StGit/0.17.1-dirty",
        "MIME-Version": "1.0",
        "Subject": "[Intel-wired-lan] [iwl next-queue PATCH 03/10] macvlan: Use\n\tsoftware path for offloaded local, broadcast, and multicast traffic",
        "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>",
        "Cc": "netdev@vger.kernel.org",
        "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": "This change makes it so that we use a software path for packets that are\ngoing to be locally switched between two macvlan interfaces on the same\ndevice. In addition we resort to software replication of broadcast and\nmulticast packets instead of offloading that to hardware.\n\nThe general idea is that using the device for east/west traffic local to\nthe system is extremely inefficient. We can only support up to whatever the\nPCIe limit is for any given device so this caps us at somewhere around 20G\nfor devices supported by ixgbe. This is compounded even further when you\ntake broadcast and multicast into account as a single 10G port can come to\na crawl as a packet is replicated up to 60+ times in some cases. In order\nto get away from that I am implementing changes so that we handle\nbroadcast/multicast replication and east/west local traffic all in\nsoftware.\n\nSigned-off-by: Alexander Duyck <alexander.h.duyck@intel.com>\n---\n drivers/net/ethernet/intel/fm10k/fm10k_netdev.c |    4 +-\n drivers/net/ethernet/intel/ixgbe/ixgbe_main.c   |   39 +++++--------------\n drivers/net/macvlan.c                           |   47 ++++++++++-------------\n 3 files changed, 33 insertions(+), 57 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c\nindex 4579349..ee645ba 100644\n--- a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c\n+++ b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c\n@@ -1254,7 +1254,7 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface)\n \t\t\tglort = l2_accel->dglort + 1 + i;\n \n \t\t\thw->mac.ops.update_xcast_mode(hw, glort,\n-\t\t\t\t\t\t      FM10K_XCAST_MODE_MULTI);\n+\t\t\t\t\t\t      FM10K_XCAST_MODE_NONE);\n \t\t\tfm10k_queue_mac_request(interface, glort,\n \t\t\t\t\t\tsdev->dev_addr,\n \t\t\t\t\t\thw->mac.default_vid, true);\n@@ -1515,7 +1515,7 @@ static void *fm10k_dfwd_add_station(struct net_device *dev,\n \n \tif (fm10k_host_mbx_ready(interface)) {\n \t\thw->mac.ops.update_xcast_mode(hw, glort,\n-\t\t\t\t\t      FM10K_XCAST_MODE_MULTI);\n+\t\t\t\t\t      FM10K_XCAST_MODE_NONE);\n \t\tfm10k_queue_mac_request(interface, glort, sdev->dev_addr,\n \t\t\t\t\thw->mac.default_vid, true);\n \t}\ndiff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c\nindex c08e6b5..6172c1b 100644\n--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c\n+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c\n@@ -4211,7 +4211,8 @@ static void ixgbe_setup_psrtype(struct ixgbe_adapter *adapter)\n static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)\n {\n \tstruct ixgbe_hw *hw = &adapter->hw;\n-\tu32 reg_offset, vf_shift;\n+\tu16 pool = adapter->num_rx_pools;\n+\tu32 reg_offset, vf_shift, vmolr;\n \tu32 gcr_ext, vmdctl;\n \tint i;\n \n@@ -4225,6 +4226,13 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)\n \tvmdctl |= IXGBE_VT_CTL_REPLEN;\n \tIXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vmdctl);\n \n+\t/* accept untagged packets until a vlan tag is\n+\t * specifically set for the VMDQ queue/pool\n+\t */\n+\tvmolr = IXGBE_VMOLR_AUPE;\n+\twhile (pool--)\n+\t\tIXGBE_WRITE_REG(hw, IXGBE_VMOLR(VMDQ_P(pool)), vmolr);\n+\n \tvf_shift = VMDQ_P(0) % 32;\n \treg_offset = (VMDQ_P(0) >= 32) ? 1 : 0;\n \n@@ -5271,28 +5279,6 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)\n \tspin_unlock(&adapter->fdir_perfect_lock);\n }\n \n-static void ixgbe_macvlan_set_rx_mode(struct net_device *dev, unsigned int pool,\n-\t\t\t\t      struct ixgbe_adapter *adapter)\n-{\n-\tstruct ixgbe_hw *hw = &adapter->hw;\n-\tu32 vmolr;\n-\n-\t/* No unicast promiscuous support for VMDQ devices. */\n-\tvmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(pool));\n-\tvmolr |= (IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_BAM | IXGBE_VMOLR_AUPE);\n-\n-\t/* clear the affected bit */\n-\tvmolr &= ~IXGBE_VMOLR_MPE;\n-\n-\tif (dev->flags & IFF_ALLMULTI) {\n-\t\tvmolr |= IXGBE_VMOLR_MPE;\n-\t} else {\n-\t\tvmolr |= IXGBE_VMOLR_ROMPE;\n-\t\thw->mac.ops.update_mc_addr_list(hw, dev);\n-\t}\n-\tIXGBE_WRITE_REG(hw, IXGBE_VMOLR(pool), vmolr);\n-}\n-\n /**\n  * ixgbe_clean_rx_ring - Free Rx Buffers per Queue\n  * @rx_ring: ring to free buffers from\n@@ -5376,10 +5362,8 @@ static int ixgbe_fwd_ring_up(struct net_device *vdev,\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\tixgbe_macvlan_set_rx_mode(vdev, accel->pool, adapter);\n+\tif (err >= 0)\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@@ -9816,9 +9800,6 @@ static void ixgbe_fwd_del(struct net_device *pdev, void *priv)\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 */\ndiff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c\nindex 7ddc94f..adde8fc 100644\n--- a/drivers/net/macvlan.c\n+++ b/drivers/net/macvlan.c\n@@ -514,6 +514,7 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)\n \tconst struct macvlan_dev *vlan = netdev_priv(dev);\n \tconst struct macvlan_port *port = vlan->port;\n \tconst struct macvlan_dev *dest;\n+\tvoid *accel_priv = NULL;\n \n \tif (vlan->mode == MACVLAN_MODE_BRIDGE) {\n \t\tconst struct ethhdr *eth = (void *)skb->data;\n@@ -533,9 +534,14 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)\n \t\t}\n \t}\n \n+\t/* For packets that are non-multicast and not bridged we will pass\n+\t * the necessary information so that the lowerdev can distinguish\n+\t * the source of the packets via the accel_priv value.\n+\t */\n+\taccel_priv = vlan->accel_priv;\n xmit_world:\n \tskb->dev = vlan->lowerdev;\n-\treturn dev_queue_xmit(skb);\n+\treturn dev_queue_xmit_accel(skb, accel_priv);\n }\n \n static inline netdev_tx_t macvlan_netpoll_send_skb(struct macvlan_dev *vlan, struct sk_buff *skb)\n@@ -552,19 +558,14 @@ static inline netdev_tx_t macvlan_netpoll_send_skb(struct macvlan_dev *vlan, str\n static netdev_tx_t macvlan_start_xmit(struct sk_buff *skb,\n \t\t\t\t      struct net_device *dev)\n {\n+\tstruct macvlan_dev *vlan = netdev_priv(dev);\n \tunsigned int len = skb->len;\n \tint ret;\n-\tstruct macvlan_dev *vlan = netdev_priv(dev);\n \n \tif (unlikely(netpoll_tx_running(dev)))\n \t\treturn macvlan_netpoll_send_skb(vlan, skb);\n \n-\tif (vlan->accel_priv) {\n-\t\tskb->dev = vlan->lowerdev;\n-\t\tret = dev_queue_xmit_accel(skb, vlan->accel_priv);\n-\t} else {\n-\t\tret = macvlan_queue_xmit(skb, dev);\n-\t}\n+\tret = macvlan_queue_xmit(skb, dev);\n \n \tif (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {\n \t\tstruct vlan_pcpu_stats *pcpu_stats;\n@@ -620,26 +621,20 @@ static int macvlan_open(struct net_device *dev)\n \t/* Attempt to populate accel_priv which is used to offload the L2\n \t * forwarding requests for unicast packets.\n \t */\n-\tif (lowerdev->features & NETIF_F_HW_L2FW_DOFFLOAD) {\n+\tif (lowerdev->features & NETIF_F_HW_L2FW_DOFFLOAD)\n \t\tvlan->accel_priv =\n \t\t      lowerdev->netdev_ops->ndo_dfwd_add_station(lowerdev, dev);\n \n-\t\t/* If we get a NULL pointer back, or if we get an error\n-\t\t * then we should just fall through to the non accelerated path\n-\t\t */\n-\t\tif (IS_ERR_OR_NULL(vlan->accel_priv))\n-\t\t\tvlan->accel_priv = NULL;\n-\t\telse\n-\t\t\treturn 0;\n+\t/* If earlier attempt to offload failed, or accel_priv is not\n+\t * populated we must add the unicast address to the lower device.\n+\t */\n+\tif (IS_ERR_OR_NULL(vlan->accel_priv)) {\n+\t\tvlan->accel_priv = NULL;\n+\t\terr = dev_uc_add(lowerdev, dev->dev_addr);\n+\t\tif (err < 0)\n+\t\t\tgoto out;\n \t}\n \n-\terr = -EBUSY;\n-\tif (macvlan_addr_busy(vlan->port, dev->dev_addr))\n-\t\tgoto out;\n-\n-\terr = dev_uc_add(lowerdev, dev->dev_addr);\n-\tif (err < 0)\n-\t\tgoto out;\n \tif (dev->flags & IFF_ALLMULTI) {\n \t\terr = dev_set_allmulti(lowerdev, 1);\n \t\tif (err < 0)\n@@ -660,13 +655,14 @@ static int macvlan_open(struct net_device *dev)\n \tif (dev->flags & IFF_ALLMULTI)\n \t\tdev_set_allmulti(lowerdev, -1);\n del_unicast:\n-\tdev_uc_del(lowerdev, dev->dev_addr);\n-out:\n \tif (vlan->accel_priv) {\n \t\tlowerdev->netdev_ops->ndo_dfwd_del_station(lowerdev,\n \t\t\t\t\t\t\t   vlan->accel_priv);\n \t\tvlan->accel_priv = NULL;\n+\t} else {\n+\t\tdev_uc_del(lowerdev, dev->dev_addr);\n \t}\n+out:\n \treturn err;\n }\n \n@@ -679,7 +675,6 @@ static int macvlan_stop(struct net_device *dev)\n \t\tlowerdev->netdev_ops->ndo_dfwd_del_station(lowerdev,\n \t\t\t\t\t\t\t   vlan->accel_priv);\n \t\tvlan->accel_priv = NULL;\n-\t\treturn 0;\n \t}\n \n \tdev_uc_unsync(lowerdev, dev);\n",
    "prefixes": [
        "iwl",
        "next-queue",
        "03/10"
    ]
}