net/enic: do not overwrite admin Tx queue limit

Currently, enic_alloc_wq (via rte_eth_tx_queue_setup) may overwrite
the admin limit with a lower value. This is wrong as seen in the
following sequence.

1. UCS admin-set Tx queue limit (config.wq_desc_count) = 4096
2. Set up tx queue with 512 descriptors
   The admin limit (config.wq_desc_count) becomes 512.
3. Stop ports and now set up Tx queue with 1024 descriptors.
   This fails because 1024 is greater than the admin limit (512).

Do not modify the admin limit, and when queried, report the current
number of descriptors instead of the admin limit. The rx queue setup
(enic_alloc_rq) does not this problem.

Fixes: fefed3d1e6 ("enic: new driver")
Cc: stable@dpdk.org

Signed-off-by: Hyong Youb Kim <hyonkim@cisco.com>
Reviewed-by: John Daley <johndale@cisco.com>
This commit is contained in:
Hyong Youb Kim 2018-06-29 02:29:32 -07:00 committed by Ferruh Yigit
parent 5bc989e6db
commit 2a7e3d5465
2 changed files with 17 additions and 18 deletions

View File

@ -731,13 +731,14 @@ static void enicpmd_dev_rxq_info_get(struct rte_eth_dev *dev,
}
static void enicpmd_dev_txq_info_get(struct rte_eth_dev *dev,
__rte_unused uint16_t tx_queue_id,
uint16_t tx_queue_id,
struct rte_eth_txq_info *qinfo)
{
struct enic *enic = pmd_priv(dev);
struct vnic_wq *wq = &enic->wq[tx_queue_id];
ENICPMD_FUNC_TRACE();
qinfo->nb_desc = enic->config.wq_desc_count;
qinfo->nb_desc = wq->ring.desc_count;
memset(&qinfo->conf, 0, sizeof(qinfo->conf));
qinfo->conf.offloads = enic->tx_offload_capa;
/* tx_thresh, and all the other fields are not applicable for enic */

View File

@ -869,25 +869,23 @@ int enic_alloc_wq(struct enic *enic, uint16_t queue_idx,
static int instance;
wq->socket_id = socket_id;
if (nb_desc) {
if (nb_desc > enic->config.wq_desc_count) {
dev_warning(enic,
"WQ %d - number of tx desc in cmd line (%d)"\
"is greater than that in the UCSM/CIMC adapter"\
"policy. Applying the value in the adapter "\
"policy (%d)\n",
queue_idx, nb_desc, enic->config.wq_desc_count);
} else if (nb_desc != enic->config.wq_desc_count) {
enic->config.wq_desc_count = nb_desc;
dev_info(enic,
"TX Queues - effective number of descs:%d\n",
nb_desc);
}
if (nb_desc > enic->config.wq_desc_count) {
dev_warning(enic,
"WQ %d - number of tx desc in cmd line (%d) "
"is greater than that in the UCSM/CIMC adapter "
"policy. Applying the value in the adapter "
"policy (%d)\n",
queue_idx, nb_desc, enic->config.wq_desc_count);
nb_desc = enic->config.wq_desc_count;
} else if (nb_desc != enic->config.wq_desc_count) {
dev_info(enic,
"TX Queues - effective number of descs:%d\n",
nb_desc);
}
/* Allocate queue resources */
err = vnic_wq_alloc(enic->vdev, &enic->wq[queue_idx], queue_idx,
enic->config.wq_desc_count,
nb_desc,
sizeof(struct wq_enet_desc));
if (err) {
dev_err(enic, "error in allocation of wq\n");
@ -895,7 +893,7 @@ int enic_alloc_wq(struct enic *enic, uint16_t queue_idx,
}
err = vnic_cq_alloc(enic->vdev, &enic->cq[cq_index], cq_index,
socket_id, enic->config.wq_desc_count,
socket_id, nb_desc,
sizeof(struct cq_enet_wq_desc));
if (err) {
vnic_wq_free(wq);