net/smc: simplify normal link termination
authorKarsten Graul <kgraul@linux.ibm.com>
Mon, 17 Feb 2020 15:24:54 +0000 (16:24 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 17 Feb 2020 22:50:24 +0000 (14:50 -0800)
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>
net/smc/smc_clc.c
net/smc/smc_core.c
net/smc/smc_core.h
net/smc/smc_llc.c

index aee9ccfa99c22e264c0f984e353d3767c5ac9e9c..3e16b887cfcf1c8e00ca6aaf3481f741dc0a8d61 100644 (file)
@@ -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);
                }
        }
 
index 53b6afbb1d9340e32ab09ea83189529a03fce5cd..1bbce553101429d6b72d8d499c39fe026ebface7 100644 (file)
@@ -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 */
index 094d43c2434573799cc6cde41749ef7f59d8f546..5695c7bc639eaccf9869c99d8d3bf7714c29b664 100644 (file)
@@ -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);
index b134a08c929eb0d98526ccaf5a1929dd2eaa68e2..0e52aab53d9742dc03953575674f26ad0909d3db 100644 (file)
@@ -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;