get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139014,
    "url": "http://patchwork.dpdk.org/api/patches/139014/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20240401065622.106253-1-chaoyong.he@corigine.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": "<20240401065622.106253-1-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240401065622.106253-1-chaoyong.he@corigine.com",
    "date": "2024-04-01T06:56:22",
    "name": "net/nfp: use Tx ring pointer write back",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "9ac831b8c20cc04b9269a2d69c9af02467adc58b",
    "submitter": {
        "id": 2554,
        "url": "http://patchwork.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20240401065622.106253-1-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 31652,
            "url": "http://patchwork.dpdk.org/api/series/31652/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=31652",
            "date": "2024-04-01T06:56:22",
            "name": "net/nfp: use Tx ring pointer write back",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/31652/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/139014/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/139014/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id BBF1F43D9F;\n\tMon,  1 Apr 2024 08:56:43 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4E0294026F;\n\tMon,  1 Apr 2024 08:56:43 +0200 (CEST)",
            "from NAM12-BN8-obe.outbound.protection.outlook.com\n (mail-bn8nam12on2093.outbound.protection.outlook.com [40.107.237.93])\n by mails.dpdk.org (Postfix) with ESMTP id E4AB740265\n for <dev@dpdk.org>; Mon,  1 Apr 2024 08:56:41 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by SA0PR13MB3984.namprd13.prod.outlook.com (2603:10b6:806:93::12)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Mon, 1 Apr\n 2024 06:56:39 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e%5]) with mapi id 15.20.7409.042; Mon, 1 Apr 2024\n 06:56:39 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=TKqPdtcMbFGPABFwFnaEbVyrNkPyEtcjrAjLOz+nRKIzilL9xfq8fhVM2gxc1MqJXXCItMZdw8KbSg3Q7/1ye/N8xGwM8nBenqd/rhGhv6aunVFZvL/GkfW8g1eET1greL+eahaYdvCb09joGhLQQRB8S7244oTwnG+mIMsoRhGzATP4J18MKcUcPOyKgUPpCDMqIfD9JuSqlQ9kkHVTa3VBs/T0UAnbPcwdnioOUaNKli0S5/CBd3PP/Hc05WRH9xQ4QOqEzeliEbx03cj69e15vAzO9MWKEYD1xdaBwy8xFGNvZPDv/qT0K4GdqNtkfEr4N7WGePu7msw93ILfvQ==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=KNbCL47eU2kfbQl8/HRBPnIINLH66hQp8P6VLSC96ww=;\n b=GHr1wTV6vpBo4/HVeYD3vMOz9Y2klF9zrktXjXZeHNuVqFHnSz8pfeKMVS5jOnJLcj6jA3mxHQdTzlfkJfzyFwXikmrNltub8PVW1bpod25ptQE4kAg+kCbG8T1PGl5Kq2hD4uTkbak0+Vu0QGBySJ/XGgFP7VIe3DYUOwuN3qTbUd6VAip7pnGoiiWngCfNXaCopcTr6wMGjneejMcyg2rxQZB+ZnLBZp0UzNrRebOSnWFjKaoLLqHIau3o0zBq98mSlanWR756ZYd0uosyI3QYPaBxybbtNz941TkQZjvmlQKS3CHGW2NH5pBOakORywFlFIG/cCT6/pL6DlPwLA==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=KNbCL47eU2kfbQl8/HRBPnIINLH66hQp8P6VLSC96ww=;\n b=VREtRur8UuqreeRlQp4p5IUmo5rK9jNUgOVZQh45ITmfskBb0G/hlDyHMR0Ya6W92VXVpzJl5b4Q+LX4BrAF1UupSQ9mnyup52FEsIXYtc34H5csDhg7SG6yIHUSM/xkNg+CayAnowx9zI97Xn77A8iPMfiz/dKuHGa6sFaZCb4=",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com, Long Wu <long.wu@corigine.com>,\n Chaoyong He <chaoyong.he@corigine.com>",
        "Subject": "[PATCH] net/nfp: use Tx ring pointer write back",
        "Date": "Mon,  1 Apr 2024 14:56:22 +0800",
        "Message-Id": "<20240401065622.106253-1-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "PH2PEPF00003859.namprd17.prod.outlook.com\n (2603:10b6:518:1::7b) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|SA0PR13MB3984:EE_",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n R/2ZZHpSe5RT2ngRz2uCvGbUNjFtCwCEo455fVS3M6GmO5xcRxelZrXW+SSi3Ruw4ZNzh0+tWv4zu81804yyI+mUbEMGSQjuzogFN5mYjiz7M1ohdEeK8xXzTornjbztG3lPYQQyvr+wdqsEr3KTNE3UOHySIheiSKeURTL9zhAsmvPHwGadq7e6M8RHmxpRa80zB+YzCMtVspDTL52zrMJpQx/bpImN3WT5lIabrqmuoTvKNeTe51QXYfgh5GGy6K3Xd7+zl8V1z3wQXa2g9/mtydjXbr70joGkssFBI2nx/XhxSkCpZOd4dJiq46hFSqUMqq2zXVzQH6sr9bElM6QNQKXRVU+WNwpBDVvF69DLwHSfuSEwd0qIO15NExC+I2Wzf5bNig/18Mn0WyQsHTaZ/DcCoBeYTanqgekdkE+mbXmnegN61kDWCx8oiT5hVmf9OMiL/TySiA3WLCShQwZxVcs7ts8q/zl+x7ohNyszs8fqS51GUN567cLOxIVPos5ItjJ3dtKjr1bzWuq4IYTATDfUMw1uuIGwrxLbpDip+GQmD7d9ejFJROtJQ5/2NXFDb4lIFU3bgLVjQw8EcZjc+j6oWvoXU83Xhb2tJbOK4fzX4cmsvPLk6Pv+IZXWQrrJzoTqcHWyk9gJu9i24mGljvP1JKGsBng6YS8wSnu2kMhR/SfDNAPayNfFLnvApDkCXqsXlJq1IqNs63DtwQ==",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230031)(376005)(52116005)(1800799015)(366007)(38350700005); DIR:OUT;\n SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n UuJDzp26nIH6evZUqQ2CkMJ6QhUFU0wO+2WL1hq4D5xy+OuCKGQDHkLq7OyhbLTWnS3G3C0Pzmtgz8WwQ1CIKrgm3oX/ZvVWcPte7yFTBWh6ZcNfU8ZYjxLe9smNun1CUmBe9sOlhDnY0bl4CVekzAnvFxpX4NA5kJW96TbLI7tOep9DonSLpeavqsF9zavNuiO77Ky84nFpFbu1DqG5EVgFPrua+p5r094svIEbBiVKx2q5yGtC8iIhOSx0wTDcuKWOpBJ6dPK6uswlpLFF//Op03UIyIA75bq/bD0dBcGSY01VWNFLXgTfuIov2/VJYPDGx/TQl4j5ysvwKjqr+7KOaFZMmpDAyyd4JgAF6OIcBllOi9TyuT9dvc6gKvAeQhfrV/e6uKM5V9vU0HoiswKniPDkNb8ENjCFwGXnq1rGn3Ca/WpGq7/eKSYmdoy1Mfv3xBXQylZUtGrv3vJUg9/OaEN3ljOdrzeTnwKTvmsBMQ7LLmw2LGSW6A7yb3YcpV3wdpotOgR7Fv4EEDYl//CKhI/7KLQAkILVAxZw0brUiMmKZtuiqIEFScLfpJLFBQ/0wo3fUG0UMUJbEGSczg1ji256ik3f/CRGUny9kFlNQ5jiNujqFG3E3zVG0IzH8SaCe+g7Dt+Ig+lb67vvcvAJJhQtUjshX9r5up5Uh0AjdYZ3hs5j91lKGV9fA167JAeZlMR4d3qhvbjZH9pMvgx1/+Ax8XjNagLO4r149oI2JxrQLriOhw9f6z0Qy802ksokLYWyVuf2OqAUB3jzKQKeIyzYYSsdCzTKDuM5YvrGfk/4FvVIOi4/s9fiBiZmzk/bkjye6FBTXriSb0PrWsSm/qK7HRqjkQug2bzQ5rgm46UMF0thAacmg9Saxd+iwVyKHtJUgadxpQDJrlAuwiZxh0IqYLkp588IoyarB+0L3P9lBDcITM4cjXYfeMGmqxq6iqEgEgUTlJmM7NAiKONW/sDbyHie6Pjxdus8HCR1Ww7U4ObFQSj+mQtQsTEdTbF9AUXe3IGLRAbaqhvMCOGmdDm6avtLyJUuC86ttemAhGwlADeGoDObU+9e1Ai8gknRQbwjH2UIy8zaYux0URX62eg1oQDZBHS/tVCtjwjl1Z0j8OqaC2vSlMmnip7H4zVk8NRHj7Y/oovz74izHrDkgCRgUcuoa+LF39tMAK/C0jMok0wwL+7WTYCKCwDPGjesrteGOGjULOiPYQ05z8EZdc/cRoYSMA5ivG0rpfyHCrJoeHyeEIMi4pKIchhYm/ocAdRK2a+gyHYq+1CZZTgn1ojBLujTePHFjXn/BZk9fpa8n+Dx0b3qEJsb1kT+yb+NYRfUEGF/yfgNpb0/ovSwtZgVlKjZFGU9uPjywTLbMWp+i5tGNcnL435V3+qahSrBFRvcNLfzraQNdLGyesUuSWwWtxTmg4bSZlHLtpF0sVsLUQmLuswbHaGWar8uqPFuyDPMlchLe4IvsgMj6vdQ48kVq9q+MjjEVHALEEFTfJQwApieFjCeUD5o+bPmCuF/RAh2QfReKY25tVVSVRl7bWSYptM561dD7OYeNwyeM31rVKahy1K7svWNZ6ORIVGECKntE3cv627lF1dolA==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 9473b8d8-5a5e-43e2-f26a-08dc5218e123",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "01 Apr 2024 06:56:39.2574 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "fe128f2c-073b-4c20-818e-7246a585940c",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n S3dBO+drkJqGGLW0O4Wb8ktZMFXDsRptPydG/CDp3PKgd1d8LHT9lBB5V6bPIyLP3h5klisV2XSVlIdrB6e+NivzhUTies5XCrs6tClupF4=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SA0PR13MB3984",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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"
    },
    "content": "From: Long Wu <long.wu@corigine.com>\n\nThis follows the mainline Linux kernel commit\n0dcf7f500b0a (nfp: use TX ring pointer write back) by Jakub Kicinski.\n\nThis will speed up Tx completions, because we avoid a read from\ndevice memory (replacing PCIe read with DMA read), and it works on\nCoreNIC firmware with NFDk.\n\nSigned-off-by: Long Wu <long.wu@corigine.com>\nReviewed-by: Chaoyong He <chaoyong.he@corigine.com>\n---\n drivers/net/nfp/nfdk/nfp_nfdk_dp.c |  7 ++++++\n drivers/net/nfp/nfp_ethdev.c       | 16 +++++++++++++-\n drivers/net/nfp/nfp_net_common.c   | 34 ++++++++++++++++++++++++++++++\n drivers/net/nfp/nfp_net_common.h   |  5 +++++\n drivers/net/nfp/nfp_rxtx.c         | 28 +++++++++++++++++++++++-\n drivers/net/nfp/nfp_rxtx.h         |  6 ++++++\n 6 files changed, 94 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c\nindex 1911736e2b..41cdfd3a40 100644\n--- a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c\n+++ b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c\n@@ -544,6 +544,13 @@ nfp_net_nfdk_tx_queue_setup(struct rte_eth_dev *dev,\n \t\treturn -ENOMEM;\n \t}\n \n+\tif (hw->txrwb_mz != NULL) {\n+\t\ttxq->txrwb = (uint64_t *)hw->txrwb_mz->addr + queue_idx;\n+\t\ttxq->txrwb_dma = (uint64_t)hw->txrwb_mz->iova +\n+\t\t\t\tqueue_idx * sizeof(uint64_t);\n+\t\tnn_cfg_writeq(&hw->super, NFP_NET_CFG_TXR_WB_ADDR(queue_idx), txq->txrwb_dma);\n+\t}\n+\n \tnfp_net_reset_tx_queue(txq);\n \n \tdev->data->tx_queues[queue_idx] = txq;\ndiff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex 568de1d024..b711e15b9f 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -360,6 +360,9 @@ nfp_net_start(struct rte_eth_dev *dev)\n \tif ((hw->cap & NFP_NET_CFG_CTRL_RINGCFG) != 0)\n \t\tnew_ctrl |= NFP_NET_CFG_CTRL_RINGCFG;\n \n+\tif ((hw->cap & NFP_NET_CFG_CTRL_TXRWB) != 0)\n+\t\tnew_ctrl |= NFP_NET_CFG_CTRL_TXRWB;\n+\n \tif (nfp_reconfig(hw, new_ctrl, update) != 0)\n \t\treturn -EIO;\n \n@@ -577,6 +580,8 @@ nfp_net_uninit(struct rte_eth_dev *eth_dev)\n \t\tnfp_net_flow_priv_uninit(net_hw->pf_dev, net_hw->idx);\n \n \trte_free(net_hw->eth_xstats_base);\n+\tif ((net_hw->super.cap & NFP_NET_CFG_CTRL_TXRWB) != 0)\n+\t\tnfp_net_txrwb_free(eth_dev);\n \tnfp_ipsec_uninit(eth_dev);\n \tif (net_hw->mac_stats_area != NULL)\n \t\tnfp_cpp_area_release_free(net_hw->mac_stats_area);\n@@ -987,6 +992,12 @@ nfp_net_init(struct rte_eth_dev *eth_dev)\n \t\tgoto xstats_free;\n \t}\n \n+\tif ((hw->cap & NFP_NET_CFG_CTRL_TXRWB) != 0) {\n+\t\terr = nfp_net_txrwb_alloc(eth_dev);\n+\t\tif (err != 0)\n+\t\t\tgoto xstats_free;\n+\t}\n+\n \tnfp_net_pf_read_mac(app_fw_nic, port);\n \tnfp_write_mac(hw, &hw->mac_addr.addr_bytes[0]);\n \n@@ -1025,12 +1036,15 @@ nfp_net_init(struct rte_eth_dev *eth_dev)\n \t\terr = nfp_net_flow_priv_init(pf_dev, port);\n \t\tif (err != 0) {\n \t\t\tPMD_INIT_LOG(ERR, \"Init net flow priv failed\");\n-\t\t\tgoto xstats_free;\n+\t\t\tgoto txrwb_free;\n \t\t}\n \t}\n \n \treturn 0;\n \n+txrwb_free:\n+\tif ((hw->cap & NFP_NET_CFG_CTRL_TXRWB) != 0)\n+\t\tnfp_net_txrwb_free(eth_dev);\n xstats_free:\n \trte_free(net_hw->eth_xstats_base);\n ipsec_exit:\ndiff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c\nindex c6889949ff..da1a7e7be1 100644\n--- a/drivers/net/nfp/nfp_net_common.c\n+++ b/drivers/net/nfp/nfp_net_common.c\n@@ -2039,6 +2039,40 @@ nfp_net_check_dma_mask(struct nfp_net_hw *hw,\n \treturn 0;\n }\n \n+int\n+nfp_net_txrwb_alloc(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct nfp_net_hw *net_hw;\n+\tchar mz_name[RTE_MEMZONE_NAMESIZE];\n+\n+\tnet_hw = nfp_net_get_hw(eth_dev);\n+\tsnprintf(mz_name, sizeof(mz_name), \"%s_TXRWB\", eth_dev->data->name);\n+\tnet_hw->txrwb_mz = rte_memzone_reserve_aligned(mz_name,\n+\t\t\tnet_hw->max_tx_queues * sizeof(uint64_t),\n+\t\t\trte_socket_id(),\n+\t\t\tRTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE);\n+\tif (net_hw->txrwb_mz == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to alloc %s for TX ring write back\",\n+\t\t\t\tmz_name);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+void\n+nfp_net_txrwb_free(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct nfp_net_hw *net_hw;\n+\n+\tnet_hw = nfp_net_get_hw(eth_dev);\n+\tif (net_hw->txrwb_mz == NULL)\n+\t\treturn;\n+\n+\trte_memzone_free(net_hw->txrwb_mz);\n+\tnet_hw->txrwb_mz = NULL;\n+}\n+\n void\n nfp_net_cfg_read_version(struct nfp_net_hw *hw)\n {\ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex 49a5a84044..8066e77e6f 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -168,6 +168,9 @@ struct nfp_net_hw {\n \t/** Backpointer to the eth_dev of this port */\n \tstruct rte_eth_dev *eth_dev;\n \n+\t/** TX pointer ring write back memzone */\n+\tconst struct rte_memzone *txrwb_mz;\n+\n \t/** Info from the firmware */\n \tstruct nfp_net_fw_ver ver;\n \tuint32_t max_mtu;\n@@ -321,6 +324,8 @@ int nfp_net_fec_set(struct rte_eth_dev *dev,\n \t\tuint32_t fec_capa);\n void nfp_net_get_fw_version(struct nfp_net_hw *hw,\n \t\tuint32_t *fw_version);\n+int nfp_net_txrwb_alloc(struct rte_eth_dev *eth_dev);\n+void nfp_net_txrwb_free(struct rte_eth_dev *eth_dev);\n \n #define NFP_PRIV_TO_APP_FW_NIC(app_fw_priv)\\\n \t((struct nfp_app_fw_nic *)app_fw_priv)\ndiff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c\nindex 1aee3ecb3f..f9c4636688 100644\n--- a/drivers/net/nfp/nfp_rxtx.c\n+++ b/drivers/net/nfp/nfp_rxtx.c\n@@ -695,6 +695,26 @@ nfp_net_rx_queue_setup(struct rte_eth_dev *dev,\n \treturn 0;\n }\n \n+static inline uint32_t\n+nfp_net_read_tx_free_qcp(struct nfp_net_txq *txq)\n+{\n+\t/*\n+\t * If TX ring pointer write back is not supported, do a PCIe read.\n+\t * Otherwise read qcp value from write back dma address.\n+\t */\n+\tif (txq->txrwb == NULL)\n+\t\treturn nfp_qcp_read(txq->qcp_q, NFP_QCP_READ_PTR);\n+\n+\t/*\n+\t * In most cases the TX count is a power of two and the costly modulus\n+\t * operation can be substituted with a subtraction and an AND operation.\n+\t */\n+\tif (rte_is_power_of_2(txq->tx_count) == 1)\n+\t\treturn (*txq->txrwb) & (txq->tx_count - 1);\n+\telse\n+\t\treturn (*txq->txrwb) % txq->tx_count;\n+}\n+\n /**\n  * Check for descriptors with a complete status\n  *\n@@ -714,7 +734,7 @@ nfp_net_tx_free_bufs(struct nfp_net_txq *txq)\n \t\t\t\" status\", txq->qidx);\n \n \t/* Work out how many packets have been sent */\n-\tqcp_rd_p = nfp_qcp_read(txq->qcp_q, NFP_QCP_READ_PTR);\n+\tqcp_rd_p = nfp_net_read_tx_free_qcp(txq);\n \n \tif (qcp_rd_p == txq->rd_p) {\n \t\tPMD_TX_LOG(DEBUG, \"queue %hu: It seems harrier is not sending \"\n@@ -761,9 +781,13 @@ void\n nfp_net_tx_queue_release(struct rte_eth_dev *dev,\n \t\tuint16_t queue_idx)\n {\n+\tstruct nfp_net_hw *net_hw;\n \tstruct nfp_net_txq *txq = dev->data->tx_queues[queue_idx];\n \n \tif (txq != NULL) {\n+\t\tnet_hw = nfp_net_get_hw(dev);\n+\t\tif (net_hw->txrwb_mz != NULL)\n+\t\t\tnn_cfg_writeq(&net_hw->super, NFP_NET_CFG_TXR_WB_ADDR(queue_idx), 0);\n \t\tnfp_net_tx_queue_release_mbufs(txq);\n \t\trte_eth_dma_zone_free(dev, \"tx_ring\", queue_idx);\n \t\trte_free(txq->txbufs);\n@@ -777,6 +801,8 @@ nfp_net_reset_tx_queue(struct nfp_net_txq *txq)\n \tnfp_net_tx_queue_release_mbufs(txq);\n \ttxq->wr_p = 0;\n \ttxq->rd_p = 0;\n+\tif (txq->txrwb != NULL)\n+\t\t*txq->txrwb = 0;\n }\n \n int\ndiff --git a/drivers/net/nfp/nfp_rxtx.h b/drivers/net/nfp/nfp_rxtx.h\nindex 6ecabc232c..f463b9cf75 100644\n--- a/drivers/net/nfp/nfp_rxtx.h\n+++ b/drivers/net/nfp/nfp_rxtx.h\n@@ -77,6 +77,12 @@ struct nfp_net_txq {\n \t * in a cache line.\n \t */\n \tuint64_t dma;\n+\n+\t/** TX pointer ring write back area (indexed by queue id) */\n+\tuint64_t *txrwb;\n+\n+\t/** TX pointer ring write back area DMA address */\n+\tuint64_t txrwb_dma;\n } __rte_aligned(64);\n \n /* RX and freelist descriptor format */\n",
    "prefixes": []
}