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

Ramachandra K ramachandra.kuchimanchi at qlogic.com
Tue Dec 19 08:42:12 PST 2006


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);






More information about the ewg mailing list