net/smc: adapt SMC remote DELETE_RKEY processing to use the LLC flow
authorKarsten Graul <kgraul@linux.ibm.com>
Thu, 30 Apr 2020 13:55:49 +0000 (15:55 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 Apr 2020 19:44:34 +0000 (12:44 -0700)
Use the LLC flow framework for the processing of DELETE_RKEY messages
that were received from the peer.

Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Reviewed-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/smc_llc.c

index b7b5cc01b78e273abb19a70d30cac4c10ccf7625..e458207bde9eb51999bf06123963d720ca4b1955 100644 (file)
@@ -601,31 +601,37 @@ out:
        smc_llc_flow_qentry_del(&lgr->llc_flow_rmt);
 }
 
-static void smc_llc_rx_confirm_rkey_cont(struct smc_link *link,
-                                     struct smc_llc_msg_confirm_rkey_cont *llc)
-{
-       /* ignore rtokens for other links, we have only one link */
-       llc->hd.flags |= SMC_LLC_FLAG_RESP;
-       smc_llc_send_message(link, llc);
-}
-
-static void smc_llc_rx_delete_rkey(struct smc_link *link,
-                                  struct smc_llc_msg_delete_rkey *llc)
+/* process a delete_rkey request from peer, remote flow */
+static void smc_llc_rmt_delete_rkey(struct smc_link_group *lgr)
 {
+       struct smc_llc_msg_delete_rkey *llc;
+       struct smc_llc_qentry *qentry;
+       struct smc_link *link;
        u8 err_mask = 0;
        int i, max;
 
+       qentry = lgr->llc_flow_rmt.qentry;
+       llc = &qentry->msg.delete_rkey;
+       link = qentry->link;
+
        max = min_t(u8, llc->num_rkeys, SMC_LLC_DEL_RKEY_MAX);
        for (i = 0; i < max; i++) {
                if (smc_rtoken_delete(link, llc->rkey[i]))
                        err_mask |= 1 << (SMC_LLC_DEL_RKEY_MAX - 1 - i);
        }
-
        if (err_mask) {
                llc->hd.flags |= SMC_LLC_FLAG_RKEY_NEG;
                llc->err_mask = err_mask;
        }
+       llc->hd.flags |= SMC_LLC_FLAG_RESP;
+       smc_llc_send_message(link, &qentry->msg);
+       smc_llc_flow_qentry_del(&lgr->llc_flow_rmt);
+}
 
+static void smc_llc_rx_confirm_rkey_cont(struct smc_link *link,
+                                     struct smc_llc_msg_confirm_rkey_cont *llc)
+{
+       /* ignore rtokens for other links, we have only one link */
        llc->hd.flags |= SMC_LLC_FLAG_RESP;
        smc_llc_send_message(link, llc);
 }
@@ -698,8 +704,13 @@ static void smc_llc_event_handler(struct smc_llc_qentry *qentry)
                smc_llc_rx_confirm_rkey_cont(link, &llc->confirm_rkey_cont);
                break;
        case SMC_LLC_DELETE_RKEY:
-               smc_llc_rx_delete_rkey(link, &llc->delete_rkey);
-               break;
+               /* new request from remote, assign to remote flow */
+               if (smc_llc_flow_start(&lgr->llc_flow_rmt, qentry)) {
+                       /* process here, does not wait for more llc msgs */
+                       smc_llc_rmt_delete_rkey(lgr);
+                       smc_llc_flow_stop(lgr, &lgr->llc_flow_rmt);
+               }
+               return;
        }
 out:
        kfree(qentry);