X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Feventdev%2Frte_event_eth_rx_adapter.c;h=ff83ce8b674b3d6c2e4d379888925c0f5b5b9fbc;hb=ea0d681efa86cb8902d93409679e3ac507755345;hp=3adec52eac1042f9ccd0aa720acc7dcefc899481;hpb=995b150c1ae1d0bb813d0bc727dc9d96844c73c5;p=dpdk.git diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c index 3adec52eac..ff83ce8b67 100644 --- a/lib/eventdev/rte_event_eth_rx_adapter.c +++ b/lib/eventdev/rte_event_eth_rx_adapter.c @@ -293,6 +293,30 @@ rxa_event_buf_get(struct event_eth_rx_adapter *rx_adapter, uint16_t eth_dev_id, } \ } while (0) +#define RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_GOTO_ERR_RET(id, retval) do { \ + if (!rxa_validate_id(id)) { \ + RTE_EDEV_LOG_ERR("Invalid eth Rx adapter id = %d\n", id); \ + ret = retval; \ + goto error; \ + } \ +} while (0) + +#define RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, retval) do { \ + if ((token) == NULL || strlen(token) == 0 || !isdigit(*token)) { \ + RTE_EDEV_LOG_ERR("Invalid eth Rx adapter token\n"); \ + ret = retval; \ + goto error; \ + } \ +} while (0) + +#define RTE_ETH_VALID_PORTID_OR_GOTO_ERR_RET(port_id, retval) do { \ + if (!rte_eth_dev_is_valid_port(port_id)) { \ + RTE_ETHDEV_LOG(ERR, "Invalid port_id=%u\n", port_id); \ + ret = retval; \ + goto error; \ + } \ +} while (0) + static inline int rxa_sw_adapter_queue_count(struct event_eth_rx_adapter *rx_adapter) { @@ -777,19 +801,25 @@ rxa_flush_event_buffer(struct event_eth_rx_adapter *rx_adapter, struct eth_event_enqueue_buffer *buf, struct rte_event_eth_rx_adapter_stats *stats) { - uint16_t count = buf->last ? buf->last - buf->head : buf->count; + uint16_t count = buf->count; + uint16_t n = 0; if (!count) return 0; - uint16_t n = rte_event_enqueue_new_burst(rx_adapter->eventdev_id, - rx_adapter->event_port_id, - &buf->events[buf->head], - count); - if (n != count) - stats->rx_enq_retry++; + if (buf->last) + count = buf->last - buf->head; - buf->head += n; + if (count) { + n = rte_event_enqueue_new_burst(rx_adapter->eventdev_id, + rx_adapter->event_port_id, + &buf->events[buf->head], + count); + if (n != count) + stats->rx_enq_retry++; + + buf->head += n; + } if (buf->last && n == count) { uint16_t n1; @@ -1000,6 +1030,7 @@ rxa_eth_rx(struct event_eth_rx_adapter *rx_adapter, uint16_t port_id, struct rte_mbuf *mbufs[BATCH_SIZE]; uint16_t n; uint32_t nb_rx = 0; + uint32_t nb_flushed = 0; if (rxq_empty) *rxq_empty = 0; @@ -1008,7 +1039,8 @@ rxa_eth_rx(struct event_eth_rx_adapter *rx_adapter, uint16_t port_id, */ while (rxa_pkt_buf_available(buf)) { if (buf->count >= BATCH_SIZE) - rxa_flush_event_buffer(rx_adapter, buf, stats); + nb_flushed += + rxa_flush_event_buffer(rx_adapter, buf, stats); stats->rx_poll_count++; n = rte_eth_rx_burst(port_id, queue_id, mbufs, BATCH_SIZE); @@ -1025,9 +1057,12 @@ rxa_eth_rx(struct event_eth_rx_adapter *rx_adapter, uint16_t port_id, } if (buf->count > 0) - rxa_flush_event_buffer(rx_adapter, buf, stats); + nb_flushed += rxa_flush_event_buffer(rx_adapter, buf, stats); stats->rx_packets += nb_rx; + if (nb_flushed == 0) + rte_event_maintain(rx_adapter->eventdev_id, + rx_adapter->event_port_id, 0); return nb_rx; } @@ -2973,15 +3008,17 @@ rte_event_eth_rx_adapter_queue_stats_get(uint8_t id, return -EINVAL; } - queue_info = &dev_info->rx_queue[rx_queue_id]; - event_buf = queue_info->event_buf; - q_stats = queue_info->stats; + if (dev_info->internal_event_port == 0) { + queue_info = &dev_info->rx_queue[rx_queue_id]; + event_buf = queue_info->event_buf; + q_stats = queue_info->stats; - stats->rx_event_buf_count = event_buf->count; - stats->rx_event_buf_size = event_buf->events_size; - stats->rx_packets = q_stats->rx_packets; - stats->rx_poll_count = q_stats->rx_poll_count; - stats->rx_dropped = q_stats->rx_dropped; + stats->rx_event_buf_count = event_buf->count; + stats->rx_event_buf_size = event_buf->events_size; + stats->rx_packets = q_stats->rx_packets; + stats->rx_poll_count = q_stats->rx_poll_count; + stats->rx_dropped = q_stats->rx_dropped; + } dev = &rte_eventdevs[rx_adapter->eventdev_id]; if (dev->dev_ops->eth_rx_adapter_queue_stats_get != NULL) { @@ -3075,8 +3112,10 @@ rte_event_eth_rx_adapter_queue_stats_reset(uint8_t id, return -EINVAL; } - queue_info = &dev_info->rx_queue[rx_queue_id]; - rxa_queue_stats_reset(queue_info); + if (dev_info->internal_event_port == 0) { + queue_info = &dev_info->rx_queue[rx_queue_id]; + rxa_queue_stats_reset(queue_info); + } dev = &rte_eventdevs[rx_adapter->eventdev_id]; if (dev->dev_ops->eth_rx_adapter_queue_stats_reset != NULL) { @@ -3108,6 +3147,26 @@ 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_event_port_get(uint8_t id, uint8_t *event_port_id) +{ + struct event_eth_rx_adapter *rx_adapter; + + if (rxa_memzone_lookup()) + return -ENOMEM; + + RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL); + + rx_adapter = rxa_id_to_adapter(id); + if (rx_adapter == NULL || event_port_id == NULL) + return -EINVAL; + + if (rx_adapter->service_inited) + *event_port_id = rx_adapter->event_port_id; + + return rx_adapter->service_inited ? 0 : -ESRCH; +} + int rte_event_eth_rx_adapter_cb_register(uint8_t id, uint16_t eth_dev_id, @@ -3159,11 +3218,11 @@ rte_event_eth_rx_adapter_queue_conf_get(uint8_t id, uint16_t rx_queue_id, struct rte_event_eth_rx_adapter_queue_conf *queue_conf) { +#define TICK2NSEC(_ticks, _freq) (((_ticks) * (1E9)) / (_freq)) struct rte_eventdev *dev; struct event_eth_rx_adapter *rx_adapter; struct eth_device_info *dev_info; struct eth_rx_queue_info *queue_info; - struct rte_event *qi_ev; int ret; if (rxa_memzone_lookup()) @@ -3194,7 +3253,6 @@ rte_event_eth_rx_adapter_queue_conf_get(uint8_t id, } queue_info = &dev_info->rx_queue[rx_queue_id]; - qi_ev = (struct rte_event *)&queue_info->event; memset(queue_conf, 0, sizeof(*queue_conf)); queue_conf->rx_queue_flags = 0; @@ -3203,7 +3261,18 @@ rte_event_eth_rx_adapter_queue_conf_get(uint8_t id, RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID; queue_conf->servicing_weight = queue_info->wt; - memcpy(&queue_conf->ev, qi_ev, sizeof(*qi_ev)); + queue_conf->ev.event = queue_info->event; + + queue_conf->vector_sz = queue_info->vector_data.max_vector_count; + queue_conf->vector_mp = queue_info->vector_data.vector_pool; + /* need to be converted from ticks to ns */ + queue_conf->vector_timeout_ns = TICK2NSEC( + queue_info->vector_data.vector_timeout_ticks, rte_get_timer_hz()); + + if (queue_info->event_buf != NULL) + queue_conf->event_buf_size = queue_info->event_buf->events_size; + else + queue_conf->event_buf_size = 0; dev = &rte_eventdevs[rx_adapter->eventdev_id]; if (dev->dev_ops->eth_rx_adapter_queue_conf_get != NULL) { @@ -3288,7 +3357,7 @@ handle_rxa_get_queue_conf(const char *cmd __rte_unused, { uint8_t rx_adapter_id; uint16_t rx_queue_id; - int eth_dev_id; + int eth_dev_id, ret = -1; char *token, *l_params; struct rte_event_eth_rx_adapter_queue_conf queue_conf; @@ -3297,33 +3366,37 @@ handle_rxa_get_queue_conf(const char *cmd __rte_unused, /* Get Rx adapter ID from parameter string */ l_params = strdup(params); + if (l_params == NULL) + return -ENOMEM; token = strtok(l_params, ","); + RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1); rx_adapter_id = strtoul(token, NULL, 10); - RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(rx_adapter_id, -EINVAL); + RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_GOTO_ERR_RET(rx_adapter_id, -EINVAL); token = strtok(NULL, ","); - if (token == NULL || strlen(token) == 0 || !isdigit(*token)) - return -1; + RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1); /* Get device ID from parameter string */ eth_dev_id = strtoul(token, NULL, 10); - RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(eth_dev_id, -EINVAL); + RTE_ETH_VALID_PORTID_OR_GOTO_ERR_RET(eth_dev_id, -EINVAL); token = strtok(NULL, ","); - if (token == NULL || strlen(token) == 0 || !isdigit(*token)) - return -1; + RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1); /* Get Rx queue ID from parameter string */ rx_queue_id = strtoul(token, NULL, 10); if (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) { RTE_EDEV_LOG_ERR("Invalid rx queue_id %u", rx_queue_id); - return -EINVAL; + ret = -EINVAL; + goto error; } token = strtok(NULL, "\0"); if (token != NULL) RTE_EDEV_LOG_ERR("Extra parameters passed to eventdev" - " telemetry command, igrnoring"); + " telemetry command, ignoring"); + /* Parsing parameter finished */ + free(l_params); if (rte_event_eth_rx_adapter_queue_conf_get(rx_adapter_id, eth_dev_id, rx_queue_id, &queue_conf)) { @@ -3343,6 +3416,142 @@ handle_rxa_get_queue_conf(const char *cmd __rte_unused, RXA_ADD_DICT(queue_conf.ev, flow_id); return 0; + +error: + free(l_params); + return ret; +} + +static int +handle_rxa_get_queue_stats(const char *cmd __rte_unused, + const char *params, + struct rte_tel_data *d) +{ + uint8_t rx_adapter_id; + uint16_t rx_queue_id; + int eth_dev_id, ret = -1; + char *token, *l_params; + struct rte_event_eth_rx_adapter_queue_stats q_stats; + + if (params == NULL || strlen(params) == 0 || !isdigit(*params)) + return -1; + + /* Get Rx adapter ID from parameter string */ + l_params = strdup(params); + if (l_params == NULL) + return -ENOMEM; + token = strtok(l_params, ","); + RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1); + rx_adapter_id = strtoul(token, NULL, 10); + RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_GOTO_ERR_RET(rx_adapter_id, -EINVAL); + + token = strtok(NULL, ","); + RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1); + + /* Get device ID from parameter string */ + eth_dev_id = strtoul(token, NULL, 10); + RTE_ETH_VALID_PORTID_OR_GOTO_ERR_RET(eth_dev_id, -EINVAL); + + token = strtok(NULL, ","); + RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1); + + /* Get Rx queue ID from parameter string */ + rx_queue_id = strtoul(token, NULL, 10); + if (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) { + RTE_EDEV_LOG_ERR("Invalid rx queue_id %u", rx_queue_id); + ret = -EINVAL; + goto error; + } + + token = strtok(NULL, "\0"); + if (token != NULL) + RTE_EDEV_LOG_ERR("Extra parameters passed to eventdev" + " telemetry command, ignoring"); + /* Parsing parameter finished */ + free(l_params); + + if (rte_event_eth_rx_adapter_queue_stats_get(rx_adapter_id, eth_dev_id, + rx_queue_id, &q_stats)) { + RTE_EDEV_LOG_ERR("Failed to get Rx adapter queue stats"); + return -1; + } + + rte_tel_data_start_dict(d); + rte_tel_data_add_dict_u64(d, "rx_adapter_id", rx_adapter_id); + rte_tel_data_add_dict_u64(d, "eth_dev_id", eth_dev_id); + rte_tel_data_add_dict_u64(d, "rx_queue_id", rx_queue_id); + RXA_ADD_DICT(q_stats, rx_event_buf_count); + RXA_ADD_DICT(q_stats, rx_event_buf_size); + RXA_ADD_DICT(q_stats, rx_poll_count); + RXA_ADD_DICT(q_stats, rx_packets); + RXA_ADD_DICT(q_stats, rx_dropped); + + return 0; + +error: + free(l_params); + return ret; +} + +static int +handle_rxa_queue_stats_reset(const char *cmd __rte_unused, + const char *params, + struct rte_tel_data *d __rte_unused) +{ + uint8_t rx_adapter_id; + uint16_t rx_queue_id; + int eth_dev_id, ret = -1; + char *token, *l_params; + + if (params == NULL || strlen(params) == 0 || !isdigit(*params)) + return -1; + + /* Get Rx adapter ID from parameter string */ + l_params = strdup(params); + if (l_params == NULL) + return -ENOMEM; + token = strtok(l_params, ","); + RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1); + rx_adapter_id = strtoul(token, NULL, 10); + RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_GOTO_ERR_RET(rx_adapter_id, -EINVAL); + + token = strtok(NULL, ","); + RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1); + + /* Get device ID from parameter string */ + eth_dev_id = strtoul(token, NULL, 10); + RTE_ETH_VALID_PORTID_OR_GOTO_ERR_RET(eth_dev_id, -EINVAL); + + token = strtok(NULL, ","); + RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1); + + /* Get Rx queue ID from parameter string */ + rx_queue_id = strtoul(token, NULL, 10); + if (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) { + RTE_EDEV_LOG_ERR("Invalid rx queue_id %u", rx_queue_id); + ret = -EINVAL; + goto error; + } + + token = strtok(NULL, "\0"); + if (token != NULL) + RTE_EDEV_LOG_ERR("Extra parameters passed to eventdev" + " telemetry command, ignoring"); + /* Parsing parameter finished */ + free(l_params); + + if (rte_event_eth_rx_adapter_queue_stats_reset(rx_adapter_id, + eth_dev_id, + rx_queue_id)) { + RTE_EDEV_LOG_ERR("Failed to reset Rx adapter queue stats"); + return -1; + } + + return 0; + +error: + free(l_params); + return ret; } RTE_INIT(rxa_init_telemetry) @@ -3358,4 +3567,12 @@ RTE_INIT(rxa_init_telemetry) rte_telemetry_register_cmd("/eventdev/rxa_queue_conf", handle_rxa_get_queue_conf, "Returns Rx queue config. Parameter: rxa_id, dev_id, queue_id"); + + rte_telemetry_register_cmd("/eventdev/rxa_queue_stats", + handle_rxa_get_queue_stats, + "Returns Rx queue stats. Parameter: rxa_id, dev_id, queue_id"); + + rte_telemetry_register_cmd("/eventdev/rxa_queue_stats_reset", + handle_rxa_queue_stats_reset, + "Reset Rx queue stats. Parameter: rxa_id, dev_id, queue_id"); }