get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 97425,
    "url": "https://patches.dpdk.org/api/patches/97425/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210827065717.1838258-9-andrew.rybchenko@oktetlabs.ru/",
    "project": {
        "id": 1,
        "url": "https://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": "<20210827065717.1838258-9-andrew.rybchenko@oktetlabs.ru>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210827065717.1838258-9-andrew.rybchenko@oktetlabs.ru",
    "date": "2021-08-27T06:56:47",
    "name": "[08/38] net/sfc: reserve TxQ and RxQ for port representors",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "b551ea0d079073ffd6c4e45d4e5814354b1e27e9",
    "submitter": {
        "id": 2013,
        "url": "https://patches.dpdk.org/api/people/2013/?format=api",
        "name": "Andrew Rybchenko",
        "email": "Andrew.Rybchenko@oktetlabs.ru"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210827065717.1838258-9-andrew.rybchenko@oktetlabs.ru/mbox/",
    "series": [
        {
            "id": 18492,
            "url": "https://patches.dpdk.org/api/series/18492/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=18492",
            "date": "2021-08-27T06:56:39",
            "name": "net/sfc: support port representors",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/18492/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/97425/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/97425/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 EE2E7A0C43;\n\tFri, 27 Aug 2021 08:58:27 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 8E6D04126C;\n\tFri, 27 Aug 2021 08:58:03 +0200 (CEST)",
            "from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113])\n by mails.dpdk.org (Postfix) with ESMTP id F059040DF4\n for <dev@dpdk.org>; Fri, 27 Aug 2021 08:58:01 +0200 (CEST)",
            "by shelob.oktetlabs.ru (Postfix, from userid 122)\n id C7FD67F6FC; Fri, 27 Aug 2021 09:58:01 +0300 (MSK)",
            "from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17])\n by shelob.oktetlabs.ru (Postfix) with ESMTP id A1D577F6D8;\n Fri, 27 Aug 2021 09:57:33 +0300 (MSK)"
        ],
        "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru",
        "X-Spam-Level": "",
        "X-Spam-Status": "No, score=0.8 required=5.0 tests=ALL_TRUSTED,\n DKIM_ADSP_DISCARD,\n URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2",
        "DKIM-Filter": "OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru A1D577F6D8",
        "Authentication-Results": "shelob.oktetlabs.ru/A1D577F6D8; dkim=none;\n dkim-atps=neutral",
        "From": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "To": "dev@dpdk.org",
        "Cc": "Igor Romanov <igor.romanov@oktetlabs.ru>,\n Andy Moreton <amoreton@xilinx.com>, Ivan Malov <ivan.malov@oktetlabs.ru>",
        "Date": "Fri, 27 Aug 2021 09:56:47 +0300",
        "Message-Id": "<20210827065717.1838258-9-andrew.rybchenko@oktetlabs.ru>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20210827065717.1838258-1-andrew.rybchenko@oktetlabs.ru>",
        "References": "<20210827065717.1838258-1-andrew.rybchenko@oktetlabs.ru>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH 08/38] net/sfc: reserve TxQ and RxQ for port\n representors",
        "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": "From: Igor Romanov <igor.romanov@oktetlabs.ru>\n\nA Tx/Rx queue pair is required to forward traffic between\nport representors and virtual functions.\n\nSigned-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>\nSigned-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\nReviewed-by: Andy Moreton <amoreton@xilinx.com>\nReviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>\n---\n drivers/net/sfc/sfc.c            | 51 ++++++++++++++++++++++++++++++--\n drivers/net/sfc/sfc.h            | 15 ++++++++++\n drivers/net/sfc/sfc_ev.h         | 40 ++++++++++++++++++-------\n drivers/net/sfc/sfc_repr_proxy.c | 12 +++++---\n drivers/net/sfc/sfc_repr_proxy.h |  8 +++++\n drivers/net/sfc/sfc_tx.c         | 29 ++++++++++--------\n 6 files changed, 124 insertions(+), 31 deletions(-)",
    "diff": "diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c\nindex 591b8971b3..9abd6d600b 100644\n--- a/drivers/net/sfc/sfc.c\n+++ b/drivers/net/sfc/sfc.c\n@@ -46,6 +46,12 @@ sfc_repr_supported(const struct sfc_adapter *sa)\n \treturn true;\n }\n \n+bool\n+sfc_repr_available(const struct sfc_adapter_shared *sas)\n+{\n+\treturn sas->nb_repr_rxq > 0 && sas->nb_repr_txq > 0;\n+}\n+\n int\n sfc_dma_alloc(const struct sfc_adapter *sa, const char *name, uint16_t id,\n \t      size_t len, int socket_id, efsys_mem_t *esmp)\n@@ -296,6 +302,41 @@ sfc_estimate_resource_limits(struct sfc_adapter *sa)\n \t\tsas->counters_rxq_allocated = false;\n \t}\n \n+\tif (sfc_repr_supported(sa) &&\n+\t    evq_allocated >= SFC_REPR_PROXY_NB_RXQ_MIN +\n+\t    SFC_REPR_PROXY_NB_TXQ_MIN &&\n+\t    rxq_allocated >= SFC_REPR_PROXY_NB_RXQ_MIN &&\n+\t    txq_allocated >= SFC_REPR_PROXY_NB_TXQ_MIN) {\n+\t\tunsigned int extra;\n+\n+\t\ttxq_allocated -= SFC_REPR_PROXY_NB_TXQ_MIN;\n+\t\trxq_allocated -= SFC_REPR_PROXY_NB_RXQ_MIN;\n+\t\tevq_allocated -= SFC_REPR_PROXY_NB_RXQ_MIN +\n+\t\t\tSFC_REPR_PROXY_NB_TXQ_MIN;\n+\n+\t\tsas->nb_repr_rxq = SFC_REPR_PROXY_NB_RXQ_MIN;\n+\t\tsas->nb_repr_txq = SFC_REPR_PROXY_NB_TXQ_MIN;\n+\n+\t\t/* Allocate extra representor RxQs up to the maximum */\n+\t\textra = MIN(evq_allocated, rxq_allocated);\n+\t\textra = MIN(extra,\n+\t\t\t    SFC_REPR_PROXY_NB_RXQ_MAX - sas->nb_repr_rxq);\n+\t\tevq_allocated -= extra;\n+\t\trxq_allocated -= extra;\n+\t\tsas->nb_repr_rxq += extra;\n+\n+\t\t/* Allocate extra representor TxQs up to the maximum */\n+\t\textra = MIN(evq_allocated, txq_allocated);\n+\t\textra = MIN(extra,\n+\t\t\t    SFC_REPR_PROXY_NB_TXQ_MAX - sas->nb_repr_txq);\n+\t\tevq_allocated -= extra;\n+\t\ttxq_allocated -= extra;\n+\t\tsas->nb_repr_txq += extra;\n+\t} else {\n+\t\tsas->nb_repr_rxq = 0;\n+\t\tsas->nb_repr_txq = 0;\n+\t}\n+\n \t/* Add remaining allocated queues */\n \tsa->rxq_max += MIN(rxq_allocated, evq_allocated / 2);\n \tsa->txq_max += MIN(txq_allocated, evq_allocated - sa->rxq_max);\n@@ -313,8 +354,10 @@ sfc_estimate_resource_limits(struct sfc_adapter *sa)\n static int\n sfc_set_drv_limits(struct sfc_adapter *sa)\n {\n+\tstruct sfc_adapter_shared *sas = sfc_sa2shared(sa);\n \tconst struct rte_eth_dev_data *data = sa->eth_dev->data;\n-\tuint32_t rxq_reserved = sfc_nb_reserved_rxq(sfc_sa2shared(sa));\n+\tuint32_t rxq_reserved = sfc_nb_reserved_rxq(sas);\n+\tuint32_t txq_reserved = sfc_nb_txq_reserved(sas);\n \tefx_drv_limits_t lim;\n \n \tmemset(&lim, 0, sizeof(lim));\n@@ -325,10 +368,12 @@ sfc_set_drv_limits(struct sfc_adapter *sa)\n \t * sfc_estimate_resource_limits().\n \t */\n \tlim.edl_min_evq_count = lim.edl_max_evq_count =\n-\t\t1 + data->nb_rx_queues + data->nb_tx_queues + rxq_reserved;\n+\t\t1 + data->nb_rx_queues + data->nb_tx_queues +\n+\t\trxq_reserved + txq_reserved;\n \tlim.edl_min_rxq_count = lim.edl_max_rxq_count =\n \t\tdata->nb_rx_queues + rxq_reserved;\n-\tlim.edl_min_txq_count = lim.edl_max_txq_count = data->nb_tx_queues;\n+\tlim.edl_min_txq_count = lim.edl_max_txq_count =\n+\t\tdata->nb_tx_queues + txq_reserved;\n \n \treturn efx_nic_set_drv_limits(sa->nic, &lim);\n }\ndiff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h\nindex 8f65857f65..79f9d7979e 100644\n--- a/drivers/net/sfc/sfc.h\n+++ b/drivers/net/sfc/sfc.h\n@@ -191,6 +191,8 @@ struct sfc_adapter_shared {\n \tchar\t\t\t\t*dp_tx_name;\n \n \tbool\t\t\t\tcounters_rxq_allocated;\n+\tunsigned int\t\t\tnb_repr_rxq;\n+\tunsigned int\t\t\tnb_repr_txq;\n };\n \n /* Adapter process private data */\n@@ -392,6 +394,19 @@ sfc_nb_counter_rxq(const struct sfc_adapter_shared *sas)\n }\n \n bool sfc_repr_supported(const struct sfc_adapter *sa);\n+bool sfc_repr_available(const struct sfc_adapter_shared *sas);\n+\n+static inline unsigned int\n+sfc_repr_nb_rxq(const struct sfc_adapter_shared *sas)\n+{\n+\treturn sas->nb_repr_rxq;\n+}\n+\n+static inline unsigned int\n+sfc_repr_nb_txq(const struct sfc_adapter_shared *sas)\n+{\n+\treturn sas->nb_repr_txq;\n+}\n \n /** Get the number of milliseconds since boot from the default timer */\n static inline uint64_t\ndiff --git a/drivers/net/sfc/sfc_ev.h b/drivers/net/sfc/sfc_ev.h\nindex b2a0380205..590cfb1694 100644\n--- a/drivers/net/sfc/sfc_ev.h\n+++ b/drivers/net/sfc/sfc_ev.h\n@@ -70,14 +70,21 @@ sfc_mgmt_evq_sw_index(__rte_unused const struct sfc_adapter_shared *sas)\n static inline unsigned int\n sfc_nb_reserved_rxq(const struct sfc_adapter_shared *sas)\n {\n-\treturn sfc_nb_counter_rxq(sas);\n+\treturn sfc_nb_counter_rxq(sas) + sfc_repr_nb_rxq(sas);\n+}\n+\n+/* Return the number of Tx queues reserved for driver's internal use */\n+static inline unsigned int\n+sfc_nb_txq_reserved(const struct sfc_adapter_shared *sas)\n+{\n+\treturn sfc_repr_nb_txq(sas);\n }\n \n static inline unsigned int\n sfc_nb_reserved_evq(const struct sfc_adapter_shared *sas)\n {\n-\t/* An EvQ is required for each reserved RxQ */\n-\treturn 1 + sfc_nb_reserved_rxq(sas);\n+\t/* An EvQ is required for each reserved Rx/Tx queue */\n+\treturn 1 + sfc_nb_reserved_rxq(sas) + sfc_nb_txq_reserved(sas);\n }\n \n /*\n@@ -112,6 +119,7 @@ sfc_counters_rxq_sw_index(const struct sfc_adapter_shared *sas)\n  * Own event queue is allocated for management, each Rx and each Tx queue.\n  * Zero event queue is used for management events.\n  * When counters are supported, one Rx event queue is reserved.\n+ * When representors are supported, Rx and Tx event queues are reserved.\n  * Rx event queues follow reserved event queues.\n  * Tx event queues follow Rx event queues.\n  */\n@@ -150,27 +158,37 @@ sfc_evq_sw_index_by_rxq_sw_index(struct sfc_adapter *sa,\n }\n \n static inline sfc_ethdev_qid_t\n-sfc_ethdev_tx_qid_by_txq_sw_index(__rte_unused struct sfc_adapter_shared *sas,\n+sfc_ethdev_tx_qid_by_txq_sw_index(struct sfc_adapter_shared *sas,\n \t\t\t\t  sfc_sw_index_t txq_sw_index)\n {\n-\t/* Only ethdev queues are present for now */\n-\treturn txq_sw_index;\n+\tif (txq_sw_index < sfc_nb_txq_reserved(sas))\n+\t\treturn SFC_ETHDEV_QID_INVALID;\n+\n+\treturn txq_sw_index - sfc_nb_txq_reserved(sas);\n }\n \n static inline sfc_sw_index_t\n-sfc_txq_sw_index_by_ethdev_tx_qid(__rte_unused struct sfc_adapter_shared *sas,\n+sfc_txq_sw_index_by_ethdev_tx_qid(struct sfc_adapter_shared *sas,\n \t\t\t\t  sfc_ethdev_qid_t ethdev_qid)\n {\n-\t/* Only ethdev queues are present for now */\n-\treturn ethdev_qid;\n+\treturn sfc_nb_txq_reserved(sas) + ethdev_qid;\n }\n \n static inline sfc_sw_index_t\n sfc_evq_sw_index_by_txq_sw_index(struct sfc_adapter *sa,\n \t\t\t\t sfc_sw_index_t txq_sw_index)\n {\n-\treturn sfc_nb_reserved_evq(sfc_sa2shared(sa)) +\n-\t\tsa->eth_dev->data->nb_rx_queues + txq_sw_index;\n+\tstruct sfc_adapter_shared *sas = sfc_sa2shared(sa);\n+\tsfc_ethdev_qid_t ethdev_qid;\n+\n+\tethdev_qid = sfc_ethdev_tx_qid_by_txq_sw_index(sas, txq_sw_index);\n+\tif (ethdev_qid == SFC_ETHDEV_QID_INVALID) {\n+\t\treturn sfc_nb_reserved_evq(sas) - sfc_nb_txq_reserved(sas) +\n+\t\t\ttxq_sw_index;\n+\t}\n+\n+\treturn sfc_nb_reserved_evq(sas) + sa->eth_dev->data->nb_rx_queues +\n+\t\tethdev_qid;\n }\n \n int sfc_ev_attach(struct sfc_adapter *sa);\ndiff --git a/drivers/net/sfc/sfc_repr_proxy.c b/drivers/net/sfc/sfc_repr_proxy.c\nindex eb29376988..6d3962304f 100644\n--- a/drivers/net/sfc/sfc_repr_proxy.c\n+++ b/drivers/net/sfc/sfc_repr_proxy.c\n@@ -29,6 +29,7 @@ sfc_repr_proxy_routine(void *arg)\n int\n sfc_repr_proxy_attach(struct sfc_adapter *sa)\n {\n+\tstruct sfc_adapter_shared * const sas = sfc_sa2shared(sa);\n \tstruct sfc_repr_proxy *rp = &sa->repr_proxy;\n \tstruct rte_service_spec service;\n \tuint32_t cid;\n@@ -37,7 +38,7 @@ sfc_repr_proxy_attach(struct sfc_adapter *sa)\n \n \tsfc_log_init(sa, \"entry\");\n \n-\tif (!sfc_repr_supported(sa)) {\n+\tif (!sfc_repr_available(sas)) {\n \t\tsfc_log_init(sa, \"representors not supported - skip\");\n \t\treturn 0;\n \t}\n@@ -102,11 +103,12 @@ sfc_repr_proxy_attach(struct sfc_adapter *sa)\n void\n sfc_repr_proxy_detach(struct sfc_adapter *sa)\n {\n+\tstruct sfc_adapter_shared * const sas = sfc_sa2shared(sa);\n \tstruct sfc_repr_proxy *rp = &sa->repr_proxy;\n \n \tsfc_log_init(sa, \"entry\");\n \n-\tif (!sfc_repr_supported(sa)) {\n+\tif (!sfc_repr_available(sas)) {\n \t\tsfc_log_init(sa, \"representors not supported - skip\");\n \t\treturn;\n \t}\n@@ -120,6 +122,7 @@ sfc_repr_proxy_detach(struct sfc_adapter *sa)\n int\n sfc_repr_proxy_start(struct sfc_adapter *sa)\n {\n+\tstruct sfc_adapter_shared * const sas = sfc_sa2shared(sa);\n \tstruct sfc_repr_proxy *rp = &sa->repr_proxy;\n \tint rc;\n \n@@ -129,7 +132,7 @@ sfc_repr_proxy_start(struct sfc_adapter *sa)\n \t * The condition to start the proxy is insufficient. It will be\n \t * complemented with representor port start/stop support.\n \t */\n-\tif (!sfc_repr_supported(sa)) {\n+\tif (!sfc_repr_available(sas)) {\n \t\tsfc_log_init(sa, \"representors not supported - skip\");\n \t\treturn 0;\n \t}\n@@ -180,12 +183,13 @@ sfc_repr_proxy_start(struct sfc_adapter *sa)\n void\n sfc_repr_proxy_stop(struct sfc_adapter *sa)\n {\n+\tstruct sfc_adapter_shared * const sas = sfc_sa2shared(sa);\n \tstruct sfc_repr_proxy *rp = &sa->repr_proxy;\n \tint rc;\n \n \tsfc_log_init(sa, \"entry\");\n \n-\tif (!sfc_repr_supported(sa)) {\n+\tif (!sfc_repr_available(sas)) {\n \t\tsfc_log_init(sa, \"representors not supported - skip\");\n \t\treturn;\n \t}\ndiff --git a/drivers/net/sfc/sfc_repr_proxy.h b/drivers/net/sfc/sfc_repr_proxy.h\nindex 40ce352335..953b9922c8 100644\n--- a/drivers/net/sfc/sfc_repr_proxy.h\n+++ b/drivers/net/sfc/sfc_repr_proxy.h\n@@ -16,6 +16,14 @@\n extern \"C\" {\n #endif\n \n+/* Number of supported RxQs with different mbuf memory pools */\n+#define SFC_REPR_PROXY_NB_RXQ_MIN\t(1)\n+#define SFC_REPR_PROXY_NB_RXQ_MAX\t(1)\n+\n+/* One TxQ is required and sufficient for port representors support */\n+#define SFC_REPR_PROXY_NB_TXQ_MIN\t(1)\n+#define SFC_REPR_PROXY_NB_TXQ_MAX\t(1)\n+\n struct sfc_repr_proxy {\n \tuint32_t\t\t\tservice_core_id;\n \tuint32_t\t\t\tservice_id;\ndiff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c\nindex 49b239f4d2..c1b2e964f8 100644\n--- a/drivers/net/sfc/sfc_tx.c\n+++ b/drivers/net/sfc/sfc_tx.c\n@@ -376,6 +376,8 @@ sfc_tx_configure(struct sfc_adapter *sa)\n \tconst efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);\n \tconst struct rte_eth_conf *dev_conf = &sa->eth_dev->data->dev_conf;\n \tconst unsigned int nb_tx_queues = sa->eth_dev->data->nb_tx_queues;\n+\tconst unsigned int nb_rsvd_tx_queues = sfc_nb_txq_reserved(sas);\n+\tconst unsigned int nb_txq_total = nb_tx_queues + nb_rsvd_tx_queues;\n \tint rc = 0;\n \n \tsfc_log_init(sa, \"nb_tx_queues=%u (old %u)\",\n@@ -395,11 +397,11 @@ sfc_tx_configure(struct sfc_adapter *sa)\n \tif (rc != 0)\n \t\tgoto fail_check_mode;\n \n-\tif (nb_tx_queues == sas->txq_count)\n+\tif (nb_txq_total == sas->txq_count)\n \t\tgoto done;\n \n \tif (sas->txq_info == NULL) {\n-\t\tsas->txq_info = rte_calloc_socket(\"sfc-txqs\", nb_tx_queues,\n+\t\tsas->txq_info = rte_calloc_socket(\"sfc-txqs\", nb_txq_total,\n \t\t\t\t\t\t  sizeof(sas->txq_info[0]), 0,\n \t\t\t\t\t\t  sa->socket_id);\n \t\tif (sas->txq_info == NULL)\n@@ -410,7 +412,7 @@ sfc_tx_configure(struct sfc_adapter *sa)\n \t\t * since it should not be shared.\n \t\t */\n \t\trc = ENOMEM;\n-\t\tsa->txq_ctrl = calloc(nb_tx_queues, sizeof(sa->txq_ctrl[0]));\n+\t\tsa->txq_ctrl = calloc(nb_txq_total, sizeof(sa->txq_ctrl[0]));\n \t\tif (sa->txq_ctrl == NULL)\n \t\t\tgoto fail_txqs_ctrl_alloc;\n \t} else {\n@@ -422,23 +424,23 @@ sfc_tx_configure(struct sfc_adapter *sa)\n \n \t\tnew_txq_info =\n \t\t\trte_realloc(sas->txq_info,\n-\t\t\t\t    nb_tx_queues * sizeof(sas->txq_info[0]), 0);\n-\t\tif (new_txq_info == NULL && nb_tx_queues > 0)\n+\t\t\t\t    nb_txq_total * sizeof(sas->txq_info[0]), 0);\n+\t\tif (new_txq_info == NULL && nb_txq_total > 0)\n \t\t\tgoto fail_txqs_realloc;\n \n \t\tnew_txq_ctrl = realloc(sa->txq_ctrl,\n-\t\t\t\t       nb_tx_queues * sizeof(sa->txq_ctrl[0]));\n-\t\tif (new_txq_ctrl == NULL && nb_tx_queues > 0)\n+\t\t\t\t       nb_txq_total * sizeof(sa->txq_ctrl[0]));\n+\t\tif (new_txq_ctrl == NULL && nb_txq_total > 0)\n \t\t\tgoto fail_txqs_ctrl_realloc;\n \n \t\tsas->txq_info = new_txq_info;\n \t\tsa->txq_ctrl = new_txq_ctrl;\n-\t\tif (nb_tx_queues > sas->ethdev_txq_count) {\n-\t\t\tmemset(&sas->txq_info[sas->ethdev_txq_count], 0,\n-\t\t\t       (nb_tx_queues - sas->ethdev_txq_count) *\n+\t\tif (nb_txq_total > sas->txq_count) {\n+\t\t\tmemset(&sas->txq_info[sas->txq_count], 0,\n+\t\t\t       (nb_txq_total - sas->txq_count) *\n \t\t\t       sizeof(sas->txq_info[0]));\n-\t\t\tmemset(&sa->txq_ctrl[sas->ethdev_txq_count], 0,\n-\t\t\t       (nb_tx_queues - sas->ethdev_txq_count) *\n+\t\t\tmemset(&sa->txq_ctrl[sas->txq_count], 0,\n+\t\t\t       (nb_txq_total - sas->txq_count) *\n \t\t\t       sizeof(sa->txq_ctrl[0]));\n \t\t}\n \t}\n@@ -455,7 +457,8 @@ sfc_tx_configure(struct sfc_adapter *sa)\n \t\tsas->ethdev_txq_count++;\n \t}\n \n-\tsas->txq_count = sas->ethdev_txq_count;\n+\t/* TODO: initialize reserved queues when supported. */\n+\tsas->txq_count = sas->ethdev_txq_count + nb_rsvd_tx_queues;\n \n done:\n \treturn 0;\n",
    "prefixes": [
        "08/38"
    ]
}