get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 56394,
    "url": "http://patches.dpdk.org/api/patches/56394/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20190712095729.159767-3-jasvinder.singh@intel.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": "<20190712095729.159767-3-jasvinder.singh@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190712095729.159767-3-jasvinder.singh@intel.com",
    "date": "2019-07-12T09:57:20",
    "name": "[v4,02/11] sched: add config flexibility to tc queue sizes",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "7ff0f67ddcb4b1e7f901494331d31ef9627f86de",
    "submitter": {
        "id": 285,
        "url": "http://patches.dpdk.org/api/people/285/?format=api",
        "name": "Jasvinder Singh",
        "email": "jasvinder.singh@intel.com"
    },
    "delegate": {
        "id": 10018,
        "url": "http://patches.dpdk.org/api/users/10018/?format=api",
        "username": "cristian_dumitrescu",
        "first_name": "Cristian",
        "last_name": "Dumitrescu",
        "email": "cristian.dumitrescu@intel.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20190712095729.159767-3-jasvinder.singh@intel.com/mbox/",
    "series": [
        {
            "id": 5473,
            "url": "http://patches.dpdk.org/api/series/5473/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=5473",
            "date": "2019-07-12T09:57:18",
            "name": "sched: feature enhancements",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/5473/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/56394/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/56394/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 917141B9DF;\n\tFri, 12 Jul 2019 11:57:27 +0200 (CEST)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n\tby dpdk.org (Postfix) with ESMTP id 687181B9BF\n\tfor <dev@dpdk.org>; Fri, 12 Jul 2019 11:57:23 +0200 (CEST)",
            "from orsmga005.jf.intel.com ([10.7.209.41])\n\tby fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t12 Jul 2019 02:57:22 -0700",
            "from silpixa00381635.ir.intel.com (HELO\n\tsilpixa00381635.ger.corp.intel.com) ([10.237.223.4])\n\tby orsmga005.jf.intel.com with ESMTP; 12 Jul 2019 02:57:20 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.63,482,1557212400\"; d=\"scan'208\";a=\"341656797\"",
        "From": "Jasvinder Singh <jasvinder.singh@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "cristian.dumitrescu@intel.com, Abraham Tovar <abrahamx.tovar@intel.com>, \n\tLukasz Krakowiak <lukaszx.krakowiak@intel.com>",
        "Date": "Fri, 12 Jul 2019 10:57:20 +0100",
        "Message-Id": "<20190712095729.159767-3-jasvinder.singh@intel.com>",
        "X-Mailer": "git-send-email 2.21.0",
        "In-Reply-To": "<20190712095729.159767-1-jasvinder.singh@intel.com>",
        "References": "<20190711102659.59001-2-jasvinder.singh@intel.com>\n\t<20190712095729.159767-1-jasvinder.singh@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v4 02/11] sched: add config flexibility to tc\n\tqueue sizes",
        "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\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add support for zero queue sizes of the traffic classes. The queues\nwhich are not used can be set to zero size. This helps in reducing\nmemory footprint of the hierarchical scheduler.\n\nSigned-off-by: Jasvinder Singh <jasvinder.singh@intel.com>\nSigned-off-by: Abraham Tovar <abrahamx.tovar@intel.com>\nSigned-off-by: Lukasz Krakowiak <lukaszx.krakowiak@intel.com>\n---\n lib/librte_sched/rte_sched.c | 354 +++++++++++++++++++----------------\n lib/librte_sched/rte_sched.h |  12 +-\n 2 files changed, 198 insertions(+), 168 deletions(-)",
    "diff": "diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c\nindex b1f521794..411924c36 100644\n--- a/lib/librte_sched/rte_sched.c\n+++ b/lib/librte_sched/rte_sched.c\n@@ -149,15 +149,15 @@ struct rte_sched_grinder {\n \tstruct rte_sched_pipe_profile *pipe_params;\n \n \t/* TC cache */\n-\tuint8_t tccache_qmask[4];\n-\tuint32_t tccache_qindex[4];\n+\tuint8_t tccache_qmask[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];\n+\tuint32_t tccache_qindex[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];\n \tuint32_t tccache_w;\n \tuint32_t tccache_r;\n \n \t/* Current TC */\n \tuint32_t tc_index;\n-\tstruct rte_sched_queue *queue[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];\n-\tstruct rte_mbuf **qbase[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];\n+\tstruct rte_sched_queue *queue[RTE_SCHED_MAX_QUEUES_PER_TC];\n+\tstruct rte_mbuf **qbase[RTE_SCHED_MAX_QUEUES_PER_TC];\n \tuint32_t qindex[RTE_SCHED_MAX_QUEUES_PER_TC];\n \tuint16_t qsize[RTE_SCHED_MAX_QUEUES_PER_TC];\n \tuint32_t qmask;\n@@ -178,7 +178,7 @@ struct rte_sched_port {\n \tuint32_t rate;\n \tuint32_t mtu;\n \tuint32_t frame_overhead;\n-\tuint16_t qsize[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];\n+\tuint16_t qsize[RTE_SCHED_QUEUES_PER_PIPE];\n \tuint32_t n_pipe_profiles;\n \tuint32_t pipe_tc3_rate_max;\n #ifdef RTE_SCHED_RED\n@@ -260,14 +260,13 @@ rte_sched_port_qbase(struct rte_sched_port *port, uint32_t qindex)\n static inline uint16_t\n rte_sched_port_qsize(struct rte_sched_port *port, uint32_t qindex)\n {\n-\tuint32_t tc = (qindex >> 2) & 0x3;\n-\n-\treturn port->qsize[tc];\n+\tuint32_t qpos = qindex & 0xF;\n+\treturn port->qsize[qpos];\n }\n \n static int\n pipe_profile_check(struct rte_sched_pipe_params *params,\n-\tuint32_t rate)\n+\tuint32_t rate, uint16_t *qsize)\n {\n \tuint32_t i;\n \n@@ -285,12 +284,17 @@ pipe_profile_check(struct rte_sched_pipe_params *params,\n \t\treturn -12;\n \n \t/* TC rate: non-zero, less than pipe rate */\n-\tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {\n-\t\tif (params->tc_rate[i] == 0 ||\n-\t\t\tparams->tc_rate[i] > params->tb_rate)\n+\tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASS_BE; i++) {\n+\t\tif ((qsize[i] == 0 && params->tc_rate[i] != 0) ||\n+\t\t\t(qsize[i] != 0 && (params->tc_rate[i] == 0 ||\n+\t\t\tparams->tc_rate[i] > params->tb_rate)))\n \t\t\treturn -13;\n+\n \t}\n \n+\tif (params->tc_rate[RTE_SCHED_TRAFFIC_CLASS_BE] == 0)\n+\t\treturn -13;\n+\n \t/* TC period: non-zero */\n \tif (params->tc_period == 0)\n \t\treturn -14;\n@@ -302,8 +306,10 @@ pipe_profile_check(struct rte_sched_pipe_params *params,\n #endif\n \n \t/* Queue WRR weights: non-zero */\n-\tfor (i = 0; i < RTE_SCHED_QUEUES_PER_PIPE; i++) {\n-\t\tif (params->wrr_weights[i] == 0)\n+\tfor (i = 0; i < RTE_SCHED_BE_QUEUES_PER_PIPE; i++) {\n+\t\tuint32_t qindex = RTE_SCHED_TRAFFIC_CLASS_BE + i;\n+\t\tif ((qsize[qindex] != 0 && params->wrr_weights[i] == 0) ||\n+\t\t\t(qsize[qindex] == 0 && params->wrr_weights[i] != 0))\n \t\t\treturn -16;\n \t}\n \treturn 0;\n@@ -343,10 +349,10 @@ rte_sched_port_check_params(struct rte_sched_port_params *params)\n \t/* qsize: non-zero, power of 2,\n \t * no bigger than 32K (due to 16-bit read/write pointers)\n \t */\n-\tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {\n+\tfor (i = 0; i < RTE_SCHED_QUEUES_PER_PIPE; i++) {\n \t\tuint16_t qsize = params->qsize[i];\n-\n-\t\tif (qsize == 0 || !rte_is_power_of_2(qsize))\n+\t\tif ((qsize != 0 && !rte_is_power_of_2(qsize)) ||\n+\t\t\t((i == RTE_SCHED_TRAFFIC_CLASS_BE) && (qsize == 0)))\n \t\t\treturn -8;\n \t}\n \n@@ -360,7 +366,7 @@ rte_sched_port_check_params(struct rte_sched_port_params *params)\n \t\tstruct rte_sched_pipe_params *p = params->pipe_profiles + i;\n \t\tint status;\n \n-\t\tstatus = pipe_profile_check(p, params->rate);\n+\t\tstatus = pipe_profile_check(p, params->rate, &params->qsize[0]);\n \t\tif (status != 0)\n \t\t\treturn status;\n \t}\n@@ -389,9 +395,9 @@ rte_sched_port_get_array_base(struct rte_sched_port_params *params, enum rte_sch\n \tuint32_t base, i;\n \n \tsize_per_pipe_queue_array = 0;\n-\tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {\n-\t\tsize_per_pipe_queue_array += RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS\n-\t\t\t* params->qsize[i] * sizeof(struct rte_mbuf *);\n+\tfor (i = 0; i < RTE_SCHED_QUEUES_PER_PIPE; i++) {\n+\t\tsize_per_pipe_queue_array +=\n+\t\t\tparams->qsize[i] * sizeof(struct rte_mbuf *);\n \t}\n \tsize_queue_array = n_pipes_per_port * size_per_pipe_queue_array;\n \n@@ -451,31 +457,12 @@ rte_sched_port_get_memory_footprint(struct rte_sched_port_params *params)\n static void\n rte_sched_port_config_qsize(struct rte_sched_port *port)\n {\n-\t/* TC 0 */\n+\tuint32_t i;\n \tport->qsize_add[0] = 0;\n-\tport->qsize_add[1] = port->qsize_add[0] + port->qsize[0];\n-\tport->qsize_add[2] = port->qsize_add[1] + port->qsize[0];\n-\tport->qsize_add[3] = port->qsize_add[2] + port->qsize[0];\n-\n-\t/* TC 1 */\n-\tport->qsize_add[4] = port->qsize_add[3] + port->qsize[0];\n-\tport->qsize_add[5] = port->qsize_add[4] + port->qsize[1];\n-\tport->qsize_add[6] = port->qsize_add[5] + port->qsize[1];\n-\tport->qsize_add[7] = port->qsize_add[6] + port->qsize[1];\n-\n-\t/* TC 2 */\n-\tport->qsize_add[8] = port->qsize_add[7] + port->qsize[1];\n-\tport->qsize_add[9] = port->qsize_add[8] + port->qsize[2];\n-\tport->qsize_add[10] = port->qsize_add[9] + port->qsize[2];\n-\tport->qsize_add[11] = port->qsize_add[10] + port->qsize[2];\n-\n-\t/* TC 3 */\n-\tport->qsize_add[12] = port->qsize_add[11] + port->qsize[2];\n-\tport->qsize_add[13] = port->qsize_add[12] + port->qsize[3];\n-\tport->qsize_add[14] = port->qsize_add[13] + port->qsize[3];\n-\tport->qsize_add[15] = port->qsize_add[14] + port->qsize[3];\n-\n-\tport->qsize_sum = port->qsize_add[15] + port->qsize[3];\n+\tfor (i = 1; i < RTE_SCHED_QUEUES_PER_PIPE; i++)\n+\t\tport->qsize_add[i] = port->qsize_add[i-1] + port->qsize[i-1];\n+\n+\tport->qsize_sum = port->qsize_add[15] + port->qsize[15];\n }\n \n static void\n@@ -484,10 +471,11 @@ rte_sched_port_log_pipe_profile(struct rte_sched_port *port, uint32_t i)\n \tstruct rte_sched_pipe_profile *p = port->pipe_profiles + i;\n \n \tRTE_LOG(DEBUG, SCHED, \"Low level config for pipe profile %u:\\n\"\n-\t\t\"    Token bucket: period = %u, credits per period = %u, size = %u\\n\"\n-\t\t\"    Traffic classes: period = %u, credits per period = [%u, %u, %u, %u]\\n\"\n-\t\t\"    Traffic class 3 oversubscription: weight = %hhu\\n\"\n-\t\t\"    WRR cost: [%hhu, %hhu, %hhu, %hhu]\\n\",\n+\t\t\"\tToken bucket: period = %u, credits per period = %u, size = %u\\n\"\n+\t\t\"\tTraffic classes: period = %u,\\n\"\n+\t\t\"\tcredits per period = [%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u]\\n\"\n+\t\t\"\tBest-effort traffic class oversubscription: weight = %hhu\\n\"\n+\t\t\"\tWRR cost: [%hhu, %hhu, %hhu, %hhu]\\n\",\n \t\ti,\n \n \t\t/* Token bucket */\n@@ -501,8 +489,17 @@ rte_sched_port_log_pipe_profile(struct rte_sched_port *port, uint32_t i)\n \t\tp->tc_credits_per_period[1],\n \t\tp->tc_credits_per_period[2],\n \t\tp->tc_credits_per_period[3],\n-\n-\t\t/* Traffic class 3 oversubscription */\n+\t\tp->tc_credits_per_period[4],\n+\t\tp->tc_credits_per_period[5],\n+\t\tp->tc_credits_per_period[6],\n+\t\tp->tc_credits_per_period[7],\n+\t\tp->tc_credits_per_period[8],\n+\t\tp->tc_credits_per_period[9],\n+\t\tp->tc_credits_per_period[10],\n+\t\tp->tc_credits_per_period[11],\n+\t\tp->tc_credits_per_period[12],\n+\n+\t\t/* Best-effort traffic class oversubscription */\n \t\tp->tc_ov_weight,\n \n \t\t/* WRR */\n@@ -548,9 +545,10 @@ rte_sched_pipe_profile_convert(struct rte_sched_port *port,\n \t\t\t\t\t\trate);\n \n \tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)\n-\t\tdst->tc_credits_per_period[i]\n-\t\t\t= rte_sched_time_ms_to_bytes(src->tc_period,\n-\t\t\t\tsrc->tc_rate[i]);\n+\t\tif (port->qsize[i])\n+\t\t\tdst->tc_credits_per_period[i]\n+\t\t\t\t= rte_sched_time_ms_to_bytes(src->tc_period,\n+\t\t\t\t\tsrc->tc_rate[i]);\n \n #ifdef RTE_SCHED_SUBPORT_TC_OV\n \tdst->tc_ov_weight = src->tc_ov_weight;\n@@ -558,7 +556,7 @@ rte_sched_pipe_profile_convert(struct rte_sched_port *port,\n \n \t/* WRR queues */\n \tfor (i = 0; i < RTE_SCHED_BE_QUEUES_PER_PIPE; i++)\n-\t\tif (port->qsize[i])\n+\t\tif (port->qsize[RTE_SCHED_TRAFFIC_CLASS_BE + i])\n \t\t\tdst->n_be_queues++;\n \n \tif (dst->n_be_queues == 1)\n@@ -620,7 +618,7 @@ rte_sched_port_config_pipe_profile_table(struct rte_sched_port *port,\n \tport->pipe_tc3_rate_max = 0;\n \tfor (i = 0; i < port->n_pipe_profiles; i++) {\n \t\tstruct rte_sched_pipe_params *src = params->pipe_profiles + i;\n-\t\tuint32_t pipe_tc3_rate = src->tc_rate[3];\n+\t\tuint32_t pipe_tc3_rate = src->tc_rate[RTE_SCHED_TRAFFIC_CLASS_BE];\n \n \t\tif (port->pipe_tc3_rate_max < pipe_tc3_rate)\n \t\t\tport->pipe_tc3_rate_max = pipe_tc3_rate;\n@@ -762,12 +760,14 @@ rte_sched_port_free(struct rte_sched_port *port)\n \tfor (qindex = 0; qindex < n_queues_per_port; qindex++) {\n \t\tstruct rte_mbuf **mbufs = rte_sched_port_qbase(port, qindex);\n \t\tuint16_t qsize = rte_sched_port_qsize(port, qindex);\n-\t\tstruct rte_sched_queue *queue = port->queue + qindex;\n-\t\tuint16_t qr = queue->qr & (qsize - 1);\n-\t\tuint16_t qw = queue->qw & (qsize - 1);\n+\t\tif (qsize != 0) {\n+\t\t\tstruct rte_sched_queue *queue = port->queue + qindex;\n+\t\t\tuint16_t qr = queue->qr & (qsize - 1);\n+\t\t\tuint16_t qw = queue->qw & (qsize - 1);\n \n-\t\tfor (; qr != qw; qr = (qr + 1) & (qsize - 1))\n-\t\t\trte_pktmbuf_free(mbufs[qr]);\n+\t\t\tfor (; qr != qw; qr = (qr + 1) & (qsize - 1))\n+\t\t\t\trte_pktmbuf_free(mbufs[qr]);\n+\t\t}\n \t}\n \n \trte_bitmap_free(port->bmp);\n@@ -780,9 +780,10 @@ rte_sched_port_log_subport_config(struct rte_sched_port *port, uint32_t i)\n \tstruct rte_sched_subport *s = port->subport + i;\n \n \tRTE_LOG(DEBUG, SCHED, \"Low level config for subport %u:\\n\"\n-\t\t\"    Token bucket: period = %u, credits per period = %u, size = %u\\n\"\n-\t\t\"    Traffic classes: period = %u, credits per period = [%u, %u, %u, %u]\\n\"\n-\t\t\"    Traffic class 3 oversubscription: wm min = %u, wm max = %u\\n\",\n+\t\t\"\tToken bucket: period = %u, credits per period = %u, size = %u\\n\"\n+\t\t\"\tTraffic classes: period = %u\\n\"\n+\t\t\"\tcredits per period = [%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u]\\n\"\n+\t\t\"\tBest effort traffic class oversubscription: wm min = %u, wm max = %u\\n\",\n \t\ti,\n \n \t\t/* Token bucket */\n@@ -796,8 +797,17 @@ rte_sched_port_log_subport_config(struct rte_sched_port *port, uint32_t i)\n \t\ts->tc_credits_per_period[1],\n \t\ts->tc_credits_per_period[2],\n \t\ts->tc_credits_per_period[3],\n-\n-\t\t/* Traffic class 3 oversubscription */\n+\t\ts->tc_credits_per_period[4],\n+\t\ts->tc_credits_per_period[5],\n+\t\ts->tc_credits_per_period[6],\n+\t\ts->tc_credits_per_period[7],\n+\t\ts->tc_credits_per_period[8],\n+\t\ts->tc_credits_per_period[9],\n+\t\ts->tc_credits_per_period[10],\n+\t\ts->tc_credits_per_period[11],\n+\t\ts->tc_credits_per_period[12],\n+\n+\t\t/* Best effort traffic class oversubscription */\n \t\ts->tc_ov_wm_min,\n \t\ts->tc_ov_wm_max);\n }\n@@ -808,7 +818,7 @@ rte_sched_subport_config(struct rte_sched_port *port,\n \tstruct rte_sched_subport_params *params)\n {\n \tstruct rte_sched_subport *s;\n-\tuint32_t i;\n+\tuint32_t i, j;\n \n \t/* Check user parameters */\n \tif (port == NULL ||\n@@ -822,12 +832,24 @@ rte_sched_subport_config(struct rte_sched_port *port,\n \tif (params->tb_size == 0)\n \t\treturn -3;\n \n-\tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {\n-\t\tif (params->tc_rate[i] == 0 ||\n-\t\t    params->tc_rate[i] > params->tb_rate)\n-\t\t\treturn -4;\n+\tfor (i = 0, j = 0; i < RTE_SCHED_QUEUES_PER_PIPE; i++) {\n+\t\tuint32_t tc_rate = params->tc_rate[j];\n+\t\tuint16_t qsize = port->qsize[i];\n+\n+\t\tif (((qsize == 0) &&\n+\t\t\t((tc_rate != 0) && (j != RTE_SCHED_TRAFFIC_CLASS_BE))) ||\n+\t\t\t((qsize != 0) && (tc_rate == 0)) ||\n+\t\t\t(tc_rate > params->tb_rate))\n+\t\t\treturn -3;\n+\n+\t\tif (j < RTE_SCHED_TRAFFIC_CLASS_BE)\n+\t\t\tj++;\n \t}\n \n+\tif (port->qsize[RTE_SCHED_TRAFFIC_CLASS_BE] == 0 ||\n+\t\tparams->tc_rate[RTE_SCHED_TRAFFIC_CLASS_BE] == 0)\n+\t\treturn -3;\n+\n \tif (params->tc_period == 0)\n \t\treturn -5;\n \n@@ -851,13 +873,16 @@ rte_sched_subport_config(struct rte_sched_port *port,\n \t/* Traffic Classes (TCs) */\n \ts->tc_period = rte_sched_time_ms_to_bytes(params->tc_period, port->rate);\n \tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {\n-\t\ts->tc_credits_per_period[i]\n-\t\t\t= rte_sched_time_ms_to_bytes(params->tc_period,\n-\t\t\t\t\t\t     params->tc_rate[i]);\n+\t\tif (port->qsize[i])\n+\t\t\ts->tc_credits_per_period[i]\n+\t\t\t\t= rte_sched_time_ms_to_bytes(params->tc_period,\n+\t\t\t\t\t\t\t\t params->tc_rate[i]);\n+\n \t}\n \ts->tc_time = port->time + s->tc_period;\n \tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)\n-\t\ts->tc_credits[i] = s->tc_credits_per_period[i];\n+\t\tif (port->qsize[i])\n+\t\t\ts->tc_credits[i] = s->tc_credits_per_period[i];\n \n #ifdef RTE_SCHED_SUBPORT_TC_OV\n \t/* TC oversubscription */\n@@ -910,9 +935,9 @@ rte_sched_pipe_config(struct rte_sched_port *port,\n \t\tparams = port->pipe_profiles + p->profile;\n \n #ifdef RTE_SCHED_SUBPORT_TC_OV\n-\t\tdouble subport_tc3_rate = (double) s->tc_credits_per_period[3]\n+\t\tdouble subport_tc3_rate = (double) s->tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE]\n \t\t\t/ (double) s->tc_period;\n-\t\tdouble pipe_tc3_rate = (double) params->tc_credits_per_period[3]\n+\t\tdouble pipe_tc3_rate = (double) params->tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE]\n \t\t\t/ (double) params->tc_period;\n \t\tuint32_t tc3_ov = s->tc_ov;\n \n@@ -945,15 +970,19 @@ rte_sched_pipe_config(struct rte_sched_port *port,\n \n \t/* Traffic Classes (TCs) */\n \tp->tc_time = port->time + params->tc_period;\n+\tp->n_be_queues = params->n_be_queues;\n \tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)\n-\t\tp->tc_credits[i] = params->tc_credits_per_period[i];\n+\t\tif (port->qsize[i])\n+\t\t\tp->tc_credits[i] = params->tc_credits_per_period[i];\n \n #ifdef RTE_SCHED_SUBPORT_TC_OV\n \t{\n \t\t/* Subport TC3 oversubscription */\n-\t\tdouble subport_tc3_rate = (double) s->tc_credits_per_period[3]\n+\t\tdouble subport_tc3_rate =\n+\t\t\t(double) s->tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE]\n \t\t\t/ (double) s->tc_period;\n-\t\tdouble pipe_tc3_rate = (double) params->tc_credits_per_period[3]\n+\t\tdouble pipe_tc3_rate =\n+\t\t\t(double) params->tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE]\n \t\t\t/ (double) params->tc_period;\n \t\tuint32_t tc3_ov = s->tc_ov;\n \n@@ -992,7 +1021,7 @@ rte_sched_port_pipe_profile_add(struct rte_sched_port *port,\n \t\treturn -2;\n \n \t/* Pipe params */\n-\tstatus = pipe_profile_check(params, port->rate);\n+\tstatus = pipe_profile_check(params, port->rate, &port->qsize[0]);\n \tif (status != 0)\n \t\treturn status;\n \n@@ -1008,8 +1037,8 @@ rte_sched_port_pipe_profile_add(struct rte_sched_port *port,\n \t*pipe_profile_id = port->n_pipe_profiles;\n \tport->n_pipe_profiles++;\n \n-\tif (port->pipe_tc3_rate_max < params->tc_rate[3])\n-\t\tport->pipe_tc3_rate_max = params->tc_rate[3];\n+\tif (port->pipe_tc3_rate_max < params->tc_rate[RTE_SCHED_TRAFFIC_CLASS_BE])\n+\t\tport->pipe_tc3_rate_max = params->tc_rate[RTE_SCHED_TRAFFIC_CLASS_BE];\n \n \trte_sched_port_log_pipe_profile(port, *pipe_profile_id);\n \n@@ -1020,15 +1049,12 @@ static inline uint32_t\n rte_sched_port_qindex(struct rte_sched_port *port,\n \tuint32_t subport,\n \tuint32_t pipe,\n-\tuint32_t traffic_class,\n \tuint32_t queue)\n {\n \treturn ((subport & (port->n_subports_per_port - 1)) <<\n \t\t\t(port->n_pipes_per_subport_log2 + 4)) |\n \t\t\t((pipe & (port->n_pipes_per_subport - 1)) << 4) |\n-\t\t\t((traffic_class &\n-\t\t\t    (RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE - 1)) << 2) |\n-\t\t\t(queue & (RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS - 1));\n+\t\t\t(queue & (RTE_SCHED_QUEUES_PER_PIPE - 1));\n }\n \n void\n@@ -1038,8 +1064,8 @@ rte_sched_port_pkt_write(struct rte_sched_port *port,\n \t\t\t uint32_t traffic_class,\n \t\t\t uint32_t queue, enum rte_color color)\n {\n-\tuint32_t queue_id = rte_sched_port_qindex(port, subport, pipe,\n-\t\t\ttraffic_class, queue);\n+\tuint32_t queue_id = rte_sched_port_qindex(port, subport, pipe, queue);\n+\n \trte_mbuf_sched_set(pkt, queue_id, traffic_class, (uint8_t)color);\n }\n \n@@ -1050,12 +1076,12 @@ rte_sched_port_pkt_read_tree_path(struct rte_sched_port *port,\n \t\t\t\t  uint32_t *traffic_class, uint32_t *queue)\n {\n \tuint32_t queue_id = rte_mbuf_sched_queue_get(pkt);\n+\tuint32_t tc_id = rte_mbuf_sched_traffic_class_get(pkt);\n \n \t*subport = queue_id >> (port->n_pipes_per_subport_log2 + 4);\n \t*pipe = (queue_id >> 4) & (port->n_pipes_per_subport - 1);\n-\t*traffic_class = (queue_id >> 2) &\n-\t\t\t\t(RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE - 1);\n-\t*queue = queue_id & (RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS - 1);\n+\t*traffic_class = tc_id;\n+\t*queue = queue_id & (RTE_SCHED_QUEUES_PER_PIPE - 1);\n }\n \n enum rte_color\n@@ -1136,7 +1162,7 @@ static inline void\n rte_sched_port_update_subport_stats(struct rte_sched_port *port, uint32_t qindex, struct rte_mbuf *pkt)\n {\n \tstruct rte_sched_subport *s = port->subport + (qindex / rte_sched_port_queues_per_subport(port));\n-\tuint32_t tc_index = (qindex >> 2) & 0x3;\n+\tuint32_t tc_index = rte_mbuf_sched_traffic_class_get(pkt);\n \tuint32_t pkt_len = pkt->pkt_len;\n \n \ts->stats.n_pkts_tc[tc_index] += 1;\n@@ -1156,7 +1182,7 @@ rte_sched_port_update_subport_stats_on_drop(struct rte_sched_port *port,\n #endif\n {\n \tstruct rte_sched_subport *s = port->subport + (qindex / rte_sched_port_queues_per_subport(port));\n-\tuint32_t tc_index = (qindex >> 2) & 0x3;\n+\tuint32_t tc_index = rte_mbuf_sched_traffic_class_get(pkt);\n \tuint32_t pkt_len = pkt->pkt_len;\n \n \ts->stats.n_pkts_tc_dropped[tc_index] += 1;\n@@ -1211,7 +1237,7 @@ rte_sched_port_red_drop(struct rte_sched_port *port, struct rte_mbuf *pkt, uint3\n \tuint32_t tc_index;\n \tenum rte_color color;\n \n-\ttc_index = (qindex >> 2) & 0x3;\n+\ttc_index = rte_mbuf_sched_traffic_class_get(pkt);\n \tcolor = rte_sched_port_pkt_read_color(pkt);\n \tred_cfg = &port->red_config[tc_index][color];\n \n@@ -1528,6 +1554,7 @@ grinder_credits_update(struct rte_sched_port *port, uint32_t pos)\n \tstruct rte_sched_pipe *pipe = grinder->pipe;\n \tstruct rte_sched_pipe_profile *params = grinder->pipe_params;\n \tuint64_t n_periods;\n+\tuint32_t i;\n \n \t/* Subport TB */\n \tn_periods = (port->time - subport->tb_time) / subport->tb_period;\n@@ -1543,19 +1570,17 @@ grinder_credits_update(struct rte_sched_port *port, uint32_t pos)\n \n \t/* Subport TCs */\n \tif (unlikely(port->time >= subport->tc_time)) {\n-\t\tsubport->tc_credits[0] = subport->tc_credits_per_period[0];\n-\t\tsubport->tc_credits[1] = subport->tc_credits_per_period[1];\n-\t\tsubport->tc_credits[2] = subport->tc_credits_per_period[2];\n-\t\tsubport->tc_credits[3] = subport->tc_credits_per_period[3];\n+\t\tfor (i = 0; i <= RTE_SCHED_TRAFFIC_CLASS_BE; i++)\n+\t\t\tsubport->tc_credits[i] = subport->tc_credits_per_period[i];\n+\n \t\tsubport->tc_time = port->time + subport->tc_period;\n \t}\n \n \t/* Pipe TCs */\n \tif (unlikely(port->time >= pipe->tc_time)) {\n-\t\tpipe->tc_credits[0] = params->tc_credits_per_period[0];\n-\t\tpipe->tc_credits[1] = params->tc_credits_per_period[1];\n-\t\tpipe->tc_credits[2] = params->tc_credits_per_period[2];\n-\t\tpipe->tc_credits[3] = params->tc_credits_per_period[3];\n+\t\tfor (i = 0; i <= RTE_SCHED_TRAFFIC_CLASS_BE; i++)\n+\t\t\tpipe->tc_credits[i] = params->tc_credits_per_period[i];\n+\n \t\tpipe->tc_time = port->time + params->tc_period;\n \t}\n }\n@@ -1568,21 +1593,29 @@ grinder_tc_ov_credits_update(struct rte_sched_port *port, uint32_t pos)\n \tstruct rte_sched_grinder *grinder = port->grinder + pos;\n \tstruct rte_sched_subport *subport = grinder->subport;\n \tuint32_t tc_ov_consumption[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];\n-\tuint32_t tc_ov_consumption_max;\n+\tuint32_t tc_consumption = 0, tc_ov_consumption_max;\n \tuint32_t tc_ov_wm = subport->tc_ov_wm;\n+\tuint32_t i;\n \n \tif (subport->tc_ov == 0)\n \t\treturn subport->tc_ov_wm_max;\n \n-\ttc_ov_consumption[0] = subport->tc_credits_per_period[0] - subport->tc_credits[0];\n-\ttc_ov_consumption[1] = subport->tc_credits_per_period[1] - subport->tc_credits[1];\n-\ttc_ov_consumption[2] = subport->tc_credits_per_period[2] - subport->tc_credits[2];\n-\ttc_ov_consumption[3] = subport->tc_credits_per_period[3] - subport->tc_credits[3];\n+\tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASS_BE; i++) {\n+\t\ttc_ov_consumption[i] =\n+\t\t\tsubport->tc_credits_per_period[i] - subport->tc_credits[i];\n+\t\ttc_consumption += tc_ov_consumption[i];\n+\t}\n+\n+\ttc_ov_consumption[RTE_SCHED_TRAFFIC_CLASS_BE] =\n+\t\tsubport->tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE] -\n+\t\tsubport->tc_credits[RTE_SCHED_TRAFFIC_CLASS_BE];\n+\n \n-\ttc_ov_consumption_max = subport->tc_credits_per_period[3] -\n-\t\t(tc_ov_consumption[0] + tc_ov_consumption[1] + tc_ov_consumption[2]);\n+\ttc_ov_consumption_max =\n+\t\tsubport->tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE] - tc_consumption;\n \n-\tif (tc_ov_consumption[3] > (tc_ov_consumption_max - port->mtu)) {\n+\tif (tc_ov_consumption[RTE_SCHED_TRAFFIC_CLASS_BE] >\n+\t\t(tc_ov_consumption_max - port->mtu)) {\n \t\ttc_ov_wm  -= tc_ov_wm >> 7;\n \t\tif (tc_ov_wm < subport->tc_ov_wm_min)\n \t\t\ttc_ov_wm = subport->tc_ov_wm_min;\n@@ -1605,6 +1638,7 @@ grinder_credits_update(struct rte_sched_port *port, uint32_t pos)\n \tstruct rte_sched_pipe *pipe = grinder->pipe;\n \tstruct rte_sched_pipe_profile *params = grinder->pipe_params;\n \tuint64_t n_periods;\n+\tuint32_t i;\n \n \t/* Subport TB */\n \tn_periods = (port->time - subport->tb_time) / subport->tb_period;\n@@ -1622,10 +1656,8 @@ grinder_credits_update(struct rte_sched_port *port, uint32_t pos)\n \tif (unlikely(port->time >= subport->tc_time)) {\n \t\tsubport->tc_ov_wm = grinder_tc_ov_credits_update(port, pos);\n \n-\t\tsubport->tc_credits[0] = subport->tc_credits_per_period[0];\n-\t\tsubport->tc_credits[1] = subport->tc_credits_per_period[1];\n-\t\tsubport->tc_credits[2] = subport->tc_credits_per_period[2];\n-\t\tsubport->tc_credits[3] = subport->tc_credits_per_period[3];\n+\t\tfor (i = 0; i <= RTE_SCHED_TRAFFIC_CLASS_BE; i++)\n+\t\t\tsubport->tc_credits[i] = subport->tc_credits_per_period[i];\n \n \t\tsubport->tc_time = port->time + subport->tc_period;\n \t\tsubport->tc_ov_period_id++;\n@@ -1633,10 +1665,8 @@ grinder_credits_update(struct rte_sched_port *port, uint32_t pos)\n \n \t/* Pipe TCs */\n \tif (unlikely(port->time >= pipe->tc_time)) {\n-\t\tpipe->tc_credits[0] = params->tc_credits_per_period[0];\n-\t\tpipe->tc_credits[1] = params->tc_credits_per_period[1];\n-\t\tpipe->tc_credits[2] = params->tc_credits_per_period[2];\n-\t\tpipe->tc_credits[3] = params->tc_credits_per_period[3];\n+\t\tfor (i = 0; i <= RTE_SCHED_TRAFFIC_CLASS_BE; i++)\n+\t\t\tpipe->tc_credits[i] = params->tc_credits_per_period[i];\n \t\tpipe->tc_time = port->time + params->tc_period;\n \t}\n \n@@ -1701,11 +1731,18 @@ grinder_credits_check(struct rte_sched_port *port, uint32_t pos)\n \tuint32_t subport_tc_credits = subport->tc_credits[tc_index];\n \tuint32_t pipe_tb_credits = pipe->tb_credits;\n \tuint32_t pipe_tc_credits = pipe->tc_credits[tc_index];\n-\tuint32_t pipe_tc_ov_mask1[] = {UINT32_MAX, UINT32_MAX, UINT32_MAX, pipe->tc_ov_credits};\n-\tuint32_t pipe_tc_ov_mask2[] = {0, 0, 0, UINT32_MAX};\n-\tuint32_t pipe_tc_ov_credits = pipe_tc_ov_mask1[tc_index];\n+\tuint32_t pipe_tc_ov_mask1[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];\n+\tuint32_t pipe_tc_ov_mask2[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE] = {0};\n+\tuint32_t pipe_tc_ov_credits, i;\n \tint enough_credits;\n \n+\tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)\n+\t\tpipe_tc_ov_mask1[i] = UINT32_MAX;\n+\n+\tpipe_tc_ov_mask1[RTE_SCHED_TRAFFIC_CLASS_BE] = pipe->tc_ov_credits;\n+\tpipe_tc_ov_mask2[RTE_SCHED_TRAFFIC_CLASS_BE] = UINT32_MAX;\n+\tpipe_tc_ov_credits = pipe_tc_ov_mask1[tc_index];\n+\n \t/* Check pipe and subport credits */\n \tenough_credits = (pkt_len <= subport_tb_credits) &&\n \t\t(pkt_len <= subport_tc_credits) &&\n@@ -1860,68 +1897,65 @@ static inline void\n grinder_tccache_populate(struct rte_sched_port *port, uint32_t pos, uint32_t qindex, uint16_t qmask)\n {\n \tstruct rte_sched_grinder *grinder = port->grinder + pos;\n-\tuint8_t b[4];\n+\tuint8_t b, i;\n \n \tgrinder->tccache_w = 0;\n \tgrinder->tccache_r = 0;\n \n-\tb[0] = (uint8_t) (qmask & 0xF);\n-\tb[1] = (uint8_t) ((qmask >> 4) & 0xF);\n-\tb[2] = (uint8_t) ((qmask >> 8) & 0xF);\n-\tb[3] = (uint8_t) ((qmask >> 12) & 0xF);\n-\n-\tgrinder->tccache_qmask[grinder->tccache_w] = b[0];\n-\tgrinder->tccache_qindex[grinder->tccache_w] = qindex;\n-\tgrinder->tccache_w += (b[0] != 0);\n-\n-\tgrinder->tccache_qmask[grinder->tccache_w] = b[1];\n-\tgrinder->tccache_qindex[grinder->tccache_w] = qindex + 4;\n-\tgrinder->tccache_w += (b[1] != 0);\n-\n-\tgrinder->tccache_qmask[grinder->tccache_w] = b[2];\n-\tgrinder->tccache_qindex[grinder->tccache_w] = qindex + 8;\n-\tgrinder->tccache_w += (b[2] != 0);\n+\tfor (i = 0; i < RTE_SCHED_TRAFFIC_CLASS_BE; i++) {\n+\t\tb = (uint8_t) ((qmask >> i) & 0x1);\n+\t\tgrinder->tccache_qmask[grinder->tccache_w] = b;\n+\t\tgrinder->tccache_qindex[grinder->tccache_w] = qindex + i;\n+\t\tgrinder->tccache_w += (b != 0);\n+\t}\n \n-\tgrinder->tccache_qmask[grinder->tccache_w] = b[3];\n-\tgrinder->tccache_qindex[grinder->tccache_w] = qindex + 12;\n-\tgrinder->tccache_w += (b[3] != 0);\n+\tb = (uint8_t) (qmask >> (RTE_SCHED_TRAFFIC_CLASS_BE));\n+\tgrinder->tccache_qmask[grinder->tccache_w] = b;\n+\tgrinder->tccache_qindex[grinder->tccache_w] = qindex +\n+\t\tRTE_SCHED_TRAFFIC_CLASS_BE;\n+\tgrinder->tccache_w += (b != 0);\n }\n \n static inline int\n grinder_next_tc(struct rte_sched_port *port, uint32_t pos)\n {\n \tstruct rte_sched_grinder *grinder = port->grinder + pos;\n+\tstruct rte_sched_pipe *pipe = grinder->pipe;\n \tstruct rte_mbuf **qbase;\n-\tuint32_t qindex;\n+\tuint32_t qindex, qpos = 0;\n \tuint16_t qsize;\n \n \tif (grinder->tccache_r == grinder->tccache_w)\n \t\treturn 0;\n \n \tqindex = grinder->tccache_qindex[grinder->tccache_r];\n+\tgrinder->tc_index = qindex & 0xf;\n \tqbase = rte_sched_port_qbase(port, qindex);\n-\tqsize = rte_sched_port_qsize(port, qindex);\n-\n-\tgrinder->tc_index = (qindex >> 2) & 0x3;\n-\tgrinder->qmask = grinder->tccache_qmask[grinder->tccache_r];\n-\tgrinder->qsize[grinder->tc_index] = qsize;\n \n-\tgrinder->qindex[0] = qindex;\n-\tgrinder->qindex[1] = qindex + 1;\n-\tgrinder->qindex[2] = qindex + 2;\n-\tgrinder->qindex[3] = qindex + 3;\n+\tif (grinder->tc_index < RTE_SCHED_TRAFFIC_CLASS_BE) {\n+\t\tqsize = rte_sched_port_qsize(port, qindex);\n \n-\tgrinder->queue[0] = port->queue + qindex;\n-\tgrinder->queue[1] = port->queue + qindex + 1;\n-\tgrinder->queue[2] = port->queue + qindex + 2;\n-\tgrinder->queue[3] = port->queue + qindex + 3;\n+\t\tgrinder->queue[qpos] = port->queue + qindex;\n+\t\tgrinder->qbase[qpos] = qbase;\n+\t\tgrinder->qindex[qpos] = qindex;\n+\t\tgrinder->qsize[qpos] = qsize;\n+\t\tgrinder->qmask = grinder->tccache_qmask[grinder->tccache_r];\n+\t\tgrinder->tccache_r++;\n \n-\tgrinder->qbase[0] = qbase;\n-\tgrinder->qbase[1] = qbase + qsize;\n-\tgrinder->qbase[2] = qbase + 2 * qsize;\n-\tgrinder->qbase[3] = qbase + 3 * qsize;\n+\t\treturn 1;\n+\t}\n \n+\tfor ( ; qpos < pipe->n_be_queues; qpos++) {\n+\t\tqsize = rte_sched_port_qsize(port, qindex + qpos);\n+\t\tgrinder->queue[qpos] = port->queue + qindex + qpos;\n+\t\tgrinder->qbase[qpos] = qbase + qpos * qsize;\n+\t\tgrinder->qindex[qpos] = qindex + qpos;\n+\t\tgrinder->qsize[qpos] = qsize;\n+\t}\n+\tgrinder->tc_index = RTE_SCHED_TRAFFIC_CLASS_BE;\n+\tgrinder->qmask = grinder->tccache_qmask[grinder->tccache_r];\n \tgrinder->tccache_r++;\n+\n \treturn 1;\n }\n \ndiff --git a/lib/librte_sched/rte_sched.h b/lib/librte_sched/rte_sched.h\nindex 2a935998a..ae4dfb311 100644\n--- a/lib/librte_sched/rte_sched.h\n+++ b/lib/librte_sched/rte_sched.h\n@@ -83,9 +83,9 @@ extern \"C\" {\n #define RTE_SCHED_BE_QUEUES_PER_PIPE    4\n \n /** Number of traffic classes per pipe (as well as subport).\n- * Cannot be changed.\n  */\n-#define RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE    4\n+#define RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE    \\\n+(RTE_SCHED_QUEUES_PER_PIPE - RTE_SCHED_BE_QUEUES_PER_PIPE + 1)\n \n /** Number of queues per pipe traffic class. Cannot be changed. */\n #define RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS    4\n@@ -171,9 +171,7 @@ struct rte_sched_pipe_params {\n \t/**< Traffic class rates (measured in bytes per second) */\n \tuint32_t tc_period;\n \t/**< Enforcement period (measured in milliseconds) */\n-#ifdef RTE_SCHED_SUBPORT_TC_OV\n \tuint8_t tc_ov_weight;\t\t /**< Weight Traffic class 3 oversubscription */\n-#endif\n \n \t/* Pipe queues */\n \tuint8_t  wrr_weights[RTE_SCHED_BE_QUEUES_PER_PIPE]; /**< WRR weights */\n@@ -206,11 +204,9 @@ struct rte_sched_port_params {\n \t\t\t\t\t  * (measured in bytes) */\n \tuint32_t n_subports_per_port;    /**< Number of subports */\n \tuint32_t n_pipes_per_subport;    /**< Number of pipes per subport */\n-\tuint16_t qsize[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];\n+\tuint16_t qsize[RTE_SCHED_QUEUES_PER_PIPE];\n \t/**< Packet queue size for each traffic class.\n-\t * All queues within the same pipe traffic class have the same\n-\t * size. Queues from different pipes serving the same traffic\n-\t * class have the same size. */\n+\t * Queues which are not needed are allowed to have zero size. */\n \tstruct rte_sched_pipe_params *pipe_profiles;\n \t/**< Pipe profile table.\n \t * Every pipe is configured using one of the profiles from this table. */\n",
    "prefixes": [
        "v4",
        "02/11"
    ]
}