net/smc: map and register buffers for a new link
authorKarsten Graul <kgraul@linux.ibm.com>
Fri, 1 May 2020 10:48:03 +0000 (12:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 May 2020 23:20:04 +0000 (16:20 -0700)
Introduce support to map and register all current buffers for a new
link. smcr_buf_map_lgr() will map used buffers for a new link and
smcr_buf_reg_lgr() can be called to register used buffers on the
IB device of the new link.

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_core.c
net/smc/smc_core.h

index d5ecea490b4e8503f661ac75ec53f6718fd2e2b6..0e87f652caeae2779f7e83564c0dcf6828e5f812 100644 (file)
@@ -1185,6 +1185,66 @@ int smcr_link_reg_rmb(struct smc_link *link, struct smc_buf_desc *rmb_desc)
        return 0;
 }
 
+static int _smcr_buf_map_lgr(struct smc_link *lnk, struct mutex *lock,
+                            struct list_head *lst, bool is_rmb)
+{
+       struct smc_buf_desc *buf_desc, *bf;
+       int rc = 0;
+
+       mutex_lock(lock);
+       list_for_each_entry_safe(buf_desc, bf, lst, list) {
+               if (!buf_desc->used)
+                       continue;
+               rc = smcr_buf_map_link(buf_desc, is_rmb, lnk);
+               if (rc)
+                       goto out;
+       }
+out:
+       mutex_unlock(lock);
+       return rc;
+}
+
+/* map all used buffers of lgr for a new link */
+int smcr_buf_map_lgr(struct smc_link *lnk)
+{
+       struct smc_link_group *lgr = lnk->lgr;
+       int i, rc = 0;
+
+       for (i = 0; i < SMC_RMBE_SIZES; i++) {
+               rc = _smcr_buf_map_lgr(lnk, &lgr->rmbs_lock,
+                                      &lgr->rmbs[i], true);
+               if (rc)
+                       return rc;
+               rc = _smcr_buf_map_lgr(lnk, &lgr->sndbufs_lock,
+                                      &lgr->sndbufs[i], false);
+               if (rc)
+                       return rc;
+       }
+       return 0;
+}
+
+/* register all used buffers of lgr for a new link */
+int smcr_buf_reg_lgr(struct smc_link *lnk)
+{
+       struct smc_link_group *lgr = lnk->lgr;
+       struct smc_buf_desc *buf_desc, *bf;
+       int i, rc = 0;
+
+       mutex_lock(&lgr->rmbs_lock);
+       for (i = 0; i < SMC_RMBE_SIZES; i++) {
+               list_for_each_entry_safe(buf_desc, bf, &lgr->rmbs[i], list) {
+                       if (!buf_desc->used)
+                               continue;
+                       rc = smcr_link_reg_rmb(lnk, buf_desc);
+                       if (rc)
+                               goto out;
+               }
+       }
+out:
+       mutex_unlock(&lgr->rmbs_lock);
+       return rc;
+}
+
 static struct smc_buf_desc *smcr_new_buf_create(struct smc_link_group *lgr,
                                                bool is_rmb, int bufsize)
 {
index fa532a423fd79449b5a0bd9a9971bc476bd85cde..61ddb52649367a9b1264a7f2028953ebf2041344 100644 (file)
@@ -368,6 +368,8 @@ int smc_core_init(void);
 void smc_core_exit(void);
 
 void smcr_link_clear(struct smc_link *lnk);
+int smcr_buf_map_lgr(struct smc_link *lnk);
+int smcr_buf_reg_lgr(struct smc_link *lnk);
 int smcr_link_reg_rmb(struct smc_link *link, struct smc_buf_desc *rmb_desc);
 static inline struct smc_link_group *smc_get_lgr(struct smc_link *link)
 {