[dpdk-dev] [PATCH 13/14] net/mlx5: update event handler for multiport IB devices

Shahaf Shuler shahafs at mellanox.com
Thu Mar 21 13:15:14 CET 2019


Thursday, March 21, 2019 10:11 AM, Viacheslav Ovsiienko:
> Subject: [PATCH 13/14] net/mlx5: update event handler for multiport IB
> devices
> 
> This patch modifies asynchronous event handler to support multiport
> Infiniband devices. Handler queries the event parameters, including event
> source port index, and invokes the handler for specific devices with
> appropriate port_id.

This commit should be along w/ the previous one, since interrupts will not work after commit #12 in this series. 

> 
> Signed-off-by: Viacheslav Ovsiienko <viacheslavo at mellanox.com>
> ---
>  drivers/net/mlx5/mlx5_ethdev.c | 101 +++++++++++++++++++++------------
> --------
>  1 file changed, 51 insertions(+), 50 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c
> b/drivers/net/mlx5/mlx5_ethdev.c index 8358cd2..710e6b5 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -1032,66 +1032,67 @@ int mlx5_fw_version_get(struct rte_eth_dev
> *dev, char *fw_ver, size_t fw_size)  }
> 
>  /**
> - * Device status handler.
> + * Handle shared asynchronous events the NIC (removal event
> + * and link status change). Supports multiport IB device.
>   *
> - * @param dev
> - *   Pointer to Ethernet device.
> - * @param events
> - *   Pointer to event flags holder.
> - *
> - * @return
> - *   Events bitmap of callback process which can be called immediately.
> + * @param cb_arg
> + *   Callback argument.
>   */
> -static uint32_t
> -mlx5_dev_status_handler(struct rte_eth_dev *dev)
> +void
> +mlx5_dev_interrupt_handler(void *cb_arg)
>  {
> -	struct mlx5_priv *priv = dev->data->dev_private;
> +	struct mlx5_ibv_shared *sh = cb_arg;
>  	struct ibv_async_event event;
> -	uint32_t ret = 0;
> 
> -	if (mlx5_link_update(dev, 0) == -EAGAIN) {
> -		usleep(0);
> -		return 0;
> -	}
> -	/* Read all message and acknowledge them. */
> +	/* Read all message from the IB device and acknowledge them. */
>  	for (;;) {
> -		if (mlx5_glue->get_async_event(priv->sh->ctx, &event))
> +		struct rte_eth_dev *dev;
> +		uint32_t tmp;
> +
> +		if (mlx5_glue->get_async_event(sh->ctx, &event))
>  			break;
> +		/* Retrieve and check IB port index. */
> +		tmp = (uint32_t)event.element.port_num;
> +		assert(tmp && (tmp <= sh->max_port));
> +		if (!tmp ||
> +		    tmp > sh->max_port ||
> +		    sh->port[tmp - 1].port_id >= RTE_MAX_ETHPORTS) {
> +			/*
> +			 * Invalid IB port index or no handler
> +			 * installed for this port.
> +			 */
> +			mlx5_glue->ack_async_event(&event);
> +			continue;
> +		}
> +		/* Retrieve ethernet device descriptor. */
> +		tmp = sh->port[tmp - 1].port_id;
> +		dev = &rte_eth_devices[tmp];

Is there a guarantee that the representors ethedev indexes will be contiguous?  
I think we need a mapping between ibdev port and ethedv index. 

> +		tmp = 0;
> +		assert(dev);
>  		if ((event.event_type == IBV_EVENT_PORT_ACTIVE ||
> -			event.event_type == IBV_EVENT_PORT_ERR) &&
> -			(dev->data->dev_conf.intr_conf.lsc == 1))
> -			ret |= (1 << RTE_ETH_EVENT_INTR_LSC);
> -		else if (event.event_type == IBV_EVENT_DEVICE_FATAL &&
> -			dev->data->dev_conf.intr_conf.rmv == 1)
> -			ret |= (1 << RTE_ETH_EVENT_INTR_RMV);
> -		else
> -			DRV_LOG(DEBUG,
> -				"port %u event type %d on not handled",
> -				dev->data->port_id, event.event_type);
> +		     event.event_type == IBV_EVENT_PORT_ERR) &&
> +			dev->data->dev_conf.intr_conf.lsc) {
> +			mlx5_glue->ack_async_event(&event);
> +			if (mlx5_link_update(dev, 0) == -EAGAIN) {
> +				usleep(0);
> +				continue;
> +			}
> +			_rte_eth_dev_callback_process
> +				(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
> +			continue;
> +		}
> +		if (event.event_type == IBV_EVENT_DEVICE_FATAL &&
> +		    dev->data->dev_conf.intr_conf.rmv) {
> +			mlx5_glue->ack_async_event(&event);
> +			_rte_eth_dev_callback_process
> +				(dev, RTE_ETH_EVENT_INTR_RMV, NULL);
> +			continue;
> +		}
> +		DRV_LOG(DEBUG,
> +			"port %u event type %d on not handled",
> +			dev->data->port_id, event.event_type);
>  		mlx5_glue->ack_async_event(&event);
>  	}
> -	return ret;
> -}
> -
> -/**
> - * Handle interrupts from the NIC.
> - *
> - * @param[in] intr_handle
> - *   Interrupt handler.
> - * @param cb_arg
> - *   Callback argument.
> - */
> -void
> -mlx5_dev_interrupt_handler(void *cb_arg) -{
> -	struct rte_eth_dev *dev = cb_arg;
> -	uint32_t events;
> -
> -	events = mlx5_dev_status_handler(dev);
> -	if (events & (1 << RTE_ETH_EVENT_INTR_LSC))
> -		_rte_eth_dev_callback_process(dev,
> RTE_ETH_EVENT_INTR_LSC, NULL);
> -	if (events & (1 << RTE_ETH_EVENT_INTR_RMV))
> -		_rte_eth_dev_callback_process(dev,
> RTE_ETH_EVENT_INTR_RMV, NULL);
>  }
> 
>  /**
> --
> 1.8.3.1



More information about the dev mailing list