https://bugs.linaro.org/show_bug.cgi?id=3578
Bug ID: 3578
Summary: classification: requested number of queues is ignored
in multiqueue CoS
Product: OpenDataPlane - linux- generic reference
Version: master
Hardware: Other
OS: Linux
Status: UNCONFIRMED
Severity: minor
Priority: ---
Component: Classification
Assignee: [email protected]
Reporter: [email protected]
CC: [email protected]
Target Milestone: ---
When a multiqueue CoS is created in odp_cls_cos_create(), up to
`CLS_COS_QUEUE_MAX` queues can be requested by the user.
But the requested number (`param->num_queue`) is ignored and all possible
queues per CoS (CLS_COS_QUEUE_MAX) are created:
if (param->num_queue > 1) {
...
for (j = 0; j < CLS_COS_QUEUE_MAX; j++) {
queue = odp_queue_create(NULL, &cos->s.queue_param);
...
queue_grp_tbl->s.queue[tbl_index + j] = queue;
}
...
}
In cls_classify_packet(), all possible queues are used to select the queue:
hash = hash & (CLS_COS_QUEUE_MAX - 1);
tbl_index = (cos->s.index * CLS_COS_QUEUE_MAX) + hash;
pkt_hdr->dst_queue = queue_fn->from_ext(queue_grp_tbl->s.queue[tbl_index]);
So effectively `CLS_COS_QUEUE_MAX` queues are used per CoS, regardless of the
requested number. However, the semantics of the API allow the user to access
the requested queues only, and the queues created in excess remain
inaccessible:
- uint32_t odp_cls_cos_num_queue(odp_cos_t cos_id);
- uint32_t odp_cls_cos_queues(odp_cos_t cos_id, odp_queue_t queue[],
uint32_t num);
- etc.
To fix this:
1. Only the requested number of queues should be created.
for (j = 0; j < param->num_queue; j++) {
2. Packet hash should only select the created queues:
tbl_index = (cos->s.index * CLS_COS_QUEUE_MAX) + (hash % cos->s.num_queue);
--
You are receiving this mail because:
You are on the CC list for the bug.