From: Adrien Mazarguil Date: Tue, 5 Sep 2017 12:56:39 +0000 (+0200) Subject: net/mlx4: merge interrupt collector function X-Git-Tag: spdx-start~1980 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=d84fb5eba1dac6a8d8b5506fa38e555c2c8d7e91;p=dpdk.git net/mlx4: merge interrupt collector function Since interrupt handler is the only function relying on it, merging them simplifies the code as there is no need for an API to return collected events. Signed-off-by: Adrien Mazarguil --- diff --git a/drivers/net/mlx4/mlx4_intr.c b/drivers/net/mlx4/mlx4_intr.c index e1e6c05f0c..3806322e5f 100644 --- a/drivers/net/mlx4/mlx4_intr.c +++ b/drivers/net/mlx4/mlx4_intr.c @@ -134,53 +134,6 @@ mlx4_rx_intr_vec_enable(struct priv *priv) return 0; } -/** - * Collect interrupt events. - * - * @param priv - * Pointer to private structure. - * @param events - * Pointer to event flags holder. - * - * @return - * Number of events. - */ -static int -mlx4_collect_interrupt_events(struct priv *priv, uint32_t *events) -{ - struct ibv_async_event event; - const struct rte_intr_conf *const intr_conf = - &priv->dev->data->dev_conf.intr_conf; - int ret = 0; - - *events = 0; - /* Read all message and acknowledge them. */ - for (;;) { - if (ibv_get_async_event(priv->ctx, &event)) - break; - switch (event.event_type) { - case IBV_EVENT_PORT_ACTIVE: - case IBV_EVENT_PORT_ERR: - if (!intr_conf->lsc || mlx4_link_status_check(priv)) - break; - *events |= (1 << RTE_ETH_EVENT_INTR_LSC); - ret++; - break; - case IBV_EVENT_DEVICE_FATAL: - if (!intr_conf->rmv) - break; - *events |= (1 << RTE_ETH_EVENT_INTR_RMV); - ret++; - break; - default: - DEBUG("event type %d on port %d not handled", - event.event_type, event.element.port_num); - } - ibv_ack_async_event(&event); - } - return ret; -} - /** * Process scheduled link status check. * @@ -250,26 +203,39 @@ mlx4_link_status_check(struct priv *priv) static void mlx4_interrupt_handler(struct priv *priv) { - int ret; - uint32_t ev; - int i; + enum { LSC, RMV, }; + static const enum rte_eth_event_type type[] = { + [LSC] = RTE_ETH_EVENT_INTR_LSC, + [RMV] = RTE_ETH_EVENT_INTR_RMV, + }; + uint32_t caught[RTE_DIM(type)] = { 0 }; + struct ibv_async_event event; + const struct rte_intr_conf *const intr_conf = + &priv->dev->data->dev_conf.intr_conf; + unsigned int i; - ret = mlx4_collect_interrupt_events(priv, &ev); - if (ret > 0) { - for (i = RTE_ETH_EVENT_UNKNOWN; - i < RTE_ETH_EVENT_MAX; - i++) { - if (ev & (1 << i)) { - ev &= ~(1 << i); - _rte_eth_dev_callback_process(priv->dev, i, - NULL, NULL); - ret--; - } + /* Read all message and acknowledge them. */ + while (!ibv_get_async_event(priv->ctx, &event)) { + switch (event.event_type) { + case IBV_EVENT_PORT_ACTIVE: + case IBV_EVENT_PORT_ERR: + if (intr_conf->lsc && !mlx4_link_status_check(priv)) + ++caught[LSC]; + break; + case IBV_EVENT_DEVICE_FATAL: + if (intr_conf->rmv) + ++caught[RMV]; + break; + default: + DEBUG("event type %d on physical port %d not handled", + event.event_type, event.element.port_num); } - if (ret) - WARN("%d event%s not processed", ret, - (ret > 1 ? "s were" : " was")); + ibv_ack_async_event(&event); } + for (i = 0; i != RTE_DIM(caught); ++i) + if (caught[i]) + _rte_eth_dev_callback_process(priv->dev, type[i], + NULL, NULL); } /**