fix global variable issues
[dpdk.git] / lib / librte_eventdev / rte_event_eth_rx_adapter.c
index 42dd7f8..71d008c 100644 (file)
@@ -147,6 +147,10 @@ struct rte_event_eth_rx_adapter {
 struct eth_device_info {
        struct rte_eth_dev *dev;
        struct eth_rx_queue_info *rx_queue;
+       /* Rx callback */
+       rte_event_eth_rx_adapter_cb_fn cb_fn;
+       /* Rx callback argument */
+       void *cb_arg;
        /* Set if ethdev->eventdev packet transfer uses a
         * hardware mechanism
         */
@@ -759,11 +763,12 @@ rxa_buffer_mbufs(struct rte_event_eth_rx_adapter *rx_adapter,
                uint16_t num)
 {
        uint32_t i;
-       struct eth_device_info *eth_device_info =
+       struct eth_device_info *dev_info =
                                        &rx_adapter->eth_devices[eth_dev_id];
        struct eth_rx_queue_info *eth_rx_queue_info =
-                                       &eth_device_info->rx_queue[rx_queue_id];
-
+                                       &dev_info->rx_queue[rx_queue_id];
+       struct rte_eth_event_enqueue_buffer *buf =
+                                       &rx_adapter->event_enqueue_buffer;
        int32_t qid = eth_rx_queue_info->event_queue_id;
        uint8_t sched_type = eth_rx_queue_info->sched_type;
        uint8_t priority = eth_rx_queue_info->priority;
@@ -774,6 +779,8 @@ rxa_buffer_mbufs(struct rte_event_eth_rx_adapter *rx_adapter,
        uint32_t rss;
        int do_rss;
        uint64_t ts;
+       struct rte_mbuf *cb_mbufs[BATCH_SIZE];
+       uint16_t nb_cb;
 
        /* 0xffff ffff if PKT_RX_RSS_HASH is set, otherwise 0 */
        rss_mask = ~(((m->ol_flags & PKT_RX_RSS_HASH) != 0) - 1);
@@ -789,6 +796,19 @@ rxa_buffer_mbufs(struct rte_event_eth_rx_adapter *rx_adapter,
                }
        }
 
+
+       nb_cb = dev_info->cb_fn ? dev_info->cb_fn(eth_dev_id, rx_queue_id,
+                                               ETH_EVENT_BUFFER_SIZE,
+                                               buf->count, mbufs,
+                                               num,
+                                               dev_info->cb_arg,
+                                               cb_mbufs) :
+                                               num;
+       if (nb_cb < num) {
+               mbufs = cb_mbufs;
+               num = nb_cb;
+       }
+
        for (i = 0; i < num; i++) {
                m = mbufs[i];
                struct rte_event *ev = &events[i];
@@ -1105,7 +1125,6 @@ rxa_poll(struct rte_event_eth_rx_adapter *rx_adapter)
        wrr_pos = rx_adapter->wrr_pos;
        max_nb_rx = rx_adapter->max_nb_rx;
        buf = &rx_adapter->event_enqueue_buffer;
-       stats = &rx_adapter->stats;
 
        /* Iterate through a WRR sequence */
        for (num_queue = 0; num_queue < rx_adapter->wrr_len; num_queue++) {
@@ -1978,8 +1997,7 @@ rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id,
        rx_adapter->id = id;
        strcpy(rx_adapter->mem_name, mem_name);
        rx_adapter->eth_devices = rte_zmalloc_socket(rx_adapter->mem_name,
-                                       /* FIXME: incompatible with hotplug */
-                                       rte_eth_dev_count_total() *
+                                       RTE_MAX_ETHPORTS *
                                        sizeof(struct eth_device_info), 0,
                                        socket_id);
        rte_convert_rss_key((const uint32_t *)default_rss_key,
@@ -1992,7 +2010,7 @@ rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id,
                return -ENOMEM;
        }
        rte_spinlock_init(&rx_adapter->rx_lock);
-       RTE_ETH_FOREACH_DEV(i)
+       for (i = 0; i < RTE_MAX_ETHPORTS; i++)
                rx_adapter->eth_devices[i].dev = &rte_eth_devices[i];
 
        event_eth_rx_adapter[id] = rx_adapter;
@@ -2364,3 +2382,47 @@ rte_event_eth_rx_adapter_service_id_get(uint8_t id, uint32_t *service_id)
 
        return rx_adapter->service_inited ? 0 : -ESRCH;
 }
+
+int rte_event_eth_rx_adapter_cb_register(uint8_t id,
+                                       uint16_t eth_dev_id,
+                                       rte_event_eth_rx_adapter_cb_fn cb_fn,
+                                       void *cb_arg)
+{
+       struct rte_event_eth_rx_adapter *rx_adapter;
+       struct eth_device_info *dev_info;
+       uint32_t cap;
+       int ret;
+
+       RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL);
+
+       rx_adapter = rxa_id_to_adapter(id);
+       if (rx_adapter == NULL)
+               return -EINVAL;
+
+       dev_info = &rx_adapter->eth_devices[eth_dev_id];
+       if (dev_info->rx_queue == NULL)
+               return -EINVAL;
+
+       ret = rte_event_eth_rx_adapter_caps_get(rx_adapter->eventdev_id,
+                                               eth_dev_id,
+                                               &cap);
+       if (ret) {
+               RTE_EDEV_LOG_ERR("Failed to get adapter caps edev %" PRIu8
+                       "eth port %" PRIu16, id, eth_dev_id);
+               return ret;
+       }
+
+       if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT) {
+               RTE_EDEV_LOG_ERR("Rx callback not supported for eth port %"
+                               PRIu16, eth_dev_id);
+               return -EINVAL;
+       }
+
+       rte_spinlock_lock(&rx_adapter->rx_lock);
+       dev_info->cb_fn = cb_fn;
+       dev_info->cb_arg = cb_arg;
+       rte_spinlock_unlock(&rx_adapter->rx_lock);
+
+       return 0;
+}