Commit 5f78fe96 authored by Karsten Graul's avatar Karsten Graul Committed by David S. Miller

net/smc: simplify normal link termination

smc_lgr_terminate() and smc_lgr_terminate_sched() both result in soft
link termination, smc_lgr_terminate_sched() is scheduling a worker for
this task. Take out complexity by always using the termination worker
and getting rid of smc_lgr_terminate() completely.
Signed-off-by: default avatarKarsten Graul <kgraul@linux.ibm.com>
Signed-off-by: default avatarUrsula Braun <ubraun@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ba952060
...@@ -349,7 +349,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, ...@@ -349,7 +349,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
smc->peer_diagnosis = ntohl(dclc->peer_diagnosis); smc->peer_diagnosis = ntohl(dclc->peer_diagnosis);
if (((struct smc_clc_msg_decline *)buf)->hdr.flag) { if (((struct smc_clc_msg_decline *)buf)->hdr.flag) {
smc->conn.lgr->sync_err = 1; smc->conn.lgr->sync_err = 1;
smc_lgr_terminate(smc->conn.lgr); smc_lgr_terminate_sched(smc->conn.lgr);
} }
} }
......
...@@ -46,6 +46,7 @@ static DECLARE_WAIT_QUEUE_HEAD(lgrs_deleted); ...@@ -46,6 +46,7 @@ static DECLARE_WAIT_QUEUE_HEAD(lgrs_deleted);
static void smc_buf_free(struct smc_link_group *lgr, bool is_rmb, static void smc_buf_free(struct smc_link_group *lgr, bool is_rmb,
struct smc_buf_desc *buf_desc); struct smc_buf_desc *buf_desc);
static void __smc_lgr_terminate(struct smc_link_group *lgr, bool soft);
/* return head of link group list and its lock for a given link group */ /* return head of link group list and its lock for a given link group */
static inline struct list_head *smc_lgr_list_head(struct smc_link_group *lgr, static inline struct list_head *smc_lgr_list_head(struct smc_link_group *lgr,
...@@ -229,7 +230,7 @@ static void smc_lgr_terminate_work(struct work_struct *work) ...@@ -229,7 +230,7 @@ static void smc_lgr_terminate_work(struct work_struct *work)
struct smc_link_group *lgr = container_of(work, struct smc_link_group, struct smc_link_group *lgr = container_of(work, struct smc_link_group,
terminate_work); terminate_work);
smc_lgr_terminate(lgr); __smc_lgr_terminate(lgr, true);
} }
/* create a new SMC link group */ /* create a new SMC link group */
...@@ -622,8 +623,8 @@ static void __smc_lgr_terminate(struct smc_link_group *lgr, bool soft) ...@@ -622,8 +623,8 @@ static void __smc_lgr_terminate(struct smc_link_group *lgr, bool soft)
smc_lgr_free(lgr); smc_lgr_free(lgr);
} }
/* unlink and terminate link group */ /* unlink link group and schedule termination */
void smc_lgr_terminate(struct smc_link_group *lgr) void smc_lgr_terminate_sched(struct smc_link_group *lgr)
{ {
spinlock_t *lgr_lock; spinlock_t *lgr_lock;
...@@ -635,7 +636,7 @@ void smc_lgr_terminate(struct smc_link_group *lgr) ...@@ -635,7 +636,7 @@ void smc_lgr_terminate(struct smc_link_group *lgr)
} }
list_del_init(&lgr->list); list_del_init(&lgr->list);
spin_unlock_bh(lgr_lock); spin_unlock_bh(lgr_lock);
__smc_lgr_terminate(lgr, true); schedule_work(&lgr->terminate_work);
} }
/* Called when IB port is terminated */ /* Called when IB port is terminated */
......
...@@ -285,18 +285,12 @@ static inline struct smc_connection *smc_lgr_find_conn( ...@@ -285,18 +285,12 @@ static inline struct smc_connection *smc_lgr_find_conn(
return res; return res;
} }
static inline void smc_lgr_terminate_sched(struct smc_link_group *lgr)
{
if (!lgr->terminating && !lgr->freeing)
schedule_work(&lgr->terminate_work);
}
struct smc_sock; struct smc_sock;
struct smc_clc_msg_accept_confirm; struct smc_clc_msg_accept_confirm;
struct smc_clc_msg_local; struct smc_clc_msg_local;
void smc_lgr_forget(struct smc_link_group *lgr); void smc_lgr_forget(struct smc_link_group *lgr);
void smc_lgr_terminate(struct smc_link_group *lgr); void smc_lgr_terminate_sched(struct smc_link_group *lgr);
void smc_port_terminate(struct smc_ib_device *smcibdev, u8 ibport); void smc_port_terminate(struct smc_ib_device *smcibdev, u8 ibport);
void smc_smcd_terminate(struct smcd_dev *dev, u64 peer_gid, void smc_smcd_terminate(struct smcd_dev *dev, u64 peer_gid,
unsigned short vlan); unsigned short vlan);
......
...@@ -614,7 +614,7 @@ static void smc_llc_testlink_work(struct work_struct *work) ...@@ -614,7 +614,7 @@ static void smc_llc_testlink_work(struct work_struct *work)
rc = wait_for_completion_interruptible_timeout(&link->llc_testlink_resp, rc = wait_for_completion_interruptible_timeout(&link->llc_testlink_resp,
SMC_LLC_WAIT_TIME); SMC_LLC_WAIT_TIME);
if (rc <= 0) { if (rc <= 0) {
smc_lgr_terminate(smc_get_lgr(link)); smc_lgr_terminate_sched(smc_get_lgr(link));
return; return;
} }
next_interval = link->llc_testlink_time; next_interval = link->llc_testlink_time;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment