get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 100676,
    "url": "http://patches.dpdk.org/api/patches/100676/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20211007032353.93579-2-ajit.khaparde@broadcom.com/",
    "project": {
        "id": 1,
        "url": "http://patches.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": "<20211007032353.93579-2-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211007032353.93579-2-ajit.khaparde@broadcom.com",
    "date": "2021-10-07T03:23:51",
    "name": "[1/3] net/bnxt: create aggregration rings when needed",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "2af2de32807c2a103873a4e7401878be7ed4861c",
    "submitter": {
        "id": 501,
        "url": "http://patches.dpdk.org/api/people/501/?format=api",
        "name": "Ajit Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "http://patches.dpdk.org/api/users/1766/?format=api",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20211007032353.93579-2-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 19423,
            "url": "http://patches.dpdk.org/api/series/19423/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=19423",
            "date": "2021-10-07T03:23:50",
            "name": "patchset for bnxt PMD",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/19423/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/100676/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/100676/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 59937A0C4D;\n\tThu,  7 Oct 2021 05:24:06 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 03ADD4116B;\n\tThu,  7 Oct 2021 05:24:01 +0200 (CEST)",
            "from mail-pj1-f49.google.com (mail-pj1-f49.google.com\n [209.85.216.49]) by mails.dpdk.org (Postfix) with ESMTP id D691840685\n for <dev@dpdk.org>; Thu,  7 Oct 2021 05:23:59 +0200 (CEST)",
            "by mail-pj1-f49.google.com with SMTP id\n q7-20020a17090a2e0700b001a01027dd88so3277863pjd.1\n for <dev@dpdk.org>; Wed, 06 Oct 2021 20:23:59 -0700 (PDT)",
            "from localhost.localdomain\n ([2600:8802:3300:145:493f:a3ef:de16:5144])\n by smtp.gmail.com with ESMTPSA id y15sm16807320pfa.64.2021.10.06.20.23.57\n (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);\n Wed, 06 Oct 2021 20:23:58 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com;\n s=google;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version; bh=Dq9J9rXFtSLRGYn+TgQTA5Wf2QJZP7TG9bxm9sk8Qqg=;\n b=XQiq1qGJ1cz8kSxlHJuX7ygvafTSQg7Nc+Yd2aQY3TUSwGuPiUOqwZbNArOxlucpd0\n o+eceGWLA9v9kktWy8nWzE4/Fy1bKyBdBehwIRVTlUJOcbbPr+gGgcjTYABMf9Nf/aFY\n MOw99urKN5r902Tk0o0AYCSjHsWEulFlVpYyQ=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20210112;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version;\n bh=Dq9J9rXFtSLRGYn+TgQTA5Wf2QJZP7TG9bxm9sk8Qqg=;\n b=sNl8jyLSlCRozY3DCIx10ekQxocUwLOEHhsfQ/pgHGW9zAux5a+yUIZgaNMijX+dZr\n tZYkveCBDPdVJNc+Lsx+RNHLUAMw2bplx1JaDrKo4DoiPHZwD7NXeVn3GHEbCWaRyn4J\n RGGQxrQATOZkv65dMeA1ZWO4L6JbNOyEiCt0p8/K8E/8Wf59bxq0a8ImQbnVABiYFfFA\n UrkzjeXhWzx205dNnMr1QjD4NUztOVEWpJhNxfkfpz2GQzyErRcgyoDwEXayAJA9yeZ8\n a3Kg5nRimLy74uKx0bO6CrEQmEpuureTK+DyUL1s+gIgH0oIZutKyAQA3PeTRD7XS7e4\n qObQ==",
        "X-Gm-Message-State": "AOAM532Cx2Zn+IVE2PJjKAONbINOsA6H8Ds1jr9vAj5hTvS5uAXqhauM\n FtNGtDXPV7G4UTWA2b9PhxcFY0Lt+gYi3rf3MopMQDxziNnSnxx3bvx86b/Jt9F/+EoL5g7tzhY\n XCks77xVLiQpMWUjlBDWOowAIktahHYzmWhsf52EyxcC3bJGpazpxfM0oUecx2U4=",
        "X-Google-Smtp-Source": "\n ABdhPJzsdXsLunQlribvitfyvrmo9rWabyQ0dzrX6i5u1pDKWMf8QNd64ZU9ixD7vJiHBfYNqT0jRg==",
        "X-Received": "by 2002:a17:90a:de16:: with SMTP id\n m22mr2712996pjv.38.1633577038626;\n Wed, 06 Oct 2021 20:23:58 -0700 (PDT)",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "Lance Richardson <lance.richardson@broadcom.com>,\n Somnath Kotur <somnath.kotur@broadcom.com>",
        "Date": "Wed,  6 Oct 2021 20:23:51 -0700",
        "Message-Id": "<20211007032353.93579-2-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.30.1 (Apple Git-130)",
        "In-Reply-To": "<20211007032353.93579-1-ajit.khaparde@broadcom.com>",
        "References": "<20211007032353.93579-1-ajit.khaparde@broadcom.com>",
        "MIME-Version": "1.0",
        "Content-Type": "multipart/signed; protocol=\"application/pkcs7-signature\";\n micalg=sha-256; boundary=\"00000000000022766505cdbacbe2\"",
        "X-Content-Filtered-By": "Mailman/MimeDel 2.1.29",
        "Subject": "[dpdk-dev] [PATCH 1/3] net/bnxt: create aggregration rings when\n needed",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Aggregration rings are needed when PMD needs to support jumbo frames, LRO.\nCurrently we are creating the aggregration rings whether jumbo frames or\nLRO has been enabled or disabled. This causes unnecessary allocation of\nmbufs needing larger mbuf pool which is not used at all.\n\nThis patch modifies the code to create aggregration rings only when needed.\n\nSigned-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\nReviewed-by: Lance Richardson <lance.richardson@broadcom.com>\nReviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>\n---\n drivers/net/bnxt/bnxt_hwrm.c |   9 +++\n drivers/net/bnxt/bnxt_ring.c | 148 ++++++++++++++++++++++-------------\n drivers/net/bnxt/bnxt_rxq.c  |  71 +++++++++++------\n drivers/net/bnxt/bnxt_rxq.h  |   2 +\n drivers/net/bnxt/bnxt_rxr.c  | 111 +++++++++++++++-----------\n 5 files changed, 216 insertions(+), 125 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c\nindex 503add42fd..181e607d7b 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.c\n+++ b/drivers/net/bnxt/bnxt_hwrm.c\n@@ -2741,6 +2741,14 @@ void bnxt_free_hwrm_rx_ring(struct bnxt *bp, int queue_index)\n \tif (BNXT_HAS_RING_GRPS(bp))\n \t\tbp->grp_info[queue_index].rx_fw_ring_id = INVALID_HW_RING_ID;\n \n+\t/* Check agg ring struct explicitly.\n+\t * bnxt_need_agg_ring() returns the current state of offload flags,\n+\t * but we may have to deal with agg ring struct before the offload\n+\t * flags are updated.\n+\t */\n+\tif (!bnxt_need_agg_ring(bp->eth_dev) || rxr->ag_ring_struct == NULL)\n+\t\tgoto no_agg;\n+\n \tring = rxr->ag_ring_struct;\n \tbnxt_hwrm_ring_free(bp, ring,\n \t\t\t    BNXT_CHIP_P5(bp) ?\n@@ -2750,6 +2758,7 @@ void bnxt_free_hwrm_rx_ring(struct bnxt *bp, int queue_index)\n \tif (BNXT_HAS_RING_GRPS(bp))\n \t\tbp->grp_info[queue_index].ag_fw_ring_id = INVALID_HW_RING_ID;\n \n+no_agg:\n \tbnxt_hwrm_stat_ctx_free(bp, cpr);\n \n \tbnxt_free_cp_ring(bp, cpr);\ndiff --git a/drivers/net/bnxt/bnxt_ring.c b/drivers/net/bnxt/bnxt_ring.c\nindex 957b175f1b..0d6a56a39a 100644\n--- a/drivers/net/bnxt/bnxt_ring.c\n+++ b/drivers/net/bnxt/bnxt_ring.c\n@@ -104,13 +104,19 @@ int bnxt_alloc_rings(struct bnxt *bp, unsigned int socket_id, uint16_t qidx,\n \tstruct bnxt_ring *cp_ring = cp_ring_info->cp_ring_struct;\n \tstruct bnxt_rx_ring_info *rx_ring_info = rxq ? rxq->rx_ring : NULL;\n \tstruct bnxt_tx_ring_info *tx_ring_info = txq ? txq->tx_ring : NULL;\n-\tstruct bnxt_ring *tx_ring;\n-\tstruct bnxt_ring *rx_ring;\n-\tstruct rte_pci_device *pdev = bp->pdev;\n \tuint64_t rx_offloads = bp->eth_dev->data->dev_conf.rxmode.offloads;\n+\tint ag_ring_start, ag_bitmap_start, tpa_info_start;\n+\tint ag_vmem_start, cp_ring_start, nq_ring_start;\n+\tint total_alloc_len, rx_ring_start, rx_ring_len;\n+\tstruct rte_pci_device *pdev = bp->pdev;\n+\tstruct bnxt_ring *tx_ring, *rx_ring;\n \tconst struct rte_memzone *mz = NULL;\n \tchar mz_name[RTE_MEMZONE_NAMESIZE];\n \trte_iova_t mz_phys_addr;\n+\tint ag_bitmap_len =  0;\n+\tint tpa_info_len = 0;\n+\tint ag_vmem_len = 0;\n+\tint ag_ring_len = 0;\n \n \tint stats_len = (tx_ring_info || rx_ring_info) ?\n \t    RTE_CACHE_LINE_ROUNDUP(sizeof(struct hwrm_stat_ctx_query_output) -\n@@ -138,14 +144,12 @@ int bnxt_alloc_rings(struct bnxt *bp, unsigned int socket_id, uint16_t qidx,\n \t\tRTE_CACHE_LINE_ROUNDUP(rx_ring_info->\n \t\t\t\t\t\trx_ring_struct->vmem_size) : 0;\n \trx_vmem_len = RTE_ALIGN(rx_vmem_len, 128);\n-\tint ag_vmem_start = 0;\n-\tint ag_vmem_len = 0;\n-\tint cp_ring_start =  0;\n-\tint nq_ring_start = 0;\n \n \tag_vmem_start = rx_vmem_start + rx_vmem_len;\n-\tag_vmem_len = rx_ring_info ? RTE_CACHE_LINE_ROUNDUP(\n-\t\t\t\trx_ring_info->ag_ring_struct->vmem_size) : 0;\n+\tif (bnxt_need_agg_ring(bp->eth_dev))\n+\t\tag_vmem_len = rx_ring_info && rx_ring_info->ag_ring_struct ?\n+\t\t\tRTE_CACHE_LINE_ROUNDUP(rx_ring_info->ag_ring_struct->vmem_size) : 0;\n+\n \tcp_ring_start = ag_vmem_start + ag_vmem_len;\n \tcp_ring_start = RTE_ALIGN(cp_ring_start, 4096);\n \n@@ -164,36 +168,36 @@ int bnxt_alloc_rings(struct bnxt *bp, unsigned int socket_id, uint16_t qidx,\n \t\t\t\t   sizeof(struct tx_bd_long)) : 0;\n \ttx_ring_len = RTE_ALIGN(tx_ring_len, 4096);\n \n-\tint rx_ring_start = tx_ring_start + tx_ring_len;\n+\trx_ring_start = tx_ring_start + tx_ring_len;\n \trx_ring_start = RTE_ALIGN(rx_ring_start, 4096);\n-\tint rx_ring_len =  rx_ring_info ?\n+\trx_ring_len =  rx_ring_info ?\n \t\tRTE_CACHE_LINE_ROUNDUP(rx_ring_info->rx_ring_struct->ring_size *\n \t\tsizeof(struct rx_prod_pkt_bd)) : 0;\n \trx_ring_len = RTE_ALIGN(rx_ring_len, 4096);\n \n-\tint ag_ring_start = rx_ring_start + rx_ring_len;\n+\tag_ring_start = rx_ring_start + rx_ring_len;\n \tag_ring_start = RTE_ALIGN(ag_ring_start, 4096);\n-\tint ag_ring_len = rx_ring_len * AGG_RING_SIZE_FACTOR;\n-\tag_ring_len = RTE_ALIGN(ag_ring_len, 4096);\n \n-\tint ag_bitmap_start = ag_ring_start + ag_ring_len;\n-\tint ag_bitmap_len =  rx_ring_info ?\n+\tif (bnxt_need_agg_ring(bp->eth_dev)) {\n+\t\tag_ring_len = rx_ring_len * AGG_RING_SIZE_FACTOR;\n+\t\tag_ring_len = RTE_ALIGN(ag_ring_len, 4096);\n+\n+\t\tag_bitmap_len =  rx_ring_info ?\n \t\tRTE_CACHE_LINE_ROUNDUP(rte_bitmap_get_memory_footprint(\n \t\t\trx_ring_info->rx_ring_struct->ring_size *\n \t\t\tAGG_RING_SIZE_FACTOR)) : 0;\n \n-\tint tpa_info_start = ag_bitmap_start + ag_bitmap_len;\n-\tint tpa_info_len = 0;\n-\n-\tif (rx_ring_info && (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO)) {\n-\t\tint tpa_max = BNXT_TPA_MAX_AGGS(bp);\n+\t\tif (rx_ring_info && (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO)) {\n+\t\t\tint tpa_max = BNXT_TPA_MAX_AGGS(bp);\n \n-\t\ttpa_info_len = tpa_max * sizeof(struct bnxt_tpa_info);\n-\t\ttpa_info_len = RTE_CACHE_LINE_ROUNDUP(tpa_info_len);\n+\t\t\ttpa_info_len = tpa_max * sizeof(struct bnxt_tpa_info);\n+\t\t\ttpa_info_len = RTE_CACHE_LINE_ROUNDUP(tpa_info_len);\n+\t\t}\n \t}\n \n-\tint total_alloc_len = tpa_info_start;\n-\ttotal_alloc_len += tpa_info_len;\n+\tag_bitmap_start = ag_ring_start + ag_ring_len;\n+\ttpa_info_start = ag_bitmap_start + ag_bitmap_len;\n+\ttotal_alloc_len = tpa_info_start + tpa_info_len;\n \n \tsnprintf(mz_name, RTE_MEMZONE_NAMESIZE,\n \t\t \"bnxt_\" PCI_PRI_FMT \"-%04x_%s\", pdev->addr.domain,\n@@ -254,34 +258,36 @@ int bnxt_alloc_rings(struct bnxt *bp, unsigned int socket_id, uint16_t qidx,\n \t\t\t    (struct rte_mbuf **)rx_ring->vmem;\n \t\t}\n \n-\t\trx_ring = rx_ring_info->ag_ring_struct;\n-\n-\t\trx_ring->bd = ((char *)mz->addr + ag_ring_start);\n-\t\trx_ring_info->ag_desc_ring =\n-\t\t    (struct rx_prod_pkt_bd *)rx_ring->bd;\n-\t\trx_ring->bd_dma = mz->iova + ag_ring_start;\n-\t\trx_ring_info->ag_desc_mapping = rx_ring->bd_dma;\n-\t\trx_ring->mem_zone = (const void *)mz;\n-\n-\t\tif (!rx_ring->bd)\n-\t\t\treturn -ENOMEM;\n-\t\tif (rx_ring->vmem_size) {\n-\t\t\trx_ring->vmem =\n-\t\t\t    (void **)((char *)mz->addr + ag_vmem_start);\n-\t\t\trx_ring_info->ag_buf_ring =\n-\t\t\t    (struct rte_mbuf **)rx_ring->vmem;\n+\t\tif (bnxt_need_agg_ring(bp->eth_dev)) {\n+\t\t\trx_ring = rx_ring_info->ag_ring_struct;\n+\n+\t\t\trx_ring->bd = ((char *)mz->addr + ag_ring_start);\n+\t\t\trx_ring_info->ag_desc_ring =\n+\t\t\t    (struct rx_prod_pkt_bd *)rx_ring->bd;\n+\t\t\trx_ring->bd_dma = mz->iova + ag_ring_start;\n+\t\t\trx_ring_info->ag_desc_mapping = rx_ring->bd_dma;\n+\t\t\trx_ring->mem_zone = (const void *)mz;\n+\n+\t\t\tif (!rx_ring->bd)\n+\t\t\t\treturn -ENOMEM;\n+\t\t\tif (rx_ring->vmem_size) {\n+\t\t\t\trx_ring->vmem =\n+\t\t\t\t    (void **)((char *)mz->addr + ag_vmem_start);\n+\t\t\t\trx_ring_info->ag_buf_ring =\n+\t\t\t\t    (struct rte_mbuf **)rx_ring->vmem;\n+\t\t\t}\n+\n+\t\t\trx_ring_info->ag_bitmap =\n+\t\t\t    rte_bitmap_init(rx_ring_info->rx_ring_struct->ring_size *\n+\t\t\t\t\t    AGG_RING_SIZE_FACTOR, (uint8_t *)mz->addr +\n+\t\t\t\t\t    ag_bitmap_start, ag_bitmap_len);\n+\n+\t\t\t/* TPA info */\n+\t\t\tif (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO)\n+\t\t\t\trx_ring_info->tpa_info =\n+\t\t\t\t\t((struct bnxt_tpa_info *)\n+\t\t\t\t\t ((char *)mz->addr + tpa_info_start));\n \t\t}\n-\n-\t\trx_ring_info->ag_bitmap =\n-\t\t    rte_bitmap_init(rx_ring_info->rx_ring_struct->ring_size *\n-\t\t\t\t    AGG_RING_SIZE_FACTOR, (uint8_t *)mz->addr +\n-\t\t\t\t    ag_bitmap_start, ag_bitmap_len);\n-\n-\t\t/* TPA info */\n-\t\tif (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO)\n-\t\t\trx_ring_info->tpa_info =\n-\t\t\t\t((struct bnxt_tpa_info *)((char *)mz->addr +\n-\t\t\t\t\t\t\t  tpa_info_start));\n \t}\n \n \tcp_ring->bd = ((char *)mz->addr + cp_ring_start);\n@@ -550,6 +556,9 @@ static int bnxt_alloc_rx_agg_ring(struct bnxt *bp, int queue_index)\n \tuint8_t ring_type;\n \tint rc = 0;\n \n+\tif (!bnxt_need_agg_ring(bp->eth_dev))\n+\t\treturn 0;\n+\n \tring->fw_rx_ring_id = rxr->rx_ring_struct->fw_ring_id;\n \n \tif (BNXT_CHIP_P5(bp)) {\n@@ -590,7 +599,7 @@ int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index)\n \t */\n \tcp_ring->ring_size = rxr->rx_ring_struct->ring_size * 2;\n \n-\tif (bp->eth_dev->data->scattered_rx)\n+\tif (bnxt_need_agg_ring(bp->eth_dev))\n \t\tcp_ring->ring_size *= AGG_RING_SIZE_FACTOR;\n \n \tcp_ring->ring_mask = cp_ring->ring_size - 1;\n@@ -645,7 +654,8 @@ int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index)\n \t\t\tgoto err_out;\n \t\t}\n \t\tbnxt_db_write(&rxr->rx_db, rxr->rx_raw_prod);\n-\t\tbnxt_db_write(&rxr->ag_db, rxr->ag_raw_prod);\n+\t\tif (bnxt_need_agg_ring(bp->eth_dev))\n+\t\t\tbnxt_db_write(&rxr->ag_db, rxr->ag_raw_prod);\n \t}\n \trxq->index = queue_index;\n #if defined(RTE_ARCH_X86) || defined(RTE_ARCH_ARM64)\n@@ -683,8 +693,11 @@ static void bnxt_init_all_rings(struct bnxt *bp)\n \t\tring = rxr->rx_ring_struct;\n \t\tring->fw_ring_id = INVALID_HW_RING_ID;\n \t\t/* Rx-AGG */\n-\t\tring = rxr->ag_ring_struct;\n-\t\tring->fw_ring_id = INVALID_HW_RING_ID;\n+\t\tif (bnxt_need_agg_ring(bp->eth_dev)) {\n+\t\t\tring = rxr->ag_ring_struct;\n+\t\t\tif (ring != NULL)\n+\t\t\t\tring->fw_ring_id = INVALID_HW_RING_ID;\n+\t\t}\n \t}\n \tfor (i = 0; i < bp->tx_cp_nr_rings; i++) {\n \t\ttxq = bp->tx_queues[i];\n@@ -712,6 +725,29 @@ int bnxt_alloc_hwrm_rings(struct bnxt *bp)\n \tbnxt_init_all_rings(bp);\n \n \tfor (i = 0; i < bp->rx_cp_nr_rings; i++) {\n+\t\tunsigned int soc_id = bp->eth_dev->device->numa_node;\n+\t\tstruct bnxt_rx_queue *rxq  = bp->rx_queues[i];\n+\t\tstruct bnxt_rx_ring_info *rxr = rxq->rx_ring;\n+\t\tstruct bnxt_ring *ring;\n+\n+\t\tif (bnxt_need_agg_ring(bp->eth_dev)) {\n+\t\t\tring = rxr->ag_ring_struct;\n+\t\t\tif (ring == NULL) {\n+\t\t\t\tbnxt_free_rxq_mem(rxq);\n+\n+\t\t\t\trc = bnxt_init_rx_ring_struct(rxq, soc_id);\n+\t\t\t\tif (rc)\n+\t\t\t\t\tgoto err_out;\n+\n+\t\t\t\trc = bnxt_alloc_rings(bp, soc_id,\n+\t\t\t\t\t\t      i, NULL, rxq,\n+\t\t\t\t\t\t      rxq->cp_ring, NULL,\n+\t\t\t\t\t\t      \"rxr\");\n+\t\t\t\tif (rc)\n+\t\t\t\t\tgoto err_out;\n+\t\t\t}\n+\t\t}\n+\n \t\trc = bnxt_alloc_hwrm_rx_ring(bp, i);\n \t\tif (rc)\n \t\t\tgoto err_out;\ndiff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c\nindex bbcb3b06e7..2ba74e464a 100644\n--- a/drivers/net/bnxt/bnxt_rxq.c\n+++ b/drivers/net/bnxt/bnxt_rxq.c\n@@ -20,6 +20,17 @@\n  * RX Queues\n  */\n \n+/* Determine whether the current configuration needs aggregation ring in HW. */\n+int bnxt_need_agg_ring(struct rte_eth_dev *eth_dev)\n+{\n+\t/* scattered_rx will be true if OFFLOAD_SCATTER is enabled,\n+\t * if LRO is enabled, or if the max packet len is greater than the\n+\t * mbuf data size. So AGG ring will be needed whenever scattered_rx\n+\t * is set.\n+\t */\n+\treturn eth_dev->data->scattered_rx ? 1 : 0;\n+}\n+\n void bnxt_free_rxq_stats(struct bnxt_rx_queue *rxq)\n {\n \tif (rxq && rxq->cp_ring && rxq->cp_ring->hw_stats)\n@@ -203,6 +214,9 @@ void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq)\n \t\t}\n \t}\n \t/* Free up mbufs in Agg ring */\n+\tif (!bnxt_need_agg_ring(rxq->bp->eth_dev))\n+\t\treturn;\n+\n \tsw_ring = rxq->rx_ring->ag_buf_ring;\n \tif (sw_ring) {\n \t\tfor (i = 0;\n@@ -240,38 +254,47 @@ void bnxt_free_rx_mbufs(struct bnxt *bp)\n \t}\n }\n \n+void bnxt_free_rxq_mem(struct bnxt_rx_queue *rxq)\n+{\n+\tbnxt_rx_queue_release_mbufs(rxq);\n+\n+\t/* Free RX, AGG ring hardware descriptors */\n+\tif (rxq->rx_ring) {\n+\t\tbnxt_free_ring(rxq->rx_ring->rx_ring_struct);\n+\t\trte_free(rxq->rx_ring->rx_ring_struct);\n+\t\trxq->rx_ring->rx_ring_struct = NULL;\n+\t\t/* Free RX Agg ring hardware descriptors */\n+\t\tbnxt_free_ring(rxq->rx_ring->ag_ring_struct);\n+\t\trte_free(rxq->rx_ring->ag_ring_struct);\n+\t\trxq->rx_ring->ag_ring_struct = NULL;\n+\n+\t\trte_free(rxq->rx_ring);\n+\t\trxq->rx_ring = NULL;\n+\t}\n+\t/* Free RX completion ring hardware descriptors */\n+\tif (rxq->cp_ring) {\n+\t\tbnxt_free_ring(rxq->cp_ring->cp_ring_struct);\n+\t\trte_free(rxq->cp_ring->cp_ring_struct);\n+\t\trxq->cp_ring->cp_ring_struct = NULL;\n+\t\trte_free(rxq->cp_ring);\n+\t\trxq->cp_ring = NULL;\n+\t}\n+\n+\tbnxt_free_rxq_stats(rxq);\n+\trte_memzone_free(rxq->mz);\n+\trxq->mz = NULL;\n+}\n+\n void bnxt_rx_queue_release_op(void *rx_queue)\n {\n \tstruct bnxt_rx_queue *rxq = (struct bnxt_rx_queue *)rx_queue;\n \n-\tif (rxq) {\n+\tif (rxq != NULL) {\n \t\tif (is_bnxt_in_error(rxq->bp))\n \t\t\treturn;\n \n \t\tbnxt_free_hwrm_rx_ring(rxq->bp, rxq->queue_id);\n-\t\tbnxt_rx_queue_release_mbufs(rxq);\n-\n-\t\t/* Free RX ring hardware descriptors */\n-\t\tif (rxq->rx_ring) {\n-\t\t\tbnxt_free_ring(rxq->rx_ring->rx_ring_struct);\n-\t\t\trte_free(rxq->rx_ring->rx_ring_struct);\n-\t\t\t/* Free RX Agg ring hardware descriptors */\n-\t\t\tbnxt_free_ring(rxq->rx_ring->ag_ring_struct);\n-\t\t\trte_free(rxq->rx_ring->ag_ring_struct);\n-\n-\t\t\trte_free(rxq->rx_ring);\n-\t\t}\n-\t\t/* Free RX completion ring hardware descriptors */\n-\t\tif (rxq->cp_ring) {\n-\t\t\tbnxt_free_ring(rxq->cp_ring->cp_ring_struct);\n-\t\t\trte_free(rxq->cp_ring->cp_ring_struct);\n-\t\t\trte_free(rxq->cp_ring);\n-\t\t}\n-\n-\t\tbnxt_free_rxq_stats(rxq);\n-\t\trte_memzone_free(rxq->mz);\n-\t\trxq->mz = NULL;\n-\n+\t\tbnxt_free_rxq_mem(rxq);\n \t\trte_free(rxq);\n \t}\n }\ndiff --git a/drivers/net/bnxt/bnxt_rxq.h b/drivers/net/bnxt/bnxt_rxq.h\nindex 42bd8e7ab7..2bd0c64345 100644\n--- a/drivers/net/bnxt/bnxt_rxq.h\n+++ b/drivers/net/bnxt/bnxt_rxq.h\n@@ -63,4 +63,6 @@ int bnxt_rx_queue_start(struct rte_eth_dev *dev,\n int bnxt_rx_queue_stop(struct rte_eth_dev *dev,\n \t\t       uint16_t rx_queue_id);\n void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq);\n+int bnxt_need_agg_ring(struct rte_eth_dev *eth_dev);\n+void bnxt_free_rxq_mem(struct bnxt_rx_queue *rxq);\n #endif\ndiff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c\nindex 4c1ee4294e..aeacc60a01 100644\n--- a/drivers/net/bnxt/bnxt_rxr.c\n+++ b/drivers/net/bnxt/bnxt_rxr.c\n@@ -1223,57 +1223,75 @@ int bnxt_init_rx_ring_struct(struct bnxt_rx_queue *rxq, unsigned int socket_id)\n \n \trxq->rx_buf_size = BNXT_MAX_PKT_LEN + sizeof(struct rte_mbuf);\n \n-\trxr = rte_zmalloc_socket(\"bnxt_rx_ring\",\n-\t\t\t\t sizeof(struct bnxt_rx_ring_info),\n-\t\t\t\t RTE_CACHE_LINE_SIZE, socket_id);\n-\tif (rxr == NULL)\n-\t\treturn -ENOMEM;\n-\trxq->rx_ring = rxr;\n-\n-\tring = rte_zmalloc_socket(\"bnxt_rx_ring_struct\",\n-\t\t\t\t   sizeof(struct bnxt_ring),\n-\t\t\t\t   RTE_CACHE_LINE_SIZE, socket_id);\n-\tif (ring == NULL)\n-\t\treturn -ENOMEM;\n-\trxr->rx_ring_struct = ring;\n-\tring->ring_size = rte_align32pow2(rxq->nb_rx_desc);\n-\tring->ring_mask = ring->ring_size - 1;\n-\tring->bd = (void *)rxr->rx_desc_ring;\n-\tring->bd_dma = rxr->rx_desc_mapping;\n-\n-\t/* Allocate extra rx ring entries for vector rx. */\n-\tring->vmem_size = sizeof(struct rte_mbuf *) *\n-\t\t\t  (ring->ring_size + BNXT_RX_EXTRA_MBUF_ENTRIES);\n+\tif (rxq->rx_ring != NULL) {\n+\t\trxr = rxq->rx_ring;\n+\t} else {\n \n-\tring->vmem = (void **)&rxr->rx_buf_ring;\n-\tring->fw_ring_id = INVALID_HW_RING_ID;\n+\t\trxr = rte_zmalloc_socket(\"bnxt_rx_ring\",\n+\t\t\t\t\t sizeof(struct bnxt_rx_ring_info),\n+\t\t\t\t\t RTE_CACHE_LINE_SIZE, socket_id);\n+\t\tif (rxr == NULL)\n+\t\t\treturn -ENOMEM;\n+\t\trxq->rx_ring = rxr;\n+\t}\n \n-\tcpr = rte_zmalloc_socket(\"bnxt_rx_ring\",\n-\t\t\t\t sizeof(struct bnxt_cp_ring_info),\n-\t\t\t\t RTE_CACHE_LINE_SIZE, socket_id);\n-\tif (cpr == NULL)\n-\t\treturn -ENOMEM;\n-\trxq->cp_ring = cpr;\n+\tif (rxr->rx_ring_struct == NULL) {\n+\t\tring = rte_zmalloc_socket(\"bnxt_rx_ring_struct\",\n+\t\t\t\t\t   sizeof(struct bnxt_ring),\n+\t\t\t\t\t   RTE_CACHE_LINE_SIZE, socket_id);\n+\t\tif (ring == NULL)\n+\t\t\treturn -ENOMEM;\n+\t\trxr->rx_ring_struct = ring;\n+\t\tring->ring_size = rte_align32pow2(rxq->nb_rx_desc);\n+\t\tring->ring_mask = ring->ring_size - 1;\n+\t\tring->bd = (void *)rxr->rx_desc_ring;\n+\t\tring->bd_dma = rxr->rx_desc_mapping;\n+\n+\t\t/* Allocate extra rx ring entries for vector rx. */\n+\t\tring->vmem_size = sizeof(struct rte_mbuf *) *\n+\t\t\t\t  (ring->ring_size + BNXT_RX_EXTRA_MBUF_ENTRIES);\n+\n+\t\tring->vmem = (void **)&rxr->rx_buf_ring;\n+\t\tring->fw_ring_id = INVALID_HW_RING_ID;\n+\t}\n \n-\tring = rte_zmalloc_socket(\"bnxt_rx_ring_struct\",\n-\t\t\t\t   sizeof(struct bnxt_ring),\n-\t\t\t\t   RTE_CACHE_LINE_SIZE, socket_id);\n-\tif (ring == NULL)\n-\t\treturn -ENOMEM;\n-\tcpr->cp_ring_struct = ring;\n+\tif (rxq->cp_ring != NULL) {\n+\t\tcpr = rxq->cp_ring;\n+\t} else {\n+\t\tcpr = rte_zmalloc_socket(\"bnxt_rx_ring\",\n+\t\t\t\t\t sizeof(struct bnxt_cp_ring_info),\n+\t\t\t\t\t RTE_CACHE_LINE_SIZE, socket_id);\n+\t\tif (cpr == NULL)\n+\t\t\treturn -ENOMEM;\n+\t\trxq->cp_ring = cpr;\n+\t}\n \n-\t/* Allocate two completion slots per entry in desc ring. */\n-\tring->ring_size = rxr->rx_ring_struct->ring_size * 2;\n-\tring->ring_size *= AGG_RING_SIZE_FACTOR;\n+\tif (cpr->cp_ring_struct == NULL) {\n+\t\tring = rte_zmalloc_socket(\"bnxt_rx_ring_struct\",\n+\t\t\t\t\t   sizeof(struct bnxt_ring),\n+\t\t\t\t\t   RTE_CACHE_LINE_SIZE, socket_id);\n+\t\tif (ring == NULL)\n+\t\t\treturn -ENOMEM;\n+\t\tcpr->cp_ring_struct = ring;\n+\n+\t\t/* Allocate two completion slots per entry in desc ring. */\n+\t\tring->ring_size = rxr->rx_ring_struct->ring_size * 2;\n+\t\tif (bnxt_need_agg_ring(rxq->bp->eth_dev))\n+\t\t\tring->ring_size *= AGG_RING_SIZE_FACTOR;\n+\n+\t\tring->ring_size = rte_align32pow2(ring->ring_size);\n+\t\tring->ring_mask = ring->ring_size - 1;\n+\t\tring->bd = (void *)cpr->cp_desc_ring;\n+\t\tring->bd_dma = cpr->cp_desc_mapping;\n+\t\tring->vmem_size = 0;\n+\t\tring->vmem = NULL;\n+\t\tring->fw_ring_id = INVALID_HW_RING_ID;\n+\t}\n \n-\tring->ring_size = rte_align32pow2(ring->ring_size);\n-\tring->ring_mask = ring->ring_size - 1;\n-\tring->bd = (void *)cpr->cp_desc_ring;\n-\tring->bd_dma = cpr->cp_desc_mapping;\n-\tring->vmem_size = 0;\n-\tring->vmem = NULL;\n-\tring->fw_ring_id = INVALID_HW_RING_ID;\n+\tif (!bnxt_need_agg_ring(rxq->bp->eth_dev))\n+\t\treturn 0;\n \n+\trxr = rxq->rx_ring;\n \t/* Allocate Aggregator rings */\n \tring = rte_zmalloc_socket(\"bnxt_rx_ring_struct\",\n \t\t\t\t   sizeof(struct bnxt_ring),\n@@ -1351,6 +1369,9 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq)\n \t\trxr->rx_buf_ring[i] = &rxq->fake_mbuf;\n \t}\n \n+\tif (!bnxt_need_agg_ring(rxq->bp->eth_dev))\n+\t\treturn 0;\n+\n \tring = rxr->ag_ring_struct;\n \ttype = RX_PROD_AGG_BD_TYPE_RX_PROD_AGG;\n \tbnxt_init_rxbds(ring, type, size);\n",
    "prefixes": [
        "1/3"
    ]
}