mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
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: Karsten Graul <kgraul@linux.ibm.com> Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ba95206042
commit
5f78fe968d
@ -349,7 +349,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
|
||||
smc->peer_diagnosis = ntohl(dclc->peer_diagnosis);
|
||||
if (((struct smc_clc_msg_decline *)buf)->hdr.flag) {
|
||||
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);
|
||||
|
||||
static void smc_buf_free(struct smc_link_group *lgr, bool is_rmb,
|
||||
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 */
|
||||
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)
|
||||
struct smc_link_group *lgr = container_of(work, struct smc_link_group,
|
||||
terminate_work);
|
||||
|
||||
smc_lgr_terminate(lgr);
|
||||
__smc_lgr_terminate(lgr, true);
|
||||
}
|
||||
|
||||
/* create a new SMC link group */
|
||||
@ -622,8 +623,8 @@ static void __smc_lgr_terminate(struct smc_link_group *lgr, bool soft)
|
||||
smc_lgr_free(lgr);
|
||||
}
|
||||
|
||||
/* unlink and terminate link group */
|
||||
void smc_lgr_terminate(struct smc_link_group *lgr)
|
||||
/* unlink link group and schedule termination */
|
||||
void smc_lgr_terminate_sched(struct smc_link_group *lgr)
|
||||
{
|
||||
spinlock_t *lgr_lock;
|
||||
|
||||
@ -635,7 +636,7 @@ void smc_lgr_terminate(struct smc_link_group *lgr)
|
||||
}
|
||||
list_del_init(&lgr->list);
|
||||
spin_unlock_bh(lgr_lock);
|
||||
__smc_lgr_terminate(lgr, true);
|
||||
schedule_work(&lgr->terminate_work);
|
||||
}
|
||||
|
||||
/* Called when IB port is terminated */
|
||||
|
@ -285,18 +285,12 @@ static inline struct smc_connection *smc_lgr_find_conn(
|
||||
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_clc_msg_accept_confirm;
|
||||
struct smc_clc_msg_local;
|
||||
|
||||
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_smcd_terminate(struct smcd_dev *dev, u64 peer_gid,
|
||||
unsigned short vlan);
|
||||
|
@ -614,7 +614,7 @@ static void smc_llc_testlink_work(struct work_struct *work)
|
||||
rc = wait_for_completion_interruptible_timeout(&link->llc_testlink_resp,
|
||||
SMC_LLC_WAIT_TIME);
|
||||
if (rc <= 0) {
|
||||
smc_lgr_terminate(smc_get_lgr(link));
|
||||
smc_lgr_terminate_sched(smc_get_lgr(link));
|
||||
return;
|
||||
}
|
||||
next_interval = link->llc_testlink_time;
|
||||
|
Loading…
Reference in New Issue
Block a user