event/octeontx2: resize SSO in-flight buffers
authorPavan Nikhilesh <pbhagavatula@marvell.com>
Thu, 4 Jul 2019 02:19:36 +0000 (07:49 +0530)
committerJerin Jacob <jerinj@marvell.com>
Sun, 7 Jul 2019 13:11:31 +0000 (15:11 +0200)
Resize SSO internal in-flight buffer count based on the Rx queues
mempool size connected to event queues.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
drivers/event/octeontx2/otx2_evdev.h
drivers/event/octeontx2/otx2_evdev_adptr.c

index 8bee8c7..107aa79 100644 (file)
@@ -132,7 +132,9 @@ struct otx2_sso_evdev {
        uint64_t nb_xaq_cfg;
        rte_iova_t fc_iova;
        struct rte_mempool *xaq_pool;
+       uint16_t rx_adptr_pool_cnt;
        uint32_t adptr_xae_cnt;
+       uint64_t *rx_adptr_pools;
        /* Dev args */
        uint8_t dual_ws;
        uint8_t selftest;
index ce5621f..12469fa 100644 (file)
@@ -199,6 +199,29 @@ void
 sso_updt_xae_cnt(struct otx2_sso_evdev *dev, void *data, uint32_t event_type)
 {
        switch (event_type) {
+       case RTE_EVENT_TYPE_ETHDEV:
+       {
+               struct otx2_eth_rxq *rxq = data;
+               int i, match = false;
+
+               for (i = 0; i < dev->rx_adptr_pool_cnt; i++) {
+                       if ((uint64_t)rxq->pool == dev->rx_adptr_pools[i])
+                               match = true;
+               }
+
+               if (!match) {
+                       dev->rx_adptr_pool_cnt++;
+                       dev->rx_adptr_pools = rte_realloc(dev->rx_adptr_pools,
+                                                         sizeof(uint64_t) *
+                                                         dev->rx_adptr_pool_cnt
+                                                         , 0);
+                       dev->rx_adptr_pools[dev->rx_adptr_pool_cnt - 1] =
+                               (uint64_t)rxq->pool;
+
+                       dev->adptr_xae_cnt += rxq->pool->size;
+               }
+               break;
+       }
        case RTE_EVENT_TYPE_TIMER:
        {
                dev->adptr_xae_cnt += (*(uint64_t *)data);
@@ -216,21 +239,30 @@ otx2_sso_rx_adapter_queue_add(const struct rte_eventdev *event_dev,
                const struct rte_event_eth_rx_adapter_queue_conf *queue_conf)
 {
        struct otx2_eth_dev *otx2_eth_dev = eth_dev->data->dev_private;
+       struct otx2_sso_evdev *dev = sso_pmd_priv(event_dev);
        uint16_t port = eth_dev->data->port_id;
+       struct otx2_eth_rxq *rxq;
        int i, rc;
 
-       RTE_SET_USED(event_dev);
        rc = strncmp(eth_dev->device->driver->name, "net_octeontx2", 13);
        if (rc)
                return -EINVAL;
 
        if (rx_queue_id < 0) {
                for (i = 0 ; i < eth_dev->data->nb_rx_queues; i++) {
+                       rxq = eth_dev->data->rx_queues[i];
+                       sso_updt_xae_cnt(dev, rxq, RTE_EVENT_TYPE_ETHDEV);
+                       rc = sso_xae_reconfigure((struct rte_eventdev *)
+                                                (uintptr_t)event_dev);
                        rc |= sso_rxq_enable(otx2_eth_dev, i,
                                             queue_conf->ev.sched_type,
                                             queue_conf->ev.queue_id, port);
                }
        } else {
+               rxq = eth_dev->data->rx_queues[rx_queue_id];
+               sso_updt_xae_cnt(dev, rxq, RTE_EVENT_TYPE_ETHDEV);
+               rc = sso_xae_reconfigure((struct rte_eventdev *)
+                                        (uintptr_t)event_dev);
                rc |= sso_rxq_enable(otx2_eth_dev, (uint16_t)rx_queue_id,
                                     queue_conf->ev.sched_type,
                                     queue_conf->ev.queue_id, port);