[ewg] [PATCH IB/VNIC] BUG FIX for VNIC hang on CM Reject

Vladimir Sokolovsky vlad at dev.mellanox.co.il
Tue Mar 27 09:29:41 PDT 2007


Ramachandra Kuchimanchi wrote:
> From: Poornima Kamath <poornima.kamath at qlogic.com>
> Signed-Off-By: Ramachandra Kuchimanchi <ramachandra.kuchimanchi at qlogic.com>
>
> This is a fix for the VNIC hanging on stopping the service when there is a CM
> Reject.
> ---
>
>  drivers/infiniband/ulp/vnic/vnic_ib.c     |   12 ++++++------
>  drivers/infiniband/ulp/vnic/vnic_ib.h     |    1 -
>  drivers/infiniband/ulp/vnic/vnic_viport.c |    4 ----
>  3 files changed, 6 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/infiniband/ulp/vnic/vnic_ib.c b/drivers/infiniband/ulp/vnic/vnic_ib.c
> index 56ae9f7..f3a40d1 100644
> --- a/drivers/infiniband/ulp/vnic/vnic_ib.c
> +++ b/drivers/infiniband/ulp/vnic/vnic_ib.c
> @@ -395,6 +395,7 @@ int vnic_ib_cm_handler(struct ib_cm_id *
>  	switch (event->event) {
>  	case IB_CM_REQ_ERROR:
>  		IB_ERROR("sending CM REQ failed\n");
> +		err = 1;
>  		disconn = 1;
>  		break;
>  	case IB_CM_REP_RECEIVED:
> @@ -417,6 +418,7 @@ int vnic_ib_cm_handler(struct ib_cm_id *
>  			printk(KERN_ERR "reason code : 0x%x\n",
>  			       event->param.rej_rcvd.reason);
>  
> +		err = 1;
>  		disconn = 1;
>  		break;
>  	case IB_CM_MRA_RECEIVED:
> @@ -439,17 +441,15 @@ int vnic_ib_cm_handler(struct ib_cm_id *
>  
>  	}
>  
> +	if (disconn)
> +		viport->disconnect = 1;
> +
>  	if (err) {
>  		ib_conn->state = IB_CONN_DISCONNECTED;
>  		viport_failure(viport);
>  	}
>  
> -	if (disconn) {
> -		ib_conn->state = IB_CONN_DISCONNECTED;
> -		viport_disconnect(viport);
> -
> -	}
> -	complete(&ib_conn->done);
> +	viport_kick(viport);
>  	return 0;
>  }
>  
> diff --git a/drivers/infiniband/ulp/vnic/vnic_ib.h b/drivers/infiniband/ulp/vnic/vnic_ib.h
> index f009876..ad66c24 100644
> --- a/drivers/infiniband/ulp/vnic/vnic_ib.h
> +++ b/drivers/infiniband/ulp/vnic/vnic_ib.h
> @@ -63,7 +63,6 @@ struct vnic_ib_conn {
>  	struct ib_qp		*qp;
>  	struct ib_cq		*cq;
>  	struct ib_cm_id		*cm_id;
> -	struct completion	done;
>  #ifdef CONFIG_INFINIBAND_VNIC_STATS
>  	struct {
>  		cycles_t	connection_time;
> diff --git a/drivers/infiniband/ulp/vnic/vnic_viport.c b/drivers/infiniband/ulp/vnic/vnic_viport.c
> index 1dee71a..a19fd4c 100644
> --- a/drivers/infiniband/ulp/vnic/vnic_viport.c
> +++ b/drivers/infiniband/ulp/vnic/vnic_viport.c
> @@ -428,7 +428,6 @@ static int viport_handle_control_states(
>  	do {
>  		switch(old_state = viport->link_state) {
>  		case LINK_CONTROLCONNECT:
> -			init_completion(&(viport->control.ib_conn.done));
>  			if (vnic_ib_cm_connect(&viport->control.ib_conn))
>  				viport->link_state = LINK_CLEANUPDATA;
>  			else
> @@ -436,7 +435,6 @@ static int viport_handle_control_states(
>  			break;
>  		case LINK_CONTROLCONNECTWAIT:
>  			LINK_STATE("state LINK_CONTROLCONNECTWAIT\n");
> -			wait_for_completion(&(viport->control.ib_conn.done));
>  			if (control_is_connected(&viport->control))
>  				viport->link_state = LINK_INITVNICREQ;
>  			if (viport->errored) {
> @@ -530,7 +528,6 @@ static int viport_handle_data_states(str
>  			break;
>  		case LINK_DATACONNECT:
>  			LINK_STATE("state LINK_DATACONNECT\n");
> -			init_completion(&viport->data.ib_conn.done);
>  			if (data_connect(&viport->data))
>  				viport->link_state = LINK_RESETCONTROL;
>  			else
> @@ -538,7 +535,6 @@ static int viport_handle_data_states(str
>  			break;
>  		case LINK_DATACONNECTWAIT:
>  			LINK_STATE("state LINK_DATACONNECTWAIT\n");
> -			wait_for_completion(&viport->data.ib_conn.done);
>  			control_process_async(&viport->control);
>  			if (data_is_connected(&viport->data))
>  				viport->link_state = LINK_XCHGPOOLREQ;
>
>
> _______________________________________________
> ewg mailing list
> ewg at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg
>
>   
This patch failed to be applied:

patching file drivers/infiniband/ulp/vnic/vnic_ib.c
Hunk #1 FAILED at 395.
Hunk #2 FAILED at 418.
Hunk #3 FAILED at 441.
3 out of 3 hunks FAILED -- saving rejects to file 
drivers/infiniband/ulp/vnic/vnic_ib.c.rej
patching file drivers/infiniband/ulp/vnic/vnic_ib.h
Hunk #1 FAILED at 63.
1 out of 1 hunk FAILED -- saving rejects to file 
drivers/infiniband/ulp/vnic/vnic_ib.h.rej
patching file drivers/infiniband/ulp/vnic/vnic_viport.c
Hunk #1 FAILED at 428.
Hunk #2 FAILED at 435.
Hunk #3 FAILED at 528.
Hunk #4 FAILED at 535.
4 out of 4 hunks FAILED -- saving rejects to file 
drivers/infiniband/ulp/vnic/vnic_viport.c.rej


Regards,
Vladimir



More information about the ewg mailing list