[openfabrics-ewg] [PATCH 2 of 2 IB/VNIC] Fix failover delay issue
Ramachandra K
ramachandra.kuchimanchi at qlogic.com
Thu Jan 25 03:20:23 PST 2007
Reduce 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 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 DREP 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