0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/socket.h>
0013 #include <linux/if_vlan.h>
0014 #include <linux/random.h>
0015 #include <linux/workqueue.h>
0016 #include <linux/wait.h>
0017 #include <linux/reboot.h>
0018 #include <linux/mutex.h>
0019 #include <linux/list.h>
0020 #include <linux/smc.h>
0021 #include <net/tcp.h>
0022 #include <net/sock.h>
0023 #include <rdma/ib_verbs.h>
0024 #include <rdma/ib_cache.h>
0025
0026 #include "smc.h"
0027 #include "smc_clc.h"
0028 #include "smc_core.h"
0029 #include "smc_ib.h"
0030 #include "smc_wr.h"
0031 #include "smc_llc.h"
0032 #include "smc_cdc.h"
0033 #include "smc_close.h"
0034 #include "smc_ism.h"
0035 #include "smc_netlink.h"
0036 #include "smc_stats.h"
0037 #include "smc_tracepoint.h"
0038
0039 #define SMC_LGR_NUM_INCR 256
0040 #define SMC_LGR_FREE_DELAY_SERV (600 * HZ)
0041 #define SMC_LGR_FREE_DELAY_CLNT (SMC_LGR_FREE_DELAY_SERV + 10 * HZ)
0042
0043 struct smc_lgr_list smc_lgr_list = {
0044 .lock = __SPIN_LOCK_UNLOCKED(smc_lgr_list.lock),
0045 .list = LIST_HEAD_INIT(smc_lgr_list.list),
0046 .num = 0,
0047 };
0048
0049 static atomic_t lgr_cnt = ATOMIC_INIT(0);
0050 static DECLARE_WAIT_QUEUE_HEAD(lgrs_deleted);
0051
0052 static void smc_buf_free(struct smc_link_group *lgr, bool is_rmb,
0053 struct smc_buf_desc *buf_desc);
0054 static void __smc_lgr_terminate(struct smc_link_group *lgr, bool soft);
0055
0056 static void smc_link_down_work(struct work_struct *work);
0057
0058
0059 static inline struct list_head *smc_lgr_list_head(struct smc_link_group *lgr,
0060 spinlock_t **lgr_lock)
0061 {
0062 if (lgr->is_smcd) {
0063 *lgr_lock = &lgr->smcd->lgr_lock;
0064 return &lgr->smcd->lgr_list;
0065 }
0066
0067 *lgr_lock = &smc_lgr_list.lock;
0068 return &smc_lgr_list.list;
0069 }
0070
0071 static void smc_ibdev_cnt_inc(struct smc_link *lnk)
0072 {
0073 atomic_inc(&lnk->smcibdev->lnk_cnt_by_port[lnk->ibport - 1]);
0074 }
0075
0076 static void smc_ibdev_cnt_dec(struct smc_link *lnk)
0077 {
0078 atomic_dec(&lnk->smcibdev->lnk_cnt_by_port[lnk->ibport - 1]);
0079 }
0080
0081 static void smc_lgr_schedule_free_work(struct smc_link_group *lgr)
0082 {
0083
0084
0085
0086
0087 if (!lgr->freeing) {
0088 mod_delayed_work(system_wq, &lgr->free_work,
0089 (!lgr->is_smcd && lgr->role == SMC_CLNT) ?
0090 SMC_LGR_FREE_DELAY_CLNT :
0091 SMC_LGR_FREE_DELAY_SERV);
0092 }
0093 }
0094
0095
0096
0097
0098
0099
0100
0101 static void smc_lgr_add_alert_token(struct smc_connection *conn)
0102 {
0103 struct rb_node **link, *parent = NULL;
0104 u32 token = conn->alert_token_local;
0105
0106 link = &conn->lgr->conns_all.rb_node;
0107 while (*link) {
0108 struct smc_connection *cur = rb_entry(*link,
0109 struct smc_connection, alert_node);
0110
0111 parent = *link;
0112 if (cur->alert_token_local > token)
0113 link = &parent->rb_left;
0114 else
0115 link = &parent->rb_right;
0116 }
0117
0118 rb_link_node(&conn->alert_node, parent, link);
0119 rb_insert_color(&conn->alert_node, &conn->lgr->conns_all);
0120 }
0121
0122
0123 static int smcr_lgr_conn_assign_link(struct smc_connection *conn, bool first)
0124 {
0125 enum smc_link_state expected = first ? SMC_LNK_ACTIVATING :
0126 SMC_LNK_ACTIVE;
0127 int i, j;
0128
0129
0130 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
0131 struct smc_link *lnk = &conn->lgr->lnk[i];
0132
0133 if (lnk->state != expected || lnk->link_is_asym)
0134 continue;
0135 if (conn->lgr->role == SMC_CLNT) {
0136 conn->lnk = lnk;
0137 break;
0138 }
0139 if (conn->lgr->conns_num % 2) {
0140 for (j = i + 1; j < SMC_LINKS_PER_LGR_MAX; j++) {
0141 struct smc_link *lnk2;
0142
0143 lnk2 = &conn->lgr->lnk[j];
0144 if (lnk2->state == expected &&
0145 !lnk2->link_is_asym) {
0146 conn->lnk = lnk2;
0147 break;
0148 }
0149 }
0150 }
0151 if (!conn->lnk)
0152 conn->lnk = lnk;
0153 break;
0154 }
0155 if (!conn->lnk)
0156 return SMC_CLC_DECL_NOACTLINK;
0157 atomic_inc(&conn->lnk->conn_cnt);
0158 return 0;
0159 }
0160
0161
0162
0163
0164
0165
0166 static int smc_lgr_register_conn(struct smc_connection *conn, bool first)
0167 {
0168 struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
0169 static atomic_t nexttoken = ATOMIC_INIT(0);
0170 int rc;
0171
0172 if (!conn->lgr->is_smcd) {
0173 rc = smcr_lgr_conn_assign_link(conn, first);
0174 if (rc) {
0175 conn->lgr = NULL;
0176 return rc;
0177 }
0178 }
0179
0180
0181
0182 sock_hold(&smc->sk);
0183 while (!conn->alert_token_local) {
0184 conn->alert_token_local = atomic_inc_return(&nexttoken);
0185 if (smc_lgr_find_conn(conn->alert_token_local, conn->lgr))
0186 conn->alert_token_local = 0;
0187 }
0188 smc_lgr_add_alert_token(conn);
0189 conn->lgr->conns_num++;
0190 return 0;
0191 }
0192
0193
0194
0195 static void __smc_lgr_unregister_conn(struct smc_connection *conn)
0196 {
0197 struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
0198 struct smc_link_group *lgr = conn->lgr;
0199
0200 rb_erase(&conn->alert_node, &lgr->conns_all);
0201 if (conn->lnk)
0202 atomic_dec(&conn->lnk->conn_cnt);
0203 lgr->conns_num--;
0204 conn->alert_token_local = 0;
0205 sock_put(&smc->sk);
0206 }
0207
0208
0209
0210 static void smc_lgr_unregister_conn(struct smc_connection *conn)
0211 {
0212 struct smc_link_group *lgr = conn->lgr;
0213
0214 if (!smc_conn_lgr_valid(conn))
0215 return;
0216 write_lock_bh(&lgr->conns_lock);
0217 if (conn->alert_token_local) {
0218 __smc_lgr_unregister_conn(conn);
0219 }
0220 write_unlock_bh(&lgr->conns_lock);
0221 }
0222
0223 int smc_nl_get_sys_info(struct sk_buff *skb, struct netlink_callback *cb)
0224 {
0225 struct smc_nl_dmp_ctx *cb_ctx = smc_nl_dmp_ctx(cb);
0226 char hostname[SMC_MAX_HOSTNAME_LEN + 1];
0227 char smc_seid[SMC_MAX_EID_LEN + 1];
0228 struct nlattr *attrs;
0229 u8 *seid = NULL;
0230 u8 *host = NULL;
0231 void *nlh;
0232
0233 nlh = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
0234 &smc_gen_nl_family, NLM_F_MULTI,
0235 SMC_NETLINK_GET_SYS_INFO);
0236 if (!nlh)
0237 goto errmsg;
0238 if (cb_ctx->pos[0])
0239 goto errout;
0240 attrs = nla_nest_start(skb, SMC_GEN_SYS_INFO);
0241 if (!attrs)
0242 goto errout;
0243 if (nla_put_u8(skb, SMC_NLA_SYS_VER, SMC_V2))
0244 goto errattr;
0245 if (nla_put_u8(skb, SMC_NLA_SYS_REL, SMC_RELEASE))
0246 goto errattr;
0247 if (nla_put_u8(skb, SMC_NLA_SYS_IS_ISM_V2, smc_ism_is_v2_capable()))
0248 goto errattr;
0249 if (nla_put_u8(skb, SMC_NLA_SYS_IS_SMCR_V2, true))
0250 goto errattr;
0251 smc_clc_get_hostname(&host);
0252 if (host) {
0253 memcpy(hostname, host, SMC_MAX_HOSTNAME_LEN);
0254 hostname[SMC_MAX_HOSTNAME_LEN] = 0;
0255 if (nla_put_string(skb, SMC_NLA_SYS_LOCAL_HOST, hostname))
0256 goto errattr;
0257 }
0258 if (smc_ism_is_v2_capable()) {
0259 smc_ism_get_system_eid(&seid);
0260 memcpy(smc_seid, seid, SMC_MAX_EID_LEN);
0261 smc_seid[SMC_MAX_EID_LEN] = 0;
0262 if (nla_put_string(skb, SMC_NLA_SYS_SEID, smc_seid))
0263 goto errattr;
0264 }
0265 nla_nest_end(skb, attrs);
0266 genlmsg_end(skb, nlh);
0267 cb_ctx->pos[0] = 1;
0268 return skb->len;
0269
0270 errattr:
0271 nla_nest_cancel(skb, attrs);
0272 errout:
0273 genlmsg_cancel(skb, nlh);
0274 errmsg:
0275 return skb->len;
0276 }
0277
0278
0279 static int smc_nl_fill_lgr_v2_common(struct smc_link_group *lgr,
0280 struct sk_buff *skb,
0281 struct netlink_callback *cb,
0282 struct nlattr *v2_attrs)
0283 {
0284 char smc_host[SMC_MAX_HOSTNAME_LEN + 1];
0285 char smc_eid[SMC_MAX_EID_LEN + 1];
0286
0287 if (nla_put_u8(skb, SMC_NLA_LGR_V2_VER, lgr->smc_version))
0288 goto errv2attr;
0289 if (nla_put_u8(skb, SMC_NLA_LGR_V2_REL, lgr->peer_smc_release))
0290 goto errv2attr;
0291 if (nla_put_u8(skb, SMC_NLA_LGR_V2_OS, lgr->peer_os))
0292 goto errv2attr;
0293 memcpy(smc_host, lgr->peer_hostname, SMC_MAX_HOSTNAME_LEN);
0294 smc_host[SMC_MAX_HOSTNAME_LEN] = 0;
0295 if (nla_put_string(skb, SMC_NLA_LGR_V2_PEER_HOST, smc_host))
0296 goto errv2attr;
0297 memcpy(smc_eid, lgr->negotiated_eid, SMC_MAX_EID_LEN);
0298 smc_eid[SMC_MAX_EID_LEN] = 0;
0299 if (nla_put_string(skb, SMC_NLA_LGR_V2_NEG_EID, smc_eid))
0300 goto errv2attr;
0301
0302 nla_nest_end(skb, v2_attrs);
0303 return 0;
0304
0305 errv2attr:
0306 nla_nest_cancel(skb, v2_attrs);
0307 return -EMSGSIZE;
0308 }
0309
0310 static int smc_nl_fill_smcr_lgr_v2(struct smc_link_group *lgr,
0311 struct sk_buff *skb,
0312 struct netlink_callback *cb)
0313 {
0314 struct nlattr *v2_attrs;
0315
0316 v2_attrs = nla_nest_start(skb, SMC_NLA_LGR_R_V2);
0317 if (!v2_attrs)
0318 goto errattr;
0319 if (nla_put_u8(skb, SMC_NLA_LGR_R_V2_DIRECT, !lgr->uses_gateway))
0320 goto errv2attr;
0321
0322 nla_nest_end(skb, v2_attrs);
0323 return 0;
0324
0325 errv2attr:
0326 nla_nest_cancel(skb, v2_attrs);
0327 errattr:
0328 return -EMSGSIZE;
0329 }
0330
0331 static int smc_nl_fill_lgr(struct smc_link_group *lgr,
0332 struct sk_buff *skb,
0333 struct netlink_callback *cb)
0334 {
0335 char smc_target[SMC_MAX_PNETID_LEN + 1];
0336 struct nlattr *attrs, *v2_attrs;
0337
0338 attrs = nla_nest_start(skb, SMC_GEN_LGR_SMCR);
0339 if (!attrs)
0340 goto errout;
0341
0342 if (nla_put_u32(skb, SMC_NLA_LGR_R_ID, *((u32 *)&lgr->id)))
0343 goto errattr;
0344 if (nla_put_u32(skb, SMC_NLA_LGR_R_CONNS_NUM, lgr->conns_num))
0345 goto errattr;
0346 if (nla_put_u8(skb, SMC_NLA_LGR_R_ROLE, lgr->role))
0347 goto errattr;
0348 if (nla_put_u8(skb, SMC_NLA_LGR_R_TYPE, lgr->type))
0349 goto errattr;
0350 if (nla_put_u8(skb, SMC_NLA_LGR_R_BUF_TYPE, lgr->buf_type))
0351 goto errattr;
0352 if (nla_put_u8(skb, SMC_NLA_LGR_R_VLAN_ID, lgr->vlan_id))
0353 goto errattr;
0354 if (nla_put_u64_64bit(skb, SMC_NLA_LGR_R_NET_COOKIE,
0355 lgr->net->net_cookie, SMC_NLA_LGR_R_PAD))
0356 goto errattr;
0357 memcpy(smc_target, lgr->pnet_id, SMC_MAX_PNETID_LEN);
0358 smc_target[SMC_MAX_PNETID_LEN] = 0;
0359 if (nla_put_string(skb, SMC_NLA_LGR_R_PNETID, smc_target))
0360 goto errattr;
0361 if (lgr->smc_version > SMC_V1) {
0362 v2_attrs = nla_nest_start(skb, SMC_NLA_LGR_R_V2_COMMON);
0363 if (!v2_attrs)
0364 goto errattr;
0365 if (smc_nl_fill_lgr_v2_common(lgr, skb, cb, v2_attrs))
0366 goto errattr;
0367 if (smc_nl_fill_smcr_lgr_v2(lgr, skb, cb))
0368 goto errattr;
0369 }
0370
0371 nla_nest_end(skb, attrs);
0372 return 0;
0373 errattr:
0374 nla_nest_cancel(skb, attrs);
0375 errout:
0376 return -EMSGSIZE;
0377 }
0378
0379 static int smc_nl_fill_lgr_link(struct smc_link_group *lgr,
0380 struct smc_link *link,
0381 struct sk_buff *skb,
0382 struct netlink_callback *cb)
0383 {
0384 char smc_ibname[IB_DEVICE_NAME_MAX];
0385 u8 smc_gid_target[41];
0386 struct nlattr *attrs;
0387 u32 link_uid = 0;
0388 void *nlh;
0389
0390 nlh = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
0391 &smc_gen_nl_family, NLM_F_MULTI,
0392 SMC_NETLINK_GET_LINK_SMCR);
0393 if (!nlh)
0394 goto errmsg;
0395
0396 attrs = nla_nest_start(skb, SMC_GEN_LINK_SMCR);
0397 if (!attrs)
0398 goto errout;
0399
0400 if (nla_put_u8(skb, SMC_NLA_LINK_ID, link->link_id))
0401 goto errattr;
0402 if (nla_put_u32(skb, SMC_NLA_LINK_STATE, link->state))
0403 goto errattr;
0404 if (nla_put_u32(skb, SMC_NLA_LINK_CONN_CNT,
0405 atomic_read(&link->conn_cnt)))
0406 goto errattr;
0407 if (nla_put_u8(skb, SMC_NLA_LINK_IB_PORT, link->ibport))
0408 goto errattr;
0409 if (nla_put_u32(skb, SMC_NLA_LINK_NET_DEV, link->ndev_ifidx))
0410 goto errattr;
0411 snprintf(smc_ibname, sizeof(smc_ibname), "%s", link->ibname);
0412 if (nla_put_string(skb, SMC_NLA_LINK_IB_DEV, smc_ibname))
0413 goto errattr;
0414 memcpy(&link_uid, link->link_uid, sizeof(link_uid));
0415 if (nla_put_u32(skb, SMC_NLA_LINK_UID, link_uid))
0416 goto errattr;
0417 memcpy(&link_uid, link->peer_link_uid, sizeof(link_uid));
0418 if (nla_put_u32(skb, SMC_NLA_LINK_PEER_UID, link_uid))
0419 goto errattr;
0420 memset(smc_gid_target, 0, sizeof(smc_gid_target));
0421 smc_gid_be16_convert(smc_gid_target, link->gid);
0422 if (nla_put_string(skb, SMC_NLA_LINK_GID, smc_gid_target))
0423 goto errattr;
0424 memset(smc_gid_target, 0, sizeof(smc_gid_target));
0425 smc_gid_be16_convert(smc_gid_target, link->peer_gid);
0426 if (nla_put_string(skb, SMC_NLA_LINK_PEER_GID, smc_gid_target))
0427 goto errattr;
0428
0429 nla_nest_end(skb, attrs);
0430 genlmsg_end(skb, nlh);
0431 return 0;
0432 errattr:
0433 nla_nest_cancel(skb, attrs);
0434 errout:
0435 genlmsg_cancel(skb, nlh);
0436 errmsg:
0437 return -EMSGSIZE;
0438 }
0439
0440 static int smc_nl_handle_lgr(struct smc_link_group *lgr,
0441 struct sk_buff *skb,
0442 struct netlink_callback *cb,
0443 bool list_links)
0444 {
0445 void *nlh;
0446 int i;
0447
0448 nlh = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
0449 &smc_gen_nl_family, NLM_F_MULTI,
0450 SMC_NETLINK_GET_LGR_SMCR);
0451 if (!nlh)
0452 goto errmsg;
0453 if (smc_nl_fill_lgr(lgr, skb, cb))
0454 goto errout;
0455
0456 genlmsg_end(skb, nlh);
0457 if (!list_links)
0458 goto out;
0459 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
0460 if (!smc_link_usable(&lgr->lnk[i]))
0461 continue;
0462 if (smc_nl_fill_lgr_link(lgr, &lgr->lnk[i], skb, cb))
0463 goto errout;
0464 }
0465 out:
0466 return 0;
0467
0468 errout:
0469 genlmsg_cancel(skb, nlh);
0470 errmsg:
0471 return -EMSGSIZE;
0472 }
0473
0474 static void smc_nl_fill_lgr_list(struct smc_lgr_list *smc_lgr,
0475 struct sk_buff *skb,
0476 struct netlink_callback *cb,
0477 bool list_links)
0478 {
0479 struct smc_nl_dmp_ctx *cb_ctx = smc_nl_dmp_ctx(cb);
0480 struct smc_link_group *lgr;
0481 int snum = cb_ctx->pos[0];
0482 int num = 0;
0483
0484 spin_lock_bh(&smc_lgr->lock);
0485 list_for_each_entry(lgr, &smc_lgr->list, list) {
0486 if (num < snum)
0487 goto next;
0488 if (smc_nl_handle_lgr(lgr, skb, cb, list_links))
0489 goto errout;
0490 next:
0491 num++;
0492 }
0493 errout:
0494 spin_unlock_bh(&smc_lgr->lock);
0495 cb_ctx->pos[0] = num;
0496 }
0497
0498 static int smc_nl_fill_smcd_lgr(struct smc_link_group *lgr,
0499 struct sk_buff *skb,
0500 struct netlink_callback *cb)
0501 {
0502 char smc_pnet[SMC_MAX_PNETID_LEN + 1];
0503 struct nlattr *attrs;
0504 void *nlh;
0505
0506 nlh = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
0507 &smc_gen_nl_family, NLM_F_MULTI,
0508 SMC_NETLINK_GET_LGR_SMCD);
0509 if (!nlh)
0510 goto errmsg;
0511
0512 attrs = nla_nest_start(skb, SMC_GEN_LGR_SMCD);
0513 if (!attrs)
0514 goto errout;
0515
0516 if (nla_put_u32(skb, SMC_NLA_LGR_D_ID, *((u32 *)&lgr->id)))
0517 goto errattr;
0518 if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_GID, lgr->smcd->local_gid,
0519 SMC_NLA_LGR_D_PAD))
0520 goto errattr;
0521 if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_PEER_GID, lgr->peer_gid,
0522 SMC_NLA_LGR_D_PAD))
0523 goto errattr;
0524 if (nla_put_u8(skb, SMC_NLA_LGR_D_VLAN_ID, lgr->vlan_id))
0525 goto errattr;
0526 if (nla_put_u32(skb, SMC_NLA_LGR_D_CONNS_NUM, lgr->conns_num))
0527 goto errattr;
0528 if (nla_put_u32(skb, SMC_NLA_LGR_D_CHID, smc_ism_get_chid(lgr->smcd)))
0529 goto errattr;
0530 memcpy(smc_pnet, lgr->smcd->pnetid, SMC_MAX_PNETID_LEN);
0531 smc_pnet[SMC_MAX_PNETID_LEN] = 0;
0532 if (nla_put_string(skb, SMC_NLA_LGR_D_PNETID, smc_pnet))
0533 goto errattr;
0534 if (lgr->smc_version > SMC_V1) {
0535 struct nlattr *v2_attrs;
0536
0537 v2_attrs = nla_nest_start(skb, SMC_NLA_LGR_D_V2_COMMON);
0538 if (!v2_attrs)
0539 goto errattr;
0540 if (smc_nl_fill_lgr_v2_common(lgr, skb, cb, v2_attrs))
0541 goto errattr;
0542 }
0543 nla_nest_end(skb, attrs);
0544 genlmsg_end(skb, nlh);
0545 return 0;
0546
0547 errattr:
0548 nla_nest_cancel(skb, attrs);
0549 errout:
0550 genlmsg_cancel(skb, nlh);
0551 errmsg:
0552 return -EMSGSIZE;
0553 }
0554
0555 static int smc_nl_handle_smcd_lgr(struct smcd_dev *dev,
0556 struct sk_buff *skb,
0557 struct netlink_callback *cb)
0558 {
0559 struct smc_nl_dmp_ctx *cb_ctx = smc_nl_dmp_ctx(cb);
0560 struct smc_link_group *lgr;
0561 int snum = cb_ctx->pos[1];
0562 int rc = 0, num = 0;
0563
0564 spin_lock_bh(&dev->lgr_lock);
0565 list_for_each_entry(lgr, &dev->lgr_list, list) {
0566 if (!lgr->is_smcd)
0567 continue;
0568 if (num < snum)
0569 goto next;
0570 rc = smc_nl_fill_smcd_lgr(lgr, skb, cb);
0571 if (rc)
0572 goto errout;
0573 next:
0574 num++;
0575 }
0576 errout:
0577 spin_unlock_bh(&dev->lgr_lock);
0578 cb_ctx->pos[1] = num;
0579 return rc;
0580 }
0581
0582 static int smc_nl_fill_smcd_dev(struct smcd_dev_list *dev_list,
0583 struct sk_buff *skb,
0584 struct netlink_callback *cb)
0585 {
0586 struct smc_nl_dmp_ctx *cb_ctx = smc_nl_dmp_ctx(cb);
0587 struct smcd_dev *smcd_dev;
0588 int snum = cb_ctx->pos[0];
0589 int rc = 0, num = 0;
0590
0591 mutex_lock(&dev_list->mutex);
0592 list_for_each_entry(smcd_dev, &dev_list->list, list) {
0593 if (list_empty(&smcd_dev->lgr_list))
0594 continue;
0595 if (num < snum)
0596 goto next;
0597 rc = smc_nl_handle_smcd_lgr(smcd_dev, skb, cb);
0598 if (rc)
0599 goto errout;
0600 next:
0601 num++;
0602 }
0603 errout:
0604 mutex_unlock(&dev_list->mutex);
0605 cb_ctx->pos[0] = num;
0606 return rc;
0607 }
0608
0609 int smcr_nl_get_lgr(struct sk_buff *skb, struct netlink_callback *cb)
0610 {
0611 bool list_links = false;
0612
0613 smc_nl_fill_lgr_list(&smc_lgr_list, skb, cb, list_links);
0614 return skb->len;
0615 }
0616
0617 int smcr_nl_get_link(struct sk_buff *skb, struct netlink_callback *cb)
0618 {
0619 bool list_links = true;
0620
0621 smc_nl_fill_lgr_list(&smc_lgr_list, skb, cb, list_links);
0622 return skb->len;
0623 }
0624
0625 int smcd_nl_get_lgr(struct sk_buff *skb, struct netlink_callback *cb)
0626 {
0627 smc_nl_fill_smcd_dev(&smcd_dev_list, skb, cb);
0628 return skb->len;
0629 }
0630
0631 void smc_lgr_cleanup_early(struct smc_link_group *lgr)
0632 {
0633 spinlock_t *lgr_lock;
0634
0635 if (!lgr)
0636 return;
0637
0638 smc_lgr_list_head(lgr, &lgr_lock);
0639 spin_lock_bh(lgr_lock);
0640
0641 if (!list_empty(&lgr->list))
0642 list_del_init(&lgr->list);
0643 spin_unlock_bh(lgr_lock);
0644 __smc_lgr_terminate(lgr, true);
0645 }
0646
0647 static void smcr_lgr_link_deactivate_all(struct smc_link_group *lgr)
0648 {
0649 int i;
0650
0651 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
0652 struct smc_link *lnk = &lgr->lnk[i];
0653
0654 if (smc_link_sendable(lnk))
0655 lnk->state = SMC_LNK_INACTIVE;
0656 }
0657 wake_up_all(&lgr->llc_msg_waiter);
0658 wake_up_all(&lgr->llc_flow_waiter);
0659 }
0660
0661 static void smc_lgr_free(struct smc_link_group *lgr);
0662
0663 static void smc_lgr_free_work(struct work_struct *work)
0664 {
0665 struct smc_link_group *lgr = container_of(to_delayed_work(work),
0666 struct smc_link_group,
0667 free_work);
0668 spinlock_t *lgr_lock;
0669 bool conns;
0670
0671 smc_lgr_list_head(lgr, &lgr_lock);
0672 spin_lock_bh(lgr_lock);
0673 if (lgr->freeing) {
0674 spin_unlock_bh(lgr_lock);
0675 return;
0676 }
0677 read_lock_bh(&lgr->conns_lock);
0678 conns = RB_EMPTY_ROOT(&lgr->conns_all);
0679 read_unlock_bh(&lgr->conns_lock);
0680 if (!conns) {
0681 spin_unlock_bh(lgr_lock);
0682 return;
0683 }
0684 list_del_init(&lgr->list);
0685 lgr->freeing = 1;
0686 spin_unlock_bh(lgr_lock);
0687 cancel_delayed_work(&lgr->free_work);
0688
0689 if (!lgr->is_smcd && !lgr->terminating)
0690 smc_llc_send_link_delete_all(lgr, true,
0691 SMC_LLC_DEL_PROG_INIT_TERM);
0692 if (lgr->is_smcd && !lgr->terminating)
0693 smc_ism_signal_shutdown(lgr);
0694 if (!lgr->is_smcd)
0695 smcr_lgr_link_deactivate_all(lgr);
0696 smc_lgr_free(lgr);
0697 }
0698
0699 static void smc_lgr_terminate_work(struct work_struct *work)
0700 {
0701 struct smc_link_group *lgr = container_of(work, struct smc_link_group,
0702 terminate_work);
0703
0704 __smc_lgr_terminate(lgr, true);
0705 }
0706
0707
0708 static u8 smcr_next_link_id(struct smc_link_group *lgr)
0709 {
0710 u8 link_id;
0711 int i;
0712
0713 while (1) {
0714 again:
0715 link_id = ++lgr->next_link_id;
0716 if (!link_id)
0717 link_id = ++lgr->next_link_id;
0718 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
0719 if (smc_link_usable(&lgr->lnk[i]) &&
0720 lgr->lnk[i].link_id == link_id)
0721 goto again;
0722 }
0723 break;
0724 }
0725 return link_id;
0726 }
0727
0728 static void smcr_copy_dev_info_to_link(struct smc_link *link)
0729 {
0730 struct smc_ib_device *smcibdev = link->smcibdev;
0731
0732 snprintf(link->ibname, sizeof(link->ibname), "%s",
0733 smcibdev->ibdev->name);
0734 link->ndev_ifidx = smcibdev->ndev_ifidx[link->ibport - 1];
0735 }
0736
0737 int smcr_link_init(struct smc_link_group *lgr, struct smc_link *lnk,
0738 u8 link_idx, struct smc_init_info *ini)
0739 {
0740 struct smc_ib_device *smcibdev;
0741 u8 rndvec[3];
0742 int rc;
0743
0744 if (lgr->smc_version == SMC_V2) {
0745 lnk->smcibdev = ini->smcrv2.ib_dev_v2;
0746 lnk->ibport = ini->smcrv2.ib_port_v2;
0747 } else {
0748 lnk->smcibdev = ini->ib_dev;
0749 lnk->ibport = ini->ib_port;
0750 }
0751 get_device(&lnk->smcibdev->ibdev->dev);
0752 atomic_inc(&lnk->smcibdev->lnk_cnt);
0753 refcount_set(&lnk->refcnt, 1);
0754 lnk->clearing = 0;
0755 lnk->path_mtu = lnk->smcibdev->pattr[lnk->ibport - 1].active_mtu;
0756 lnk->link_id = smcr_next_link_id(lgr);
0757 lnk->lgr = lgr;
0758 smc_lgr_hold(lgr);
0759 lnk->link_idx = link_idx;
0760 lnk->wr_rx_id_compl = 0;
0761 smc_ibdev_cnt_inc(lnk);
0762 smcr_copy_dev_info_to_link(lnk);
0763 atomic_set(&lnk->conn_cnt, 0);
0764 smc_llc_link_set_uid(lnk);
0765 INIT_WORK(&lnk->link_down_wrk, smc_link_down_work);
0766 if (!lnk->smcibdev->initialized) {
0767 rc = (int)smc_ib_setup_per_ibdev(lnk->smcibdev);
0768 if (rc)
0769 goto out;
0770 }
0771 get_random_bytes(rndvec, sizeof(rndvec));
0772 lnk->psn_initial = rndvec[0] + (rndvec[1] << 8) +
0773 (rndvec[2] << 16);
0774 rc = smc_ib_determine_gid(lnk->smcibdev, lnk->ibport,
0775 ini->vlan_id, lnk->gid, &lnk->sgid_index,
0776 lgr->smc_version == SMC_V2 ?
0777 &ini->smcrv2 : NULL);
0778 if (rc)
0779 goto out;
0780 rc = smc_llc_link_init(lnk);
0781 if (rc)
0782 goto out;
0783 rc = smc_wr_alloc_link_mem(lnk);
0784 if (rc)
0785 goto clear_llc_lnk;
0786 rc = smc_ib_create_protection_domain(lnk);
0787 if (rc)
0788 goto free_link_mem;
0789 rc = smc_ib_create_queue_pair(lnk);
0790 if (rc)
0791 goto dealloc_pd;
0792 rc = smc_wr_create_link(lnk);
0793 if (rc)
0794 goto destroy_qp;
0795 lnk->state = SMC_LNK_ACTIVATING;
0796 return 0;
0797
0798 destroy_qp:
0799 smc_ib_destroy_queue_pair(lnk);
0800 dealloc_pd:
0801 smc_ib_dealloc_protection_domain(lnk);
0802 free_link_mem:
0803 smc_wr_free_link_mem(lnk);
0804 clear_llc_lnk:
0805 smc_llc_link_clear(lnk, false);
0806 out:
0807 smc_ibdev_cnt_dec(lnk);
0808 put_device(&lnk->smcibdev->ibdev->dev);
0809 smcibdev = lnk->smcibdev;
0810 memset(lnk, 0, sizeof(struct smc_link));
0811 lnk->state = SMC_LNK_UNUSED;
0812 if (!atomic_dec_return(&smcibdev->lnk_cnt))
0813 wake_up(&smcibdev->lnks_deleted);
0814 smc_lgr_put(lgr);
0815 return rc;
0816 }
0817
0818
0819 static int smc_lgr_create(struct smc_sock *smc, struct smc_init_info *ini)
0820 {
0821 struct smc_link_group *lgr;
0822 struct list_head *lgr_list;
0823 struct smc_link *lnk;
0824 spinlock_t *lgr_lock;
0825 u8 link_idx;
0826 int rc = 0;
0827 int i;
0828
0829 if (ini->is_smcd && ini->vlan_id) {
0830 if (smc_ism_get_vlan(ini->ism_dev[ini->ism_selected],
0831 ini->vlan_id)) {
0832 rc = SMC_CLC_DECL_ISMVLANERR;
0833 goto out;
0834 }
0835 }
0836
0837 lgr = kzalloc(sizeof(*lgr), GFP_KERNEL);
0838 if (!lgr) {
0839 rc = SMC_CLC_DECL_MEM;
0840 goto ism_put_vlan;
0841 }
0842 lgr->tx_wq = alloc_workqueue("smc_tx_wq-%*phN", 0, 0,
0843 SMC_LGR_ID_SIZE, &lgr->id);
0844 if (!lgr->tx_wq) {
0845 rc = -ENOMEM;
0846 goto free_lgr;
0847 }
0848 lgr->is_smcd = ini->is_smcd;
0849 lgr->sync_err = 0;
0850 lgr->terminating = 0;
0851 lgr->freeing = 0;
0852 lgr->vlan_id = ini->vlan_id;
0853 refcount_set(&lgr->refcnt, 1);
0854 mutex_init(&lgr->sndbufs_lock);
0855 mutex_init(&lgr->rmbs_lock);
0856 rwlock_init(&lgr->conns_lock);
0857 for (i = 0; i < SMC_RMBE_SIZES; i++) {
0858 INIT_LIST_HEAD(&lgr->sndbufs[i]);
0859 INIT_LIST_HEAD(&lgr->rmbs[i]);
0860 }
0861 lgr->next_link_id = 0;
0862 smc_lgr_list.num += SMC_LGR_NUM_INCR;
0863 memcpy(&lgr->id, (u8 *)&smc_lgr_list.num, SMC_LGR_ID_SIZE);
0864 INIT_DELAYED_WORK(&lgr->free_work, smc_lgr_free_work);
0865 INIT_WORK(&lgr->terminate_work, smc_lgr_terminate_work);
0866 lgr->conns_all = RB_ROOT;
0867 if (ini->is_smcd) {
0868
0869 get_device(&ini->ism_dev[ini->ism_selected]->dev);
0870 lgr->peer_gid = ini->ism_peer_gid[ini->ism_selected];
0871 lgr->smcd = ini->ism_dev[ini->ism_selected];
0872 lgr_list = &ini->ism_dev[ini->ism_selected]->lgr_list;
0873 lgr_lock = &lgr->smcd->lgr_lock;
0874 lgr->smc_version = ini->smcd_version;
0875 lgr->peer_shutdown = 0;
0876 atomic_inc(&ini->ism_dev[ini->ism_selected]->lgr_cnt);
0877 } else {
0878
0879 struct smc_ib_device *ibdev;
0880 int ibport;
0881
0882 lgr->role = smc->listen_smc ? SMC_SERV : SMC_CLNT;
0883 lgr->smc_version = ini->smcr_version;
0884 memcpy(lgr->peer_systemid, ini->peer_systemid,
0885 SMC_SYSTEMID_LEN);
0886 if (lgr->smc_version == SMC_V2) {
0887 ibdev = ini->smcrv2.ib_dev_v2;
0888 ibport = ini->smcrv2.ib_port_v2;
0889 lgr->saddr = ini->smcrv2.saddr;
0890 lgr->uses_gateway = ini->smcrv2.uses_gateway;
0891 memcpy(lgr->nexthop_mac, ini->smcrv2.nexthop_mac,
0892 ETH_ALEN);
0893 } else {
0894 ibdev = ini->ib_dev;
0895 ibport = ini->ib_port;
0896 }
0897 memcpy(lgr->pnet_id, ibdev->pnetid[ibport - 1],
0898 SMC_MAX_PNETID_LEN);
0899 if (smc_wr_alloc_lgr_mem(lgr))
0900 goto free_wq;
0901 smc_llc_lgr_init(lgr, smc);
0902
0903 link_idx = SMC_SINGLE_LINK;
0904 lnk = &lgr->lnk[link_idx];
0905 rc = smcr_link_init(lgr, lnk, link_idx, ini);
0906 if (rc) {
0907 smc_wr_free_lgr_mem(lgr);
0908 goto free_wq;
0909 }
0910 lgr->net = smc_ib_net(lnk->smcibdev);
0911 lgr_list = &smc_lgr_list.list;
0912 lgr_lock = &smc_lgr_list.lock;
0913 lgr->buf_type = lgr->net->smc.sysctl_smcr_buf_type;
0914 atomic_inc(&lgr_cnt);
0915 }
0916 smc->conn.lgr = lgr;
0917 spin_lock_bh(lgr_lock);
0918 list_add_tail(&lgr->list, lgr_list);
0919 spin_unlock_bh(lgr_lock);
0920 return 0;
0921
0922 free_wq:
0923 destroy_workqueue(lgr->tx_wq);
0924 free_lgr:
0925 kfree(lgr);
0926 ism_put_vlan:
0927 if (ini->is_smcd && ini->vlan_id)
0928 smc_ism_put_vlan(ini->ism_dev[ini->ism_selected], ini->vlan_id);
0929 out:
0930 if (rc < 0) {
0931 if (rc == -ENOMEM)
0932 rc = SMC_CLC_DECL_MEM;
0933 else
0934 rc = SMC_CLC_DECL_INTERR;
0935 }
0936 return rc;
0937 }
0938
0939 static int smc_write_space(struct smc_connection *conn)
0940 {
0941 int buffer_len = conn->peer_rmbe_size;
0942 union smc_host_cursor prod;
0943 union smc_host_cursor cons;
0944 int space;
0945
0946 smc_curs_copy(&prod, &conn->local_tx_ctrl.prod, conn);
0947 smc_curs_copy(&cons, &conn->local_rx_ctrl.cons, conn);
0948
0949 space = buffer_len - smc_curs_diff(buffer_len, &cons, &prod);
0950 return space;
0951 }
0952
0953 static int smc_switch_cursor(struct smc_sock *smc, struct smc_cdc_tx_pend *pend,
0954 struct smc_wr_buf *wr_buf)
0955 {
0956 struct smc_connection *conn = &smc->conn;
0957 union smc_host_cursor cons, fin;
0958 int rc = 0;
0959 int diff;
0960
0961 smc_curs_copy(&conn->tx_curs_sent, &conn->tx_curs_fin, conn);
0962 smc_curs_copy(&fin, &conn->local_tx_ctrl_fin, conn);
0963
0964 smc_curs_copy(&conn->local_tx_ctrl.prod, &fin, conn);
0965 smc_curs_copy(&cons, &conn->local_rx_ctrl.cons, conn);
0966
0967 if (smc_curs_comp(conn->peer_rmbe_size, &cons, &fin) < 0) {
0968
0969
0970
0971 diff = smc_curs_diff(conn->peer_rmbe_size, &fin, &cons);
0972 smc_curs_add(conn->sndbuf_desc->len,
0973 &conn->tx_curs_sent, diff);
0974 smc_curs_add(conn->sndbuf_desc->len,
0975 &conn->tx_curs_fin, diff);
0976
0977 smp_mb__before_atomic();
0978 atomic_add(diff, &conn->sndbuf_space);
0979 smp_mb__after_atomic();
0980
0981 smc_curs_add(conn->peer_rmbe_size,
0982 &conn->local_tx_ctrl.prod, diff);
0983 smc_curs_add(conn->peer_rmbe_size,
0984 &conn->local_tx_ctrl_fin, diff);
0985 }
0986
0987 atomic_set(&smc->conn.peer_rmbe_space, smc_write_space(conn));
0988
0989 if (smc->sk.sk_state != SMC_INIT &&
0990 smc->sk.sk_state != SMC_CLOSED) {
0991 rc = smcr_cdc_msg_send_validation(conn, pend, wr_buf);
0992 if (!rc) {
0993 queue_delayed_work(conn->lgr->tx_wq, &conn->tx_work, 0);
0994 smc->sk.sk_data_ready(&smc->sk);
0995 }
0996 } else {
0997 smc_wr_tx_put_slot(conn->lnk,
0998 (struct smc_wr_tx_pend_priv *)pend);
0999 }
1000 return rc;
1001 }
1002
1003 void smc_switch_link_and_count(struct smc_connection *conn,
1004 struct smc_link *to_lnk)
1005 {
1006 atomic_dec(&conn->lnk->conn_cnt);
1007
1008 smcr_link_put(conn->lnk);
1009 conn->lnk = to_lnk;
1010 atomic_inc(&conn->lnk->conn_cnt);
1011
1012 smcr_link_hold(conn->lnk);
1013 }
1014
1015 struct smc_link *smc_switch_conns(struct smc_link_group *lgr,
1016 struct smc_link *from_lnk, bool is_dev_err)
1017 {
1018 struct smc_link *to_lnk = NULL;
1019 struct smc_cdc_tx_pend *pend;
1020 struct smc_connection *conn;
1021 struct smc_wr_buf *wr_buf;
1022 struct smc_sock *smc;
1023 struct rb_node *node;
1024 int i, rc = 0;
1025
1026
1027 smc_wr_wakeup_tx_wait(from_lnk);
1028
1029 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
1030 if (!smc_link_active(&lgr->lnk[i]) || i == from_lnk->link_idx)
1031 continue;
1032 if (is_dev_err && from_lnk->smcibdev == lgr->lnk[i].smcibdev &&
1033 from_lnk->ibport == lgr->lnk[i].ibport) {
1034 continue;
1035 }
1036 to_lnk = &lgr->lnk[i];
1037 break;
1038 }
1039 if (!to_lnk || !smc_wr_tx_link_hold(to_lnk)) {
1040 smc_lgr_terminate_sched(lgr);
1041 return NULL;
1042 }
1043 again:
1044 read_lock_bh(&lgr->conns_lock);
1045 for (node = rb_first(&lgr->conns_all); node; node = rb_next(node)) {
1046 conn = rb_entry(node, struct smc_connection, alert_node);
1047 if (conn->lnk != from_lnk)
1048 continue;
1049 smc = container_of(conn, struct smc_sock, conn);
1050
1051 if (smc->sk.sk_state == SMC_INIT)
1052 continue;
1053 if (smc->sk.sk_state == SMC_CLOSED ||
1054 smc->sk.sk_state == SMC_PEERCLOSEWAIT1 ||
1055 smc->sk.sk_state == SMC_PEERCLOSEWAIT2 ||
1056 smc->sk.sk_state == SMC_APPFINCLOSEWAIT ||
1057 smc->sk.sk_state == SMC_APPCLOSEWAIT1 ||
1058 smc->sk.sk_state == SMC_APPCLOSEWAIT2 ||
1059 smc->sk.sk_state == SMC_PEERFINCLOSEWAIT ||
1060 smc->sk.sk_state == SMC_PEERABORTWAIT ||
1061 smc->sk.sk_state == SMC_PROCESSABORT) {
1062 spin_lock_bh(&conn->send_lock);
1063 smc_switch_link_and_count(conn, to_lnk);
1064 spin_unlock_bh(&conn->send_lock);
1065 continue;
1066 }
1067 sock_hold(&smc->sk);
1068 read_unlock_bh(&lgr->conns_lock);
1069
1070 rc = smc_cdc_get_free_slot(conn, to_lnk, &wr_buf, NULL, &pend);
1071 if (rc)
1072 goto err_out;
1073
1074 spin_lock_bh(&conn->send_lock);
1075 smc_switch_link_and_count(conn, to_lnk);
1076 rc = smc_switch_cursor(smc, pend, wr_buf);
1077 spin_unlock_bh(&conn->send_lock);
1078 sock_put(&smc->sk);
1079 if (rc)
1080 goto err_out;
1081 goto again;
1082 }
1083 read_unlock_bh(&lgr->conns_lock);
1084 smc_wr_tx_link_put(to_lnk);
1085 return to_lnk;
1086
1087 err_out:
1088 smcr_link_down_cond_sched(to_lnk);
1089 smc_wr_tx_link_put(to_lnk);
1090 return NULL;
1091 }
1092
1093 static void smcr_buf_unuse(struct smc_buf_desc *buf_desc, bool is_rmb,
1094 struct smc_link_group *lgr)
1095 {
1096 struct mutex *lock;
1097 int rc;
1098
1099 if (is_rmb && buf_desc->is_conf_rkey && !list_empty(&lgr->list)) {
1100
1101 rc = smc_llc_flow_initiate(lgr, SMC_LLC_FLOW_RKEY);
1102 if (!rc) {
1103
1104 mutex_lock(&lgr->llc_conf_mutex);
1105 smc_llc_do_delete_rkey(lgr, buf_desc);
1106 buf_desc->is_conf_rkey = false;
1107 mutex_unlock(&lgr->llc_conf_mutex);
1108 smc_llc_flow_stop(lgr, &lgr->llc_flow_lcl);
1109 }
1110 }
1111
1112 if (buf_desc->is_reg_err) {
1113
1114 lock = is_rmb ? &lgr->rmbs_lock :
1115 &lgr->sndbufs_lock;
1116 mutex_lock(lock);
1117 list_del(&buf_desc->list);
1118 mutex_unlock(lock);
1119
1120 smc_buf_free(lgr, is_rmb, buf_desc);
1121 } else {
1122 buf_desc->used = 0;
1123 memset(buf_desc->cpu_addr, 0, buf_desc->len);
1124 }
1125 }
1126
1127 static void smc_buf_unuse(struct smc_connection *conn,
1128 struct smc_link_group *lgr)
1129 {
1130 if (conn->sndbuf_desc) {
1131 if (!lgr->is_smcd && conn->sndbuf_desc->is_vm) {
1132 smcr_buf_unuse(conn->sndbuf_desc, false, lgr);
1133 } else {
1134 conn->sndbuf_desc->used = 0;
1135 memset(conn->sndbuf_desc->cpu_addr, 0,
1136 conn->sndbuf_desc->len);
1137 }
1138 }
1139 if (conn->rmb_desc) {
1140 if (!lgr->is_smcd) {
1141 smcr_buf_unuse(conn->rmb_desc, true, lgr);
1142 } else {
1143 conn->rmb_desc->used = 0;
1144 memset(conn->rmb_desc->cpu_addr, 0,
1145 conn->rmb_desc->len +
1146 sizeof(struct smcd_cdc_msg));
1147 }
1148 }
1149 }
1150
1151
1152 void smc_conn_free(struct smc_connection *conn)
1153 {
1154 struct smc_link_group *lgr = conn->lgr;
1155
1156 if (!lgr || conn->freed)
1157
1158
1159
1160 return;
1161
1162 conn->freed = 1;
1163 if (!smc_conn_lgr_valid(conn))
1164
1165
1166
1167 goto lgr_put;
1168
1169 if (lgr->is_smcd) {
1170 if (!list_empty(&lgr->list))
1171 smc_ism_unset_conn(conn);
1172 tasklet_kill(&conn->rx_tsklet);
1173 } else {
1174 smc_cdc_wait_pend_tx_wr(conn);
1175 if (current_work() != &conn->abort_work)
1176 cancel_work_sync(&conn->abort_work);
1177 }
1178 if (!list_empty(&lgr->list)) {
1179 smc_buf_unuse(conn, lgr);
1180 smc_lgr_unregister_conn(conn);
1181 }
1182
1183 if (!lgr->conns_num)
1184 smc_lgr_schedule_free_work(lgr);
1185 lgr_put:
1186 if (!lgr->is_smcd)
1187 smcr_link_put(conn->lnk);
1188 smc_lgr_put(lgr);
1189 }
1190
1191
1192 static void smcr_buf_unmap_link(struct smc_buf_desc *buf_desc, bool is_rmb,
1193 struct smc_link *lnk)
1194 {
1195 if (is_rmb || buf_desc->is_vm)
1196 buf_desc->is_reg_mr[lnk->link_idx] = false;
1197 if (!buf_desc->is_map_ib[lnk->link_idx])
1198 return;
1199
1200 if ((is_rmb || buf_desc->is_vm) &&
1201 buf_desc->mr[lnk->link_idx]) {
1202 smc_ib_put_memory_region(buf_desc->mr[lnk->link_idx]);
1203 buf_desc->mr[lnk->link_idx] = NULL;
1204 }
1205 if (is_rmb)
1206 smc_ib_buf_unmap_sg(lnk, buf_desc, DMA_FROM_DEVICE);
1207 else
1208 smc_ib_buf_unmap_sg(lnk, buf_desc, DMA_TO_DEVICE);
1209
1210 sg_free_table(&buf_desc->sgt[lnk->link_idx]);
1211 buf_desc->is_map_ib[lnk->link_idx] = false;
1212 }
1213
1214
1215 static void smcr_buf_unmap_lgr(struct smc_link *lnk)
1216 {
1217 struct smc_link_group *lgr = lnk->lgr;
1218 struct smc_buf_desc *buf_desc, *bf;
1219 int i;
1220
1221 for (i = 0; i < SMC_RMBE_SIZES; i++) {
1222 mutex_lock(&lgr->rmbs_lock);
1223 list_for_each_entry_safe(buf_desc, bf, &lgr->rmbs[i], list)
1224 smcr_buf_unmap_link(buf_desc, true, lnk);
1225 mutex_unlock(&lgr->rmbs_lock);
1226 mutex_lock(&lgr->sndbufs_lock);
1227 list_for_each_entry_safe(buf_desc, bf, &lgr->sndbufs[i],
1228 list)
1229 smcr_buf_unmap_link(buf_desc, false, lnk);
1230 mutex_unlock(&lgr->sndbufs_lock);
1231 }
1232 }
1233
1234 static void smcr_rtoken_clear_link(struct smc_link *lnk)
1235 {
1236 struct smc_link_group *lgr = lnk->lgr;
1237 int i;
1238
1239 for (i = 0; i < SMC_RMBS_PER_LGR_MAX; i++) {
1240 lgr->rtokens[i][lnk->link_idx].rkey = 0;
1241 lgr->rtokens[i][lnk->link_idx].dma_addr = 0;
1242 }
1243 }
1244
1245 static void __smcr_link_clear(struct smc_link *lnk)
1246 {
1247 struct smc_link_group *lgr = lnk->lgr;
1248 struct smc_ib_device *smcibdev;
1249
1250 smc_wr_free_link_mem(lnk);
1251 smc_ibdev_cnt_dec(lnk);
1252 put_device(&lnk->smcibdev->ibdev->dev);
1253 smcibdev = lnk->smcibdev;
1254 memset(lnk, 0, sizeof(struct smc_link));
1255 lnk->state = SMC_LNK_UNUSED;
1256 if (!atomic_dec_return(&smcibdev->lnk_cnt))
1257 wake_up(&smcibdev->lnks_deleted);
1258 smc_lgr_put(lgr);
1259 }
1260
1261
1262 void smcr_link_clear(struct smc_link *lnk, bool log)
1263 {
1264 if (!lnk->lgr || lnk->clearing ||
1265 lnk->state == SMC_LNK_UNUSED)
1266 return;
1267 lnk->clearing = 1;
1268 lnk->peer_qpn = 0;
1269 smc_llc_link_clear(lnk, log);
1270 smcr_buf_unmap_lgr(lnk);
1271 smcr_rtoken_clear_link(lnk);
1272 smc_ib_modify_qp_error(lnk);
1273 smc_wr_free_link(lnk);
1274 smc_ib_destroy_queue_pair(lnk);
1275 smc_ib_dealloc_protection_domain(lnk);
1276 smcr_link_put(lnk);
1277 }
1278
1279 void smcr_link_hold(struct smc_link *lnk)
1280 {
1281 refcount_inc(&lnk->refcnt);
1282 }
1283
1284 void smcr_link_put(struct smc_link *lnk)
1285 {
1286 if (refcount_dec_and_test(&lnk->refcnt))
1287 __smcr_link_clear(lnk);
1288 }
1289
1290 static void smcr_buf_free(struct smc_link_group *lgr, bool is_rmb,
1291 struct smc_buf_desc *buf_desc)
1292 {
1293 int i;
1294
1295 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++)
1296 smcr_buf_unmap_link(buf_desc, is_rmb, &lgr->lnk[i]);
1297
1298 if (!buf_desc->is_vm && buf_desc->pages)
1299 __free_pages(buf_desc->pages, buf_desc->order);
1300 else if (buf_desc->is_vm && buf_desc->cpu_addr)
1301 vfree(buf_desc->cpu_addr);
1302 kfree(buf_desc);
1303 }
1304
1305 static void smcd_buf_free(struct smc_link_group *lgr, bool is_dmb,
1306 struct smc_buf_desc *buf_desc)
1307 {
1308 if (is_dmb) {
1309
1310 buf_desc->len += sizeof(struct smcd_cdc_msg);
1311 smc_ism_unregister_dmb(lgr->smcd, buf_desc);
1312 } else {
1313 kfree(buf_desc->cpu_addr);
1314 }
1315 kfree(buf_desc);
1316 }
1317
1318 static void smc_buf_free(struct smc_link_group *lgr, bool is_rmb,
1319 struct smc_buf_desc *buf_desc)
1320 {
1321 if (lgr->is_smcd)
1322 smcd_buf_free(lgr, is_rmb, buf_desc);
1323 else
1324 smcr_buf_free(lgr, is_rmb, buf_desc);
1325 }
1326
1327 static void __smc_lgr_free_bufs(struct smc_link_group *lgr, bool is_rmb)
1328 {
1329 struct smc_buf_desc *buf_desc, *bf_desc;
1330 struct list_head *buf_list;
1331 int i;
1332
1333 for (i = 0; i < SMC_RMBE_SIZES; i++) {
1334 if (is_rmb)
1335 buf_list = &lgr->rmbs[i];
1336 else
1337 buf_list = &lgr->sndbufs[i];
1338 list_for_each_entry_safe(buf_desc, bf_desc, buf_list,
1339 list) {
1340 list_del(&buf_desc->list);
1341 smc_buf_free(lgr, is_rmb, buf_desc);
1342 }
1343 }
1344 }
1345
1346 static void smc_lgr_free_bufs(struct smc_link_group *lgr)
1347 {
1348
1349 __smc_lgr_free_bufs(lgr, false);
1350
1351 __smc_lgr_free_bufs(lgr, true);
1352 }
1353
1354
1355 static void __smc_lgr_free(struct smc_link_group *lgr)
1356 {
1357 smc_lgr_free_bufs(lgr);
1358 if (lgr->is_smcd) {
1359 if (!atomic_dec_return(&lgr->smcd->lgr_cnt))
1360 wake_up(&lgr->smcd->lgrs_deleted);
1361 } else {
1362 smc_wr_free_lgr_mem(lgr);
1363 if (!atomic_dec_return(&lgr_cnt))
1364 wake_up(&lgrs_deleted);
1365 }
1366 kfree(lgr);
1367 }
1368
1369
1370 static void smc_lgr_free(struct smc_link_group *lgr)
1371 {
1372 int i;
1373
1374 if (!lgr->is_smcd) {
1375 mutex_lock(&lgr->llc_conf_mutex);
1376 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
1377 if (lgr->lnk[i].state != SMC_LNK_UNUSED)
1378 smcr_link_clear(&lgr->lnk[i], false);
1379 }
1380 mutex_unlock(&lgr->llc_conf_mutex);
1381 smc_llc_lgr_clear(lgr);
1382 }
1383
1384 destroy_workqueue(lgr->tx_wq);
1385 if (lgr->is_smcd) {
1386 smc_ism_put_vlan(lgr->smcd, lgr->vlan_id);
1387 put_device(&lgr->smcd->dev);
1388 }
1389 smc_lgr_put(lgr);
1390 }
1391
1392 void smc_lgr_hold(struct smc_link_group *lgr)
1393 {
1394 refcount_inc(&lgr->refcnt);
1395 }
1396
1397 void smc_lgr_put(struct smc_link_group *lgr)
1398 {
1399 if (refcount_dec_and_test(&lgr->refcnt))
1400 __smc_lgr_free(lgr);
1401 }
1402
1403 static void smc_sk_wake_ups(struct smc_sock *smc)
1404 {
1405 smc->sk.sk_write_space(&smc->sk);
1406 smc->sk.sk_data_ready(&smc->sk);
1407 smc->sk.sk_state_change(&smc->sk);
1408 }
1409
1410
1411 static void smc_conn_kill(struct smc_connection *conn, bool soft)
1412 {
1413 struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
1414
1415 if (conn->lgr->is_smcd && conn->lgr->peer_shutdown)
1416 conn->local_tx_ctrl.conn_state_flags.peer_conn_abort = 1;
1417 else
1418 smc_close_abort(conn);
1419 conn->killed = 1;
1420 smc->sk.sk_err = ECONNABORTED;
1421 smc_sk_wake_ups(smc);
1422 if (conn->lgr->is_smcd) {
1423 smc_ism_unset_conn(conn);
1424 if (soft)
1425 tasklet_kill(&conn->rx_tsklet);
1426 else
1427 tasklet_unlock_wait(&conn->rx_tsklet);
1428 } else {
1429 smc_cdc_wait_pend_tx_wr(conn);
1430 }
1431 smc_lgr_unregister_conn(conn);
1432 smc_close_active_abort(smc);
1433 }
1434
1435 static void smc_lgr_cleanup(struct smc_link_group *lgr)
1436 {
1437 if (lgr->is_smcd) {
1438 smc_ism_signal_shutdown(lgr);
1439 } else {
1440 u32 rsn = lgr->llc_termination_rsn;
1441
1442 if (!rsn)
1443 rsn = SMC_LLC_DEL_PROG_INIT_TERM;
1444 smc_llc_send_link_delete_all(lgr, false, rsn);
1445 smcr_lgr_link_deactivate_all(lgr);
1446 }
1447 }
1448
1449
1450
1451
1452
1453 static void __smc_lgr_terminate(struct smc_link_group *lgr, bool soft)
1454 {
1455 struct smc_connection *conn;
1456 struct smc_sock *smc;
1457 struct rb_node *node;
1458
1459 if (lgr->terminating)
1460 return;
1461
1462 cancel_delayed_work_sync(&lgr->free_work);
1463 lgr->terminating = 1;
1464
1465
1466 read_lock_bh(&lgr->conns_lock);
1467 node = rb_first(&lgr->conns_all);
1468 while (node) {
1469 read_unlock_bh(&lgr->conns_lock);
1470 conn = rb_entry(node, struct smc_connection, alert_node);
1471 smc = container_of(conn, struct smc_sock, conn);
1472 sock_hold(&smc->sk);
1473 lock_sock(&smc->sk);
1474 smc_conn_kill(conn, soft);
1475 release_sock(&smc->sk);
1476 sock_put(&smc->sk);
1477 read_lock_bh(&lgr->conns_lock);
1478 node = rb_first(&lgr->conns_all);
1479 }
1480 read_unlock_bh(&lgr->conns_lock);
1481 smc_lgr_cleanup(lgr);
1482 smc_lgr_free(lgr);
1483 }
1484
1485
1486 void smc_lgr_terminate_sched(struct smc_link_group *lgr)
1487 {
1488 spinlock_t *lgr_lock;
1489
1490 smc_lgr_list_head(lgr, &lgr_lock);
1491 spin_lock_bh(lgr_lock);
1492 if (list_empty(&lgr->list) || lgr->terminating || lgr->freeing) {
1493 spin_unlock_bh(lgr_lock);
1494 return;
1495 }
1496 list_del_init(&lgr->list);
1497 lgr->freeing = 1;
1498 spin_unlock_bh(lgr_lock);
1499 schedule_work(&lgr->terminate_work);
1500 }
1501
1502
1503 void smc_smcd_terminate(struct smcd_dev *dev, u64 peer_gid, unsigned short vlan)
1504 {
1505 struct smc_link_group *lgr, *l;
1506 LIST_HEAD(lgr_free_list);
1507
1508
1509 spin_lock_bh(&dev->lgr_lock);
1510 list_for_each_entry_safe(lgr, l, &dev->lgr_list, list) {
1511 if ((!peer_gid || lgr->peer_gid == peer_gid) &&
1512 (vlan == VLAN_VID_MASK || lgr->vlan_id == vlan)) {
1513 if (peer_gid)
1514 lgr->peer_shutdown = 1;
1515 list_move(&lgr->list, &lgr_free_list);
1516 lgr->freeing = 1;
1517 }
1518 }
1519 spin_unlock_bh(&dev->lgr_lock);
1520
1521
1522 list_for_each_entry_safe(lgr, l, &lgr_free_list, list) {
1523 list_del_init(&lgr->list);
1524 schedule_work(&lgr->terminate_work);
1525 }
1526 }
1527
1528
1529 void smc_smcd_terminate_all(struct smcd_dev *smcd)
1530 {
1531 struct smc_link_group *lgr, *lg;
1532 LIST_HEAD(lgr_free_list);
1533
1534 spin_lock_bh(&smcd->lgr_lock);
1535 list_splice_init(&smcd->lgr_list, &lgr_free_list);
1536 list_for_each_entry(lgr, &lgr_free_list, list)
1537 lgr->freeing = 1;
1538 spin_unlock_bh(&smcd->lgr_lock);
1539
1540 list_for_each_entry_safe(lgr, lg, &lgr_free_list, list) {
1541 list_del_init(&lgr->list);
1542 __smc_lgr_terminate(lgr, false);
1543 }
1544
1545 if (atomic_read(&smcd->lgr_cnt))
1546 wait_event(smcd->lgrs_deleted, !atomic_read(&smcd->lgr_cnt));
1547 }
1548
1549
1550
1551
1552
1553 void smc_smcr_terminate_all(struct smc_ib_device *smcibdev)
1554 {
1555 struct smc_link_group *lgr, *lg;
1556 LIST_HEAD(lgr_free_list);
1557 int i;
1558
1559 spin_lock_bh(&smc_lgr_list.lock);
1560 if (!smcibdev) {
1561 list_splice_init(&smc_lgr_list.list, &lgr_free_list);
1562 list_for_each_entry(lgr, &lgr_free_list, list)
1563 lgr->freeing = 1;
1564 } else {
1565 list_for_each_entry_safe(lgr, lg, &smc_lgr_list.list, list) {
1566 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
1567 if (lgr->lnk[i].smcibdev == smcibdev)
1568 smcr_link_down_cond_sched(&lgr->lnk[i]);
1569 }
1570 }
1571 }
1572 spin_unlock_bh(&smc_lgr_list.lock);
1573
1574 list_for_each_entry_safe(lgr, lg, &lgr_free_list, list) {
1575 list_del_init(&lgr->list);
1576 smc_llc_set_termination_rsn(lgr, SMC_LLC_DEL_OP_INIT_TERM);
1577 __smc_lgr_terminate(lgr, false);
1578 }
1579
1580 if (smcibdev) {
1581 if (atomic_read(&smcibdev->lnk_cnt))
1582 wait_event(smcibdev->lnks_deleted,
1583 !atomic_read(&smcibdev->lnk_cnt));
1584 } else {
1585 if (atomic_read(&lgr_cnt))
1586 wait_event(lgrs_deleted, !atomic_read(&lgr_cnt));
1587 }
1588 }
1589
1590
1591 void smcr_lgr_set_type(struct smc_link_group *lgr, enum smc_lgr_type new_type)
1592 {
1593 char *lgr_type = "";
1594 int i;
1595
1596 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++)
1597 if (smc_link_usable(&lgr->lnk[i]))
1598 lgr->lnk[i].link_is_asym = false;
1599 if (lgr->type == new_type)
1600 return;
1601 lgr->type = new_type;
1602
1603 switch (lgr->type) {
1604 case SMC_LGR_NONE:
1605 lgr_type = "NONE";
1606 break;
1607 case SMC_LGR_SINGLE:
1608 lgr_type = "SINGLE";
1609 break;
1610 case SMC_LGR_SYMMETRIC:
1611 lgr_type = "SYMMETRIC";
1612 break;
1613 case SMC_LGR_ASYMMETRIC_PEER:
1614 lgr_type = "ASYMMETRIC_PEER";
1615 break;
1616 case SMC_LGR_ASYMMETRIC_LOCAL:
1617 lgr_type = "ASYMMETRIC_LOCAL";
1618 break;
1619 }
1620 pr_warn_ratelimited("smc: SMC-R lg %*phN net %llu state changed: "
1621 "%s, pnetid %.16s\n", SMC_LGR_ID_SIZE, &lgr->id,
1622 lgr->net->net_cookie, lgr_type, lgr->pnet_id);
1623 }
1624
1625
1626 void smcr_lgr_set_type_asym(struct smc_link_group *lgr,
1627 enum smc_lgr_type new_type, int asym_lnk_idx)
1628 {
1629 smcr_lgr_set_type(lgr, new_type);
1630 lgr->lnk[asym_lnk_idx].link_is_asym = true;
1631 }
1632
1633
1634 static void smc_conn_abort_work(struct work_struct *work)
1635 {
1636 struct smc_connection *conn = container_of(work,
1637 struct smc_connection,
1638 abort_work);
1639 struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
1640
1641 lock_sock(&smc->sk);
1642 smc_conn_kill(conn, true);
1643 release_sock(&smc->sk);
1644 sock_put(&smc->sk);
1645 }
1646
1647 void smcr_port_add(struct smc_ib_device *smcibdev, u8 ibport)
1648 {
1649 struct smc_link_group *lgr, *n;
1650
1651 list_for_each_entry_safe(lgr, n, &smc_lgr_list.list, list) {
1652 struct smc_link *link;
1653
1654 if (strncmp(smcibdev->pnetid[ibport - 1], lgr->pnet_id,
1655 SMC_MAX_PNETID_LEN) ||
1656 lgr->type == SMC_LGR_SYMMETRIC ||
1657 lgr->type == SMC_LGR_ASYMMETRIC_PEER ||
1658 !rdma_dev_access_netns(smcibdev->ibdev, lgr->net))
1659 continue;
1660
1661
1662 link = smc_llc_usable_link(lgr);
1663 if (link)
1664 smc_llc_add_link_local(link);
1665 }
1666 }
1667
1668
1669
1670
1671 static void smcr_link_down(struct smc_link *lnk)
1672 {
1673 struct smc_link_group *lgr = lnk->lgr;
1674 struct smc_link *to_lnk;
1675 int del_link_id;
1676
1677 if (!lgr || lnk->state == SMC_LNK_UNUSED || list_empty(&lgr->list))
1678 return;
1679
1680 to_lnk = smc_switch_conns(lgr, lnk, true);
1681 if (!to_lnk) {
1682 smcr_link_clear(lnk, true);
1683 return;
1684 }
1685 smcr_lgr_set_type(lgr, SMC_LGR_SINGLE);
1686 del_link_id = lnk->link_id;
1687
1688 if (lgr->role == SMC_SERV) {
1689
1690 smc_llc_srv_delete_link_local(to_lnk, del_link_id);
1691 } else {
1692 if (lgr->llc_flow_lcl.type != SMC_LLC_FLOW_NONE) {
1693
1694 mutex_unlock(&lgr->llc_conf_mutex);
1695 wait_event_timeout(lgr->llc_flow_waiter,
1696 (list_empty(&lgr->list) ||
1697 lgr->llc_flow_lcl.type == SMC_LLC_FLOW_NONE),
1698 SMC_LLC_WAIT_TIME);
1699 mutex_lock(&lgr->llc_conf_mutex);
1700 }
1701 if (!list_empty(&lgr->list)) {
1702 smc_llc_send_delete_link(to_lnk, del_link_id,
1703 SMC_LLC_REQ, true,
1704 SMC_LLC_DEL_LOST_PATH);
1705 smcr_link_clear(lnk, true);
1706 }
1707 wake_up(&lgr->llc_flow_waiter);
1708 }
1709 }
1710
1711
1712 void smcr_link_down_cond(struct smc_link *lnk)
1713 {
1714 if (smc_link_downing(&lnk->state)) {
1715 trace_smcr_link_down(lnk, __builtin_return_address(0));
1716 smcr_link_down(lnk);
1717 }
1718 }
1719
1720
1721 void smcr_link_down_cond_sched(struct smc_link *lnk)
1722 {
1723 if (smc_link_downing(&lnk->state)) {
1724 trace_smcr_link_down(lnk, __builtin_return_address(0));
1725 schedule_work(&lnk->link_down_wrk);
1726 }
1727 }
1728
1729 void smcr_port_err(struct smc_ib_device *smcibdev, u8 ibport)
1730 {
1731 struct smc_link_group *lgr, *n;
1732 int i;
1733
1734 list_for_each_entry_safe(lgr, n, &smc_lgr_list.list, list) {
1735 if (strncmp(smcibdev->pnetid[ibport - 1], lgr->pnet_id,
1736 SMC_MAX_PNETID_LEN))
1737 continue;
1738 if (list_empty(&lgr->list))
1739 continue;
1740 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
1741 struct smc_link *lnk = &lgr->lnk[i];
1742
1743 if (smc_link_usable(lnk) &&
1744 lnk->smcibdev == smcibdev && lnk->ibport == ibport)
1745 smcr_link_down_cond_sched(lnk);
1746 }
1747 }
1748 }
1749
1750 static void smc_link_down_work(struct work_struct *work)
1751 {
1752 struct smc_link *link = container_of(work, struct smc_link,
1753 link_down_wrk);
1754 struct smc_link_group *lgr = link->lgr;
1755
1756 if (list_empty(&lgr->list))
1757 return;
1758 wake_up_all(&lgr->llc_msg_waiter);
1759 mutex_lock(&lgr->llc_conf_mutex);
1760 smcr_link_down(link);
1761 mutex_unlock(&lgr->llc_conf_mutex);
1762 }
1763
1764 static int smc_vlan_by_tcpsk_walk(struct net_device *lower_dev,
1765 struct netdev_nested_priv *priv)
1766 {
1767 unsigned short *vlan_id = (unsigned short *)priv->data;
1768
1769 if (is_vlan_dev(lower_dev)) {
1770 *vlan_id = vlan_dev_vlan_id(lower_dev);
1771 return 1;
1772 }
1773
1774 return 0;
1775 }
1776
1777
1778 int smc_vlan_by_tcpsk(struct socket *clcsock, struct smc_init_info *ini)
1779 {
1780 struct dst_entry *dst = sk_dst_get(clcsock->sk);
1781 struct netdev_nested_priv priv;
1782 struct net_device *ndev;
1783 int rc = 0;
1784
1785 ini->vlan_id = 0;
1786 if (!dst) {
1787 rc = -ENOTCONN;
1788 goto out;
1789 }
1790 if (!dst->dev) {
1791 rc = -ENODEV;
1792 goto out_rel;
1793 }
1794
1795 ndev = dst->dev;
1796 if (is_vlan_dev(ndev)) {
1797 ini->vlan_id = vlan_dev_vlan_id(ndev);
1798 goto out_rel;
1799 }
1800
1801 priv.data = (void *)&ini->vlan_id;
1802 rtnl_lock();
1803 netdev_walk_all_lower_dev(ndev, smc_vlan_by_tcpsk_walk, &priv);
1804 rtnl_unlock();
1805
1806 out_rel:
1807 dst_release(dst);
1808 out:
1809 return rc;
1810 }
1811
1812 static bool smcr_lgr_match(struct smc_link_group *lgr, u8 smcr_version,
1813 u8 peer_systemid[],
1814 u8 peer_gid[],
1815 u8 peer_mac_v1[],
1816 enum smc_lgr_role role, u32 clcqpn,
1817 struct net *net)
1818 {
1819 struct smc_link *lnk;
1820 int i;
1821
1822 if (memcmp(lgr->peer_systemid, peer_systemid, SMC_SYSTEMID_LEN) ||
1823 lgr->role != role)
1824 return false;
1825
1826 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
1827 lnk = &lgr->lnk[i];
1828
1829 if (!smc_link_active(lnk))
1830 continue;
1831
1832 if (!rdma_dev_access_netns(lnk->smcibdev->ibdev, net))
1833 return false;
1834 if ((lgr->role == SMC_SERV || lnk->peer_qpn == clcqpn) &&
1835 !memcmp(lnk->peer_gid, peer_gid, SMC_GID_SIZE) &&
1836 (smcr_version == SMC_V2 ||
1837 !memcmp(lnk->peer_mac, peer_mac_v1, ETH_ALEN)))
1838 return true;
1839 }
1840 return false;
1841 }
1842
1843 static bool smcd_lgr_match(struct smc_link_group *lgr,
1844 struct smcd_dev *smcismdev, u64 peer_gid)
1845 {
1846 return lgr->peer_gid == peer_gid && lgr->smcd == smcismdev;
1847 }
1848
1849
1850 int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini)
1851 {
1852 struct smc_connection *conn = &smc->conn;
1853 struct net *net = sock_net(&smc->sk);
1854 struct list_head *lgr_list;
1855 struct smc_link_group *lgr;
1856 enum smc_lgr_role role;
1857 spinlock_t *lgr_lock;
1858 int rc = 0;
1859
1860 lgr_list = ini->is_smcd ? &ini->ism_dev[ini->ism_selected]->lgr_list :
1861 &smc_lgr_list.list;
1862 lgr_lock = ini->is_smcd ? &ini->ism_dev[ini->ism_selected]->lgr_lock :
1863 &smc_lgr_list.lock;
1864 ini->first_contact_local = 1;
1865 role = smc->listen_smc ? SMC_SERV : SMC_CLNT;
1866 if (role == SMC_CLNT && ini->first_contact_peer)
1867
1868 goto create;
1869
1870
1871 spin_lock_bh(lgr_lock);
1872 list_for_each_entry(lgr, lgr_list, list) {
1873 write_lock_bh(&lgr->conns_lock);
1874 if ((ini->is_smcd ?
1875 smcd_lgr_match(lgr, ini->ism_dev[ini->ism_selected],
1876 ini->ism_peer_gid[ini->ism_selected]) :
1877 smcr_lgr_match(lgr, ini->smcr_version,
1878 ini->peer_systemid,
1879 ini->peer_gid, ini->peer_mac, role,
1880 ini->ib_clcqpn, net)) &&
1881 !lgr->sync_err &&
1882 (ini->smcd_version == SMC_V2 ||
1883 lgr->vlan_id == ini->vlan_id) &&
1884 (role == SMC_CLNT || ini->is_smcd ||
1885 (lgr->conns_num < SMC_RMBS_PER_LGR_MAX &&
1886 !bitmap_full(lgr->rtokens_used_mask, SMC_RMBS_PER_LGR_MAX)))) {
1887
1888 ini->first_contact_local = 0;
1889 conn->lgr = lgr;
1890 rc = smc_lgr_register_conn(conn, false);
1891 write_unlock_bh(&lgr->conns_lock);
1892 if (!rc && delayed_work_pending(&lgr->free_work))
1893 cancel_delayed_work(&lgr->free_work);
1894 break;
1895 }
1896 write_unlock_bh(&lgr->conns_lock);
1897 }
1898 spin_unlock_bh(lgr_lock);
1899 if (rc)
1900 return rc;
1901
1902 if (role == SMC_CLNT && !ini->first_contact_peer &&
1903 ini->first_contact_local) {
1904
1905
1906
1907
1908 return SMC_CLC_DECL_SYNCERR;
1909 }
1910
1911 create:
1912 if (ini->first_contact_local) {
1913 rc = smc_lgr_create(smc, ini);
1914 if (rc)
1915 goto out;
1916 lgr = conn->lgr;
1917 write_lock_bh(&lgr->conns_lock);
1918 rc = smc_lgr_register_conn(conn, true);
1919 write_unlock_bh(&lgr->conns_lock);
1920 if (rc) {
1921 smc_lgr_cleanup_early(lgr);
1922 goto out;
1923 }
1924 }
1925 smc_lgr_hold(conn->lgr);
1926 if (!conn->lgr->is_smcd)
1927 smcr_link_hold(conn->lnk);
1928 conn->freed = 0;
1929 conn->local_tx_ctrl.common.type = SMC_CDC_MSG_TYPE;
1930 conn->local_tx_ctrl.len = SMC_WR_TX_SIZE;
1931 conn->urg_state = SMC_URG_READ;
1932 init_waitqueue_head(&conn->cdc_pend_tx_wq);
1933 INIT_WORK(&smc->conn.abort_work, smc_conn_abort_work);
1934 if (ini->is_smcd) {
1935 conn->rx_off = sizeof(struct smcd_cdc_msg);
1936 smcd_cdc_rx_init(conn);
1937 } else {
1938 conn->rx_off = 0;
1939 }
1940 #ifndef KERNEL_HAS_ATOMIC64
1941 spin_lock_init(&conn->acurs_lock);
1942 #endif
1943
1944 out:
1945 return rc;
1946 }
1947
1948 #define SMCD_DMBE_SIZES 6
1949 #define SMCR_RMBE_SIZES 5
1950
1951
1952
1953
1954
1955
1956 static u8 smc_compress_bufsize(int size, bool is_smcd, bool is_rmb)
1957 {
1958 const unsigned int max_scat = SG_MAX_SINGLE_ALLOC * PAGE_SIZE;
1959 u8 compressed;
1960
1961 if (size <= SMC_BUF_MIN_SIZE)
1962 return 0;
1963
1964 size = (size - 1) >> 14;
1965 compressed = min_t(u8, ilog2(size) + 1,
1966 is_smcd ? SMCD_DMBE_SIZES : SMCR_RMBE_SIZES);
1967
1968 if (!is_smcd && is_rmb)
1969
1970 compressed = min_t(u8, compressed, ilog2(max_scat >> 14));
1971
1972 return compressed;
1973 }
1974
1975
1976 int smc_uncompress_bufsize(u8 compressed)
1977 {
1978 u32 size;
1979
1980 size = 0x00000001 << (((int)compressed) + 14);
1981 return (int)size;
1982 }
1983
1984
1985
1986
1987 static struct smc_buf_desc *smc_buf_get_slot(int compressed_bufsize,
1988 struct mutex *lock,
1989 struct list_head *buf_list)
1990 {
1991 struct smc_buf_desc *buf_slot;
1992
1993 mutex_lock(lock);
1994 list_for_each_entry(buf_slot, buf_list, list) {
1995 if (cmpxchg(&buf_slot->used, 0, 1) == 0) {
1996 mutex_unlock(lock);
1997 return buf_slot;
1998 }
1999 }
2000 mutex_unlock(lock);
2001 return NULL;
2002 }
2003
2004
2005
2006
2007
2008 static inline int smc_rmb_wnd_update_limit(int rmbe_size)
2009 {
2010 return max_t(int, rmbe_size / 10, SOCK_MIN_SNDBUF / 2);
2011 }
2012
2013
2014 static int smcr_buf_map_link(struct smc_buf_desc *buf_desc, bool is_rmb,
2015 struct smc_link *lnk)
2016 {
2017 int rc, i, nents, offset, buf_size, size, access_flags;
2018 struct scatterlist *sg;
2019 void *buf;
2020
2021 if (buf_desc->is_map_ib[lnk->link_idx])
2022 return 0;
2023
2024 if (buf_desc->is_vm) {
2025 buf = buf_desc->cpu_addr;
2026 buf_size = buf_desc->len;
2027 offset = offset_in_page(buf_desc->cpu_addr);
2028 nents = PAGE_ALIGN(buf_size + offset) / PAGE_SIZE;
2029 } else {
2030 nents = 1;
2031 }
2032
2033 rc = sg_alloc_table(&buf_desc->sgt[lnk->link_idx], nents, GFP_KERNEL);
2034 if (rc)
2035 return rc;
2036
2037 if (buf_desc->is_vm) {
2038
2039 for_each_sg(buf_desc->sgt[lnk->link_idx].sgl, sg, nents, i) {
2040 size = min_t(int, PAGE_SIZE - offset, buf_size);
2041 sg_set_page(sg, vmalloc_to_page(buf), size, offset);
2042 buf += size / sizeof(*buf);
2043 buf_size -= size;
2044 offset = 0;
2045 }
2046 } else {
2047
2048 sg_set_buf(buf_desc->sgt[lnk->link_idx].sgl,
2049 buf_desc->cpu_addr, buf_desc->len);
2050 }
2051
2052
2053 rc = smc_ib_buf_map_sg(lnk, buf_desc,
2054 is_rmb ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
2055
2056 if (rc != nents) {
2057 rc = -EAGAIN;
2058 goto free_table;
2059 }
2060
2061 buf_desc->is_dma_need_sync |=
2062 smc_ib_is_sg_need_sync(lnk, buf_desc) << lnk->link_idx;
2063
2064 if (is_rmb || buf_desc->is_vm) {
2065
2066 access_flags = is_rmb ?
2067 IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE :
2068 IB_ACCESS_LOCAL_WRITE;
2069
2070 rc = smc_ib_get_memory_region(lnk->roce_pd, access_flags,
2071 buf_desc, lnk->link_idx);
2072 if (rc)
2073 goto buf_unmap;
2074 smc_ib_sync_sg_for_device(lnk, buf_desc,
2075 is_rmb ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
2076 }
2077 buf_desc->is_map_ib[lnk->link_idx] = true;
2078 return 0;
2079
2080 buf_unmap:
2081 smc_ib_buf_unmap_sg(lnk, buf_desc,
2082 is_rmb ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
2083 free_table:
2084 sg_free_table(&buf_desc->sgt[lnk->link_idx]);
2085 return rc;
2086 }
2087
2088
2089
2090
2091 int smcr_link_reg_buf(struct smc_link *link, struct smc_buf_desc *buf_desc)
2092 {
2093 if (list_empty(&link->lgr->list))
2094 return -ENOLINK;
2095 if (!buf_desc->is_reg_mr[link->link_idx]) {
2096
2097 if (buf_desc->is_vm)
2098 buf_desc->mr[link->link_idx]->iova =
2099 (uintptr_t)buf_desc->cpu_addr;
2100 if (smc_wr_reg_send(link, buf_desc->mr[link->link_idx])) {
2101 buf_desc->is_reg_err = true;
2102 return -EFAULT;
2103 }
2104 buf_desc->is_reg_mr[link->link_idx] = true;
2105 }
2106 return 0;
2107 }
2108
2109 static int _smcr_buf_map_lgr(struct smc_link *lnk, struct mutex *lock,
2110 struct list_head *lst, bool is_rmb)
2111 {
2112 struct smc_buf_desc *buf_desc, *bf;
2113 int rc = 0;
2114
2115 mutex_lock(lock);
2116 list_for_each_entry_safe(buf_desc, bf, lst, list) {
2117 if (!buf_desc->used)
2118 continue;
2119 rc = smcr_buf_map_link(buf_desc, is_rmb, lnk);
2120 if (rc)
2121 goto out;
2122 }
2123 out:
2124 mutex_unlock(lock);
2125 return rc;
2126 }
2127
2128
2129 int smcr_buf_map_lgr(struct smc_link *lnk)
2130 {
2131 struct smc_link_group *lgr = lnk->lgr;
2132 int i, rc = 0;
2133
2134 for (i = 0; i < SMC_RMBE_SIZES; i++) {
2135 rc = _smcr_buf_map_lgr(lnk, &lgr->rmbs_lock,
2136 &lgr->rmbs[i], true);
2137 if (rc)
2138 return rc;
2139 rc = _smcr_buf_map_lgr(lnk, &lgr->sndbufs_lock,
2140 &lgr->sndbufs[i], false);
2141 if (rc)
2142 return rc;
2143 }
2144 return 0;
2145 }
2146
2147
2148
2149
2150 int smcr_buf_reg_lgr(struct smc_link *lnk)
2151 {
2152 struct smc_link_group *lgr = lnk->lgr;
2153 struct smc_buf_desc *buf_desc, *bf;
2154 int i, rc = 0;
2155
2156
2157 mutex_lock(&lgr->rmbs_lock);
2158 for (i = 0; i < SMC_RMBE_SIZES; i++) {
2159 list_for_each_entry_safe(buf_desc, bf, &lgr->rmbs[i], list) {
2160 if (!buf_desc->used)
2161 continue;
2162 rc = smcr_link_reg_buf(lnk, buf_desc);
2163 if (rc) {
2164 mutex_unlock(&lgr->rmbs_lock);
2165 return rc;
2166 }
2167 }
2168 }
2169 mutex_unlock(&lgr->rmbs_lock);
2170
2171 if (lgr->buf_type == SMCR_PHYS_CONT_BUFS)
2172 return rc;
2173
2174
2175 mutex_lock(&lgr->sndbufs_lock);
2176 for (i = 0; i < SMC_RMBE_SIZES; i++) {
2177 list_for_each_entry_safe(buf_desc, bf, &lgr->sndbufs[i], list) {
2178 if (!buf_desc->used || !buf_desc->is_vm)
2179 continue;
2180 rc = smcr_link_reg_buf(lnk, buf_desc);
2181 if (rc) {
2182 mutex_unlock(&lgr->sndbufs_lock);
2183 return rc;
2184 }
2185 }
2186 }
2187 mutex_unlock(&lgr->sndbufs_lock);
2188 return rc;
2189 }
2190
2191 static struct smc_buf_desc *smcr_new_buf_create(struct smc_link_group *lgr,
2192 bool is_rmb, int bufsize)
2193 {
2194 struct smc_buf_desc *buf_desc;
2195
2196
2197 buf_desc = kzalloc(sizeof(*buf_desc), GFP_KERNEL);
2198 if (!buf_desc)
2199 return ERR_PTR(-ENOMEM);
2200
2201 switch (lgr->buf_type) {
2202 case SMCR_PHYS_CONT_BUFS:
2203 case SMCR_MIXED_BUFS:
2204 buf_desc->order = get_order(bufsize);
2205 buf_desc->pages = alloc_pages(GFP_KERNEL | __GFP_NOWARN |
2206 __GFP_NOMEMALLOC | __GFP_COMP |
2207 __GFP_NORETRY | __GFP_ZERO,
2208 buf_desc->order);
2209 if (buf_desc->pages) {
2210 buf_desc->cpu_addr =
2211 (void *)page_address(buf_desc->pages);
2212 buf_desc->len = bufsize;
2213 buf_desc->is_vm = false;
2214 break;
2215 }
2216 if (lgr->buf_type == SMCR_PHYS_CONT_BUFS)
2217 goto out;
2218 fallthrough;
2219 case SMCR_VIRT_CONT_BUFS:
2220 buf_desc->order = get_order(bufsize);
2221 buf_desc->cpu_addr = vzalloc(PAGE_SIZE << buf_desc->order);
2222 if (!buf_desc->cpu_addr)
2223 goto out;
2224 buf_desc->pages = NULL;
2225 buf_desc->len = bufsize;
2226 buf_desc->is_vm = true;
2227 break;
2228 }
2229 return buf_desc;
2230
2231 out:
2232 kfree(buf_desc);
2233 return ERR_PTR(-EAGAIN);
2234 }
2235
2236
2237
2238
2239 static int smcr_buf_map_usable_links(struct smc_link_group *lgr,
2240 struct smc_buf_desc *buf_desc, bool is_rmb)
2241 {
2242 int i, rc = 0, cnt = 0;
2243
2244
2245 mutex_lock(&lgr->llc_conf_mutex);
2246 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
2247 struct smc_link *lnk = &lgr->lnk[i];
2248
2249 if (!smc_link_usable(lnk))
2250 continue;
2251 if (smcr_buf_map_link(buf_desc, is_rmb, lnk)) {
2252 rc = -ENOMEM;
2253 goto out;
2254 }
2255 cnt++;
2256 }
2257 out:
2258 mutex_unlock(&lgr->llc_conf_mutex);
2259 if (!rc && !cnt)
2260 rc = -EINVAL;
2261 return rc;
2262 }
2263
2264 static struct smc_buf_desc *smcd_new_buf_create(struct smc_link_group *lgr,
2265 bool is_dmb, int bufsize)
2266 {
2267 struct smc_buf_desc *buf_desc;
2268 int rc;
2269
2270
2271 buf_desc = kzalloc(sizeof(*buf_desc), GFP_KERNEL);
2272 if (!buf_desc)
2273 return ERR_PTR(-ENOMEM);
2274 if (is_dmb) {
2275 rc = smc_ism_register_dmb(lgr, bufsize, buf_desc);
2276 if (rc) {
2277 kfree(buf_desc);
2278 if (rc == -ENOMEM)
2279 return ERR_PTR(-EAGAIN);
2280 if (rc == -ENOSPC)
2281 return ERR_PTR(-ENOSPC);
2282 return ERR_PTR(-EIO);
2283 }
2284 buf_desc->pages = virt_to_page(buf_desc->cpu_addr);
2285
2286 buf_desc->len = bufsize - sizeof(struct smcd_cdc_msg);
2287 } else {
2288 buf_desc->cpu_addr = kzalloc(bufsize, GFP_KERNEL |
2289 __GFP_NOWARN | __GFP_NORETRY |
2290 __GFP_NOMEMALLOC);
2291 if (!buf_desc->cpu_addr) {
2292 kfree(buf_desc);
2293 return ERR_PTR(-EAGAIN);
2294 }
2295 buf_desc->len = bufsize;
2296 }
2297 return buf_desc;
2298 }
2299
2300 static int __smc_buf_create(struct smc_sock *smc, bool is_smcd, bool is_rmb)
2301 {
2302 struct smc_buf_desc *buf_desc = ERR_PTR(-ENOMEM);
2303 struct smc_connection *conn = &smc->conn;
2304 struct smc_link_group *lgr = conn->lgr;
2305 struct list_head *buf_list;
2306 int bufsize, bufsize_short;
2307 bool is_dgraded = false;
2308 struct mutex *lock;
2309 int sk_buf_size;
2310
2311 if (is_rmb)
2312
2313 sk_buf_size = smc->sk.sk_rcvbuf / 2;
2314 else
2315
2316 sk_buf_size = smc->sk.sk_sndbuf / 2;
2317
2318 for (bufsize_short = smc_compress_bufsize(sk_buf_size, is_smcd, is_rmb);
2319 bufsize_short >= 0; bufsize_short--) {
2320 if (is_rmb) {
2321 lock = &lgr->rmbs_lock;
2322 buf_list = &lgr->rmbs[bufsize_short];
2323 } else {
2324 lock = &lgr->sndbufs_lock;
2325 buf_list = &lgr->sndbufs[bufsize_short];
2326 }
2327 bufsize = smc_uncompress_bufsize(bufsize_short);
2328
2329
2330 buf_desc = smc_buf_get_slot(bufsize_short, lock, buf_list);
2331 if (buf_desc) {
2332 buf_desc->is_dma_need_sync = 0;
2333 SMC_STAT_RMB_SIZE(smc, is_smcd, is_rmb, bufsize);
2334 SMC_STAT_BUF_REUSE(smc, is_smcd, is_rmb);
2335 break;
2336 }
2337
2338 if (is_smcd)
2339 buf_desc = smcd_new_buf_create(lgr, is_rmb, bufsize);
2340 else
2341 buf_desc = smcr_new_buf_create(lgr, is_rmb, bufsize);
2342
2343 if (PTR_ERR(buf_desc) == -ENOMEM)
2344 break;
2345 if (IS_ERR(buf_desc)) {
2346 if (!is_dgraded) {
2347 is_dgraded = true;
2348 SMC_STAT_RMB_DOWNGRADED(smc, is_smcd, is_rmb);
2349 }
2350 continue;
2351 }
2352
2353 SMC_STAT_RMB_ALLOC(smc, is_smcd, is_rmb);
2354 SMC_STAT_RMB_SIZE(smc, is_smcd, is_rmb, bufsize);
2355 buf_desc->used = 1;
2356 mutex_lock(lock);
2357 list_add(&buf_desc->list, buf_list);
2358 mutex_unlock(lock);
2359 break;
2360 }
2361
2362 if (IS_ERR(buf_desc))
2363 return PTR_ERR(buf_desc);
2364
2365 if (!is_smcd) {
2366 if (smcr_buf_map_usable_links(lgr, buf_desc, is_rmb)) {
2367 smcr_buf_unuse(buf_desc, is_rmb, lgr);
2368 return -ENOMEM;
2369 }
2370 }
2371
2372 if (is_rmb) {
2373 conn->rmb_desc = buf_desc;
2374 conn->rmbe_size_short = bufsize_short;
2375 smc->sk.sk_rcvbuf = bufsize * 2;
2376 atomic_set(&conn->bytes_to_rcv, 0);
2377 conn->rmbe_update_limit =
2378 smc_rmb_wnd_update_limit(buf_desc->len);
2379 if (is_smcd)
2380 smc_ism_set_conn(conn);
2381 } else {
2382 conn->sndbuf_desc = buf_desc;
2383 smc->sk.sk_sndbuf = bufsize * 2;
2384 atomic_set(&conn->sndbuf_space, bufsize);
2385 }
2386 return 0;
2387 }
2388
2389 void smc_sndbuf_sync_sg_for_device(struct smc_connection *conn)
2390 {
2391 if (!conn->sndbuf_desc->is_dma_need_sync)
2392 return;
2393 if (!smc_conn_lgr_valid(conn) || conn->lgr->is_smcd ||
2394 !smc_link_active(conn->lnk))
2395 return;
2396 smc_ib_sync_sg_for_device(conn->lnk, conn->sndbuf_desc, DMA_TO_DEVICE);
2397 }
2398
2399 void smc_rmb_sync_sg_for_cpu(struct smc_connection *conn)
2400 {
2401 int i;
2402
2403 if (!conn->rmb_desc->is_dma_need_sync)
2404 return;
2405 if (!smc_conn_lgr_valid(conn) || conn->lgr->is_smcd)
2406 return;
2407 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
2408 if (!smc_link_active(&conn->lgr->lnk[i]))
2409 continue;
2410 smc_ib_sync_sg_for_cpu(&conn->lgr->lnk[i], conn->rmb_desc,
2411 DMA_FROM_DEVICE);
2412 }
2413 }
2414
2415
2416
2417
2418
2419
2420
2421 int smc_buf_create(struct smc_sock *smc, bool is_smcd)
2422 {
2423 int rc;
2424
2425
2426 rc = __smc_buf_create(smc, is_smcd, false);
2427 if (rc)
2428 return rc;
2429
2430 rc = __smc_buf_create(smc, is_smcd, true);
2431 if (rc) {
2432 mutex_lock(&smc->conn.lgr->sndbufs_lock);
2433 list_del(&smc->conn.sndbuf_desc->list);
2434 mutex_unlock(&smc->conn.lgr->sndbufs_lock);
2435 smc_buf_free(smc->conn.lgr, false, smc->conn.sndbuf_desc);
2436 smc->conn.sndbuf_desc = NULL;
2437 }
2438 return rc;
2439 }
2440
2441 static inline int smc_rmb_reserve_rtoken_idx(struct smc_link_group *lgr)
2442 {
2443 int i;
2444
2445 for_each_clear_bit(i, lgr->rtokens_used_mask, SMC_RMBS_PER_LGR_MAX) {
2446 if (!test_and_set_bit(i, lgr->rtokens_used_mask))
2447 return i;
2448 }
2449 return -ENOSPC;
2450 }
2451
2452 static int smc_rtoken_find_by_link(struct smc_link_group *lgr, int lnk_idx,
2453 u32 rkey)
2454 {
2455 int i;
2456
2457 for (i = 0; i < SMC_RMBS_PER_LGR_MAX; i++) {
2458 if (test_bit(i, lgr->rtokens_used_mask) &&
2459 lgr->rtokens[i][lnk_idx].rkey == rkey)
2460 return i;
2461 }
2462 return -ENOENT;
2463 }
2464
2465
2466 void smc_rtoken_set(struct smc_link_group *lgr, int link_idx, int link_idx_new,
2467 __be32 nw_rkey_known, __be64 nw_vaddr, __be32 nw_rkey)
2468 {
2469 int rtok_idx;
2470
2471 rtok_idx = smc_rtoken_find_by_link(lgr, link_idx, ntohl(nw_rkey_known));
2472 if (rtok_idx == -ENOENT)
2473 return;
2474 lgr->rtokens[rtok_idx][link_idx_new].rkey = ntohl(nw_rkey);
2475 lgr->rtokens[rtok_idx][link_idx_new].dma_addr = be64_to_cpu(nw_vaddr);
2476 }
2477
2478
2479 void smc_rtoken_set2(struct smc_link_group *lgr, int rtok_idx, int link_id,
2480 __be64 nw_vaddr, __be32 nw_rkey)
2481 {
2482 u64 dma_addr = be64_to_cpu(nw_vaddr);
2483 u32 rkey = ntohl(nw_rkey);
2484 bool found = false;
2485 int link_idx;
2486
2487 for (link_idx = 0; link_idx < SMC_LINKS_PER_LGR_MAX; link_idx++) {
2488 if (lgr->lnk[link_idx].link_id == link_id) {
2489 found = true;
2490 break;
2491 }
2492 }
2493 if (!found)
2494 return;
2495 lgr->rtokens[rtok_idx][link_idx].rkey = rkey;
2496 lgr->rtokens[rtok_idx][link_idx].dma_addr = dma_addr;
2497 }
2498
2499
2500 int smc_rtoken_add(struct smc_link *lnk, __be64 nw_vaddr, __be32 nw_rkey)
2501 {
2502 struct smc_link_group *lgr = smc_get_lgr(lnk);
2503 u64 dma_addr = be64_to_cpu(nw_vaddr);
2504 u32 rkey = ntohl(nw_rkey);
2505 int i;
2506
2507 for (i = 0; i < SMC_RMBS_PER_LGR_MAX; i++) {
2508 if (lgr->rtokens[i][lnk->link_idx].rkey == rkey &&
2509 lgr->rtokens[i][lnk->link_idx].dma_addr == dma_addr &&
2510 test_bit(i, lgr->rtokens_used_mask)) {
2511
2512 return i;
2513 }
2514 }
2515 i = smc_rmb_reserve_rtoken_idx(lgr);
2516 if (i < 0)
2517 return i;
2518 lgr->rtokens[i][lnk->link_idx].rkey = rkey;
2519 lgr->rtokens[i][lnk->link_idx].dma_addr = dma_addr;
2520 return i;
2521 }
2522
2523
2524 int smc_rtoken_delete(struct smc_link *lnk, __be32 nw_rkey)
2525 {
2526 struct smc_link_group *lgr = smc_get_lgr(lnk);
2527 u32 rkey = ntohl(nw_rkey);
2528 int i, j;
2529
2530 for (i = 0; i < SMC_RMBS_PER_LGR_MAX; i++) {
2531 if (lgr->rtokens[i][lnk->link_idx].rkey == rkey &&
2532 test_bit(i, lgr->rtokens_used_mask)) {
2533 for (j = 0; j < SMC_LINKS_PER_LGR_MAX; j++) {
2534 lgr->rtokens[i][j].rkey = 0;
2535 lgr->rtokens[i][j].dma_addr = 0;
2536 }
2537 clear_bit(i, lgr->rtokens_used_mask);
2538 return 0;
2539 }
2540 }
2541 return -ENOENT;
2542 }
2543
2544
2545 int smc_rmb_rtoken_handling(struct smc_connection *conn,
2546 struct smc_link *lnk,
2547 struct smc_clc_msg_accept_confirm *clc)
2548 {
2549 conn->rtoken_idx = smc_rtoken_add(lnk, clc->r0.rmb_dma_addr,
2550 clc->r0.rmb_rkey);
2551 if (conn->rtoken_idx < 0)
2552 return conn->rtoken_idx;
2553 return 0;
2554 }
2555
2556 static void smc_core_going_away(void)
2557 {
2558 struct smc_ib_device *smcibdev;
2559 struct smcd_dev *smcd;
2560
2561 mutex_lock(&smc_ib_devices.mutex);
2562 list_for_each_entry(smcibdev, &smc_ib_devices.list, list) {
2563 int i;
2564
2565 for (i = 0; i < SMC_MAX_PORTS; i++)
2566 set_bit(i, smcibdev->ports_going_away);
2567 }
2568 mutex_unlock(&smc_ib_devices.mutex);
2569
2570 mutex_lock(&smcd_dev_list.mutex);
2571 list_for_each_entry(smcd, &smcd_dev_list.list, list) {
2572 smcd->going_away = 1;
2573 }
2574 mutex_unlock(&smcd_dev_list.mutex);
2575 }
2576
2577
2578 static void smc_lgrs_shutdown(void)
2579 {
2580 struct smcd_dev *smcd;
2581
2582 smc_core_going_away();
2583
2584 smc_smcr_terminate_all(NULL);
2585
2586 mutex_lock(&smcd_dev_list.mutex);
2587 list_for_each_entry(smcd, &smcd_dev_list.list, list)
2588 smc_smcd_terminate_all(smcd);
2589 mutex_unlock(&smcd_dev_list.mutex);
2590 }
2591
2592 static int smc_core_reboot_event(struct notifier_block *this,
2593 unsigned long event, void *ptr)
2594 {
2595 smc_lgrs_shutdown();
2596 smc_ib_unregister_client();
2597 return 0;
2598 }
2599
2600 static struct notifier_block smc_reboot_notifier = {
2601 .notifier_call = smc_core_reboot_event,
2602 };
2603
2604 int __init smc_core_init(void)
2605 {
2606 return register_reboot_notifier(&smc_reboot_notifier);
2607 }
2608
2609
2610 void smc_core_exit(void)
2611 {
2612 unregister_reboot_notifier(&smc_reboot_notifier);
2613 smc_lgrs_shutdown();
2614 }