Show a cover letter.

GET /api/covers/70661/?format=api
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 70661,
    "url": "http://patchwork.dpdk.org/api/covers/70661/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/cover/cover.1590598121.git.anatoly.burakov@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<cover.1590598121.git.anatoly.burakov@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/cover.1590598121.git.anatoly.burakov@intel.com",
    "date": "2020-05-27T17:02:00",
    "name": "[RFC,0/6] Power-optimized RX for Ethernet devices",
    "submitter": {
        "id": 4,
        "url": "http://patchwork.dpdk.org/api/people/4/?format=api",
        "name": "Anatoly Burakov",
        "email": "anatoly.burakov@intel.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/cover/cover.1590598121.git.anatoly.burakov@intel.com/mbox/",
    "series": [
        {
            "id": 10259,
            "url": "http://patchwork.dpdk.org/api/series/10259/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=10259",
            "date": "2020-05-27T17:02:00",
            "name": "Power-optimized RX for Ethernet devices",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/10259/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/covers/70661/comments/",
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 9FCB9A00BE;\n\tWed, 27 May 2020 19:02:17 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 5420E1DABF;\n\tWed, 27 May 2020 19:02:16 +0200 (CEST)",
            "from mga01.intel.com (mga01.intel.com [192.55.52.88])\n by dpdk.org (Postfix) with ESMTP id ADF521DA94\n for <dev@dpdk.org>; Wed, 27 May 2020 19:02:14 +0200 (CEST)",
            "from orsmga005.jf.intel.com ([10.7.209.41])\n by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 27 May 2020 10:02:13 -0700",
            "from silpixa00399498.ir.intel.com (HELO\n silpixa00399498.ger.corp.intel.com) ([10.237.222.52])\n by orsmga005.jf.intel.com with ESMTP; 27 May 2020 10:01:59 -0700"
        ],
        "IronPort-SDR": [
            "\n jRx4wwcoc5yKKUjtfTibZXbe1KXUA1W7cOYuHQGGirc2bsV6BnWiUOT5NiwcQeGI6libuyEI3M\n +E+8FDUSo26A==",
            "\n MaXS45/2WO59nujdrtrRjETs4kjQTz9FjN4HHNKgvg4lZDAm+Dtc3kAl9qGy8MWp+kzsy3qK9d\n zXWLUqqTz0nA=="
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.73,442,1583222400\"; d=\"scan'208\";a=\"442595950\"",
        "From": "Anatoly Burakov <anatoly.burakov@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "david.hunt@intel.com,\n\tliang.j.ma@intel.com",
        "Date": "Wed, 27 May 2020 18:02:00 +0100",
        "Message-Id": "<cover.1590598121.git.anatoly.burakov@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "Subject": "[dpdk-dev] [RFC 0/6] Power-optimized RX for Ethernet devices",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "This patchset proposes a simple API for Ethernet drivers\nto cause the CPU to enter a power-optimized state while\nwaiting for packets to arrive, along with a set of\n(hopefully generic) intrinsics that facilitate that. This\nis achieved through cooperation with the NIC driver that\nwill allow us to know address of the next NIC RX ring\npacket descriptor, and wait for writes on it.\n\nOn IA, this is achieved through using UMONITOR/UMWAIT\ninstructions. They are used in their raw opcode form\nbecause there is no widespread compiler support for\nthem yet. Still, the API is made generic enough to\nhopefully support other architectures, if they happen\nto implement similar instructions.\n\nTo achieve power savings, there is a very simple mechanism\nused: we're counting empty polls, and if a certain threshold\nis reached, we get the address of next RX ring descriptor\nfrom the NIC driver, arm the monitoring hardware, and\nenter a power-optimized state. We will then wake up when\neither a timeout happens, or a write happens (or generally\nwhenever CPU feels like waking up - this is platform-\nspecific), and proceed as normal. The empty poll counter is\nreset whenever we actually get packets, so we only go to\nsleep when we know nothing is going on.\n\nWhy are we putting it into ethdev as opposed to leaving\nthis up to the application? Our customers specifically\nrequested a way to do it wit minimal changes to the\napplication code. The current approach allows to just\nflip a switch and automagically have power savings.\n\nThere are certain limitations in this patchset right now:\n- Currently, only 1:1 core to queue mapping is supported,\n  meaning that each lcore must at most handle RX on a\n  single queue\n- Currently, power management is enabled per-port, not\n  per-queue\n- There is potential to greatly increase TX latency if we\n  are buffering things, and go to sleep before sending\n  packets\n- The API is not perfect and could use some improvement\n  and discussion\n- The API doesn't extend to other device types\n- The intrinsics are platform-specific, so ethdev has\n  some platform-specific code in it\n- Support was only implemented for devices using\n  net/ixgbe, net/i40e and net/ice drivers\n\nHopefully this would generate enough feedback to clear\na path forward!\n\nAnatoly Burakov (6):\n  eal: add power management intrinsics\n  ethdev: add simple power management API\n  net/ixgbe: implement power management API\n  net/i40e: implement power management API\n  net/ice: implement power management API\n  app/testpmd: add command for power management on a port\n\n app/test-pmd/cmdline.c                        |  48 +++++++\n drivers/net/i40e/i40e_ethdev.c                |   1 +\n drivers/net/i40e/i40e_rxtx.c                  |  23 +++\n drivers/net/i40e/i40e_rxtx.h                  |   2 +\n drivers/net/ice/ice_ethdev.c                  |   1 +\n drivers/net/ice/ice_rxtx.c                    |  23 +++\n drivers/net/ice/ice_rxtx.h                    |   2 +\n drivers/net/ixgbe/ixgbe_ethdev.c              |   1 +\n drivers/net/ixgbe/ixgbe_rxtx.c                |  22 +++\n drivers/net/ixgbe/ixgbe_rxtx.h                |   2 +\n .../include/generic/rte_power_intrinsics.h    |  64 +++++++++\n lib/librte_eal/include/meson.build            |   1 +\n lib/librte_eal/x86/include/meson.build        |   1 +\n lib/librte_eal/x86/include/rte_cpuflags.h     |   1 +\n .../x86/include/rte_power_intrinsics.h        | 134 ++++++++++++++++++\n lib/librte_eal/x86/rte_cpuflags.c             |   2 +\n lib/librte_ethdev/rte_ethdev.c                |  39 +++++\n lib/librte_ethdev/rte_ethdev.h                |  70 +++++++++\n lib/librte_ethdev/rte_ethdev_core.h           |  41 +++++-\n lib/librte_ethdev/rte_ethdev_version.map      |   4 +\n 20 files changed, 480 insertions(+), 2 deletions(-)\n create mode 100644 lib/librte_eal/include/generic/rte_power_intrinsics.h\n create mode 100644 lib/librte_eal/x86/include/rte_power_intrinsics.h"
}