[openfabrics-ewg] [PATCH 2/3 ] IB/VNIC Fix failover delay issue

Vladimir Sokolovsky vlad at dev.mellanox.co.il
Wed Dec 20 04:31:42 PST 2006


Ramachandra K wrote:
> This reduces the delay in failover from one path to another.
>
> When a path is lost, the control and data connections of that path
> are cleaned up. As part of this a CM DREQ was being sent and we waited
> for a DREP. During this time the viport thread was blocked which delayed
> sending of a CONFIG_LINK request to the VEx for the other path. Due
> to this, there was considerable delay in the failover path becoming
> active. To fix this, send a DREQ but do not wait for a DREP from
> the VEx. We need not worry about a DREQ being lost because the
> VEx will anyway terminate a connection if it does not receive heartbeats.
>
> Signed-off-by: Ramachandra K <ramachandra.kuchimanchi at qlogic.com>
> ---
>
>  drivers/infiniband/ulp/vnic/vnic_control.c |    4 +---
>  drivers/infiniband/ulp/vnic/vnic_data.c    |    3 ---
>  2 files changed, 1 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/infiniband/ulp/vnic/vnic_control.c b/drivers/infiniband/ulp/vnic/vnic_control.c
> index b6a3e7f..2c55540 100644
> --- a/drivers/infiniband/ulp/vnic/vnic_control.c
> +++ b/drivers/infiniband/ulp/vnic/vnic_control.c
> @@ -1450,12 +1450,10 @@ void control_cleanup(struct control *con
>  {
>  	CONTROL_FUNCTION("%s: control_disconnect()\n",
>  			 control_ifcfg_name(control));
> -	init_completion(&control->ib_conn.done);
>  
>  	if (ib_send_cm_dreq(control->ib_conn.cm_id, NULL, 0))
>  		printk(KERN_DEBUG "control CM DREQ sending failed\n");
> -	else
> -		wait_for_completion(&control->ib_conn.done);
> +
>  	control_timer_stop(control);
>  	ib_destroy_cm_id(control->ib_conn.cm_id);
>  	ib_destroy_qp(control->ib_conn.qp);
> diff --git a/drivers/infiniband/ulp/vnic/vnic_data.c b/drivers/infiniband/ulp/vnic/vnic_data.c
> index 0ce81f3..c1d056a 100644
> --- a/drivers/infiniband/ulp/vnic/vnic_data.c
> +++ b/drivers/infiniband/ulp/vnic/vnic_data.c
> @@ -666,11 +666,8 @@ void data_disconnect(struct data *data)
>  
>  void data_cleanup(struct data *data)
>  {
> -	init_completion(&data->ib_conn.done);
>  	if (ib_send_cm_dreq(data->ib_conn.cm_id, NULL, 0))
>  		printk(KERN_DEBUG "data CM DREQ sending failed\n");
> -	else
> -		wait_for_completion(&data->ib_conn.done);
>  
>  	ib_destroy_cm_id(data->ib_conn.cm_id);
>  	ib_destroy_qp(data->ib_conn.qp);
>
>
>
> _______________________________________________
> openfabrics-ewg mailing list
> openfabrics-ewg at openib.org
> http://openib.org/mailman/listinfo/openfabrics-ewg
>   
Added to kernel_patches/fixes

Regards,
Vladimir




More information about the ewg mailing list