• Home
  • Raw
  • Download

Lines Matching refs:lgr

189 static void smc_llc_flow_parallel(struct smc_link_group *lgr, u8 flow_type,  in smc_llc_flow_parallel()  argument
195 flow_type != msg_type && !lgr->delayed_event) { in smc_llc_flow_parallel()
196 lgr->delayed_event = qentry; in smc_llc_flow_parallel()
203 SMC_LGR_ID_SIZE, &lgr->id, in smc_llc_flow_parallel()
205 flow_type, lgr->role); in smc_llc_flow_parallel()
213 struct smc_link_group *lgr = qentry->link->lgr; in smc_llc_flow_start() local
215 spin_lock_bh(&lgr->llc_flow_lock); in smc_llc_flow_start()
218 smc_llc_flow_parallel(lgr, flow->type, qentry); in smc_llc_flow_start()
219 spin_unlock_bh(&lgr->llc_flow_lock); in smc_llc_flow_start()
237 spin_unlock_bh(&lgr->llc_flow_lock); in smc_llc_flow_start()
242 int smc_llc_flow_initiate(struct smc_link_group *lgr, in smc_llc_flow_initiate() argument
254 if (list_empty(&lgr->list)) in smc_llc_flow_initiate()
256 spin_lock_bh(&lgr->llc_flow_lock); in smc_llc_flow_initiate()
257 if (lgr->llc_flow_lcl.type == SMC_LLC_FLOW_NONE && in smc_llc_flow_initiate()
258 (lgr->llc_flow_rmt.type == SMC_LLC_FLOW_NONE || in smc_llc_flow_initiate()
259 lgr->llc_flow_rmt.type == allowed_remote)) { in smc_llc_flow_initiate()
260 lgr->llc_flow_lcl.type = type; in smc_llc_flow_initiate()
261 spin_unlock_bh(&lgr->llc_flow_lock); in smc_llc_flow_initiate()
264 spin_unlock_bh(&lgr->llc_flow_lock); in smc_llc_flow_initiate()
265 rc = wait_event_timeout(lgr->llc_flow_waiter, (list_empty(&lgr->list) || in smc_llc_flow_initiate()
266 (lgr->llc_flow_lcl.type == SMC_LLC_FLOW_NONE && in smc_llc_flow_initiate()
267 (lgr->llc_flow_rmt.type == SMC_LLC_FLOW_NONE || in smc_llc_flow_initiate()
268 lgr->llc_flow_rmt.type == allowed_remote))), in smc_llc_flow_initiate()
276 void smc_llc_flow_stop(struct smc_link_group *lgr, struct smc_llc_flow *flow) in smc_llc_flow_stop() argument
278 spin_lock_bh(&lgr->llc_flow_lock); in smc_llc_flow_stop()
281 spin_unlock_bh(&lgr->llc_flow_lock); in smc_llc_flow_stop()
282 if (!list_empty(&lgr->list) && lgr->delayed_event && in smc_llc_flow_stop()
283 flow == &lgr->llc_flow_lcl) in smc_llc_flow_stop()
284 schedule_work(&lgr->llc_event_work); in smc_llc_flow_stop()
286 wake_up(&lgr->llc_flow_waiter); in smc_llc_flow_stop()
292 struct smc_llc_qentry *smc_llc_wait(struct smc_link_group *lgr, in smc_llc_wait() argument
296 struct smc_llc_flow *flow = &lgr->llc_flow_lcl; in smc_llc_wait()
299 wait_event_timeout(lgr->llc_msg_waiter, in smc_llc_wait()
302 list_empty(&lgr->list)), in smc_llc_wait()
305 (lnk && !smc_link_usable(lnk)) || list_empty(&lgr->list)) { in smc_llc_wait()
314 smc_llc_flow_start(&lgr->llc_flow_lcl, in smc_llc_wait()
320 SMC_LGR_ID_SIZE, &lgr->id, rcv_msg, exp_msg, in smc_llc_wait()
321 flow->type, lgr->role, in smc_llc_wait()
434 link = &send_link->lgr->lnk[i]; in smc_llc_send_confirm_rkey()
630 static int smc_llc_alloc_alt_link(struct smc_link_group *lgr, in smc_llc_alloc_alt_link() argument
635 if (lgr->type == SMC_LGR_SYMMETRIC || in smc_llc_alloc_alt_link()
636 (lgr->type != SMC_LGR_SINGLE && in smc_llc_alloc_alt_link()
644 if (lgr->lnk[i].state == SMC_LNK_UNUSED) in smc_llc_alloc_alt_link()
648 if (lgr->lnk[i].state == SMC_LNK_UNUSED) in smc_llc_alloc_alt_link()
655 static struct smc_buf_desc *_smc_llc_get_next_rmb(struct smc_link_group *lgr, in _smc_llc_get_next_rmb() argument
661 buf_pos = list_first_entry_or_null(&lgr->rmbs[*buf_lst], in _smc_llc_get_next_rmb()
671 static struct smc_buf_desc *smc_llc_get_next_rmb(struct smc_link_group *lgr, in smc_llc_get_next_rmb() argument
677 if (!buf_pos || list_is_last(&buf_pos->list, &lgr->rmbs[*buf_lst])) { in smc_llc_get_next_rmb()
679 return _smc_llc_get_next_rmb(lgr, buf_lst); in smc_llc_get_next_rmb()
685 static struct smc_buf_desc *smc_llc_get_first_rmb(struct smc_link_group *lgr, in smc_llc_get_first_rmb() argument
689 return smc_llc_get_next_rmb(lgr, buf_lst, NULL); in smc_llc_get_first_rmb()
698 struct smc_link_group *lgr = link->lgr; in smc_llc_add_link_cont() local
733 *buf_pos = smc_llc_get_next_rmb(lgr, buf_lst, *buf_pos); in smc_llc_add_link_cont()
735 *buf_pos = smc_llc_get_next_rmb(lgr, buf_lst, *buf_pos); in smc_llc_add_link_cont()
739 if (lgr->role == SMC_CLNT) in smc_llc_add_link_cont()
751 struct smc_link_group *lgr = link->lgr; in smc_llc_cli_rkey_exchange() local
759 mutex_lock(&lgr->rmbs_lock); in smc_llc_cli_rkey_exchange()
760 num_rkeys_send = lgr->conns_num; in smc_llc_cli_rkey_exchange()
761 buf_pos = smc_llc_get_first_rmb(lgr, &buf_lst); in smc_llc_cli_rkey_exchange()
763 qentry = smc_llc_wait(lgr, NULL, SMC_LLC_WAIT_TIME, in smc_llc_cli_rkey_exchange()
773 smc_rtoken_set(lgr, link->link_idx, link_new->link_idx, in smc_llc_cli_rkey_exchange()
779 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_cli_rkey_exchange()
786 mutex_unlock(&lgr->rmbs_lock); in smc_llc_cli_rkey_exchange()
804 struct smc_link_group *lgr = link->lgr; in smc_llc_cli_conf_link() local
809 qentry = smc_llc_wait(lgr, NULL, SMC_LLC_WAIT_FIRST_TIME, 0); in smc_llc_cli_conf_link()
820 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_cli_conf_link()
824 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_cli_conf_link()
851 smcr_lgr_set_type_asym(lgr, lgr_new_t, link_new->link_idx); in smc_llc_cli_conf_link()
853 smcr_lgr_set_type(lgr, lgr_new_t); in smc_llc_cli_conf_link()
872 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_cli_add_link() local
880 ini.vlan_id = lgr->vlan_id; in smc_llc_cli_add_link()
881 smc_pnet_find_alt_roce(lgr, &ini, link->smcibdev); in smc_llc_cli_add_link()
893 lnk_idx = smc_llc_alloc_alt_link(lgr, lgr_new_t); in smc_llc_cli_add_link()
896 lnk_new = &lgr->lnk[lnk_idx]; in smc_llc_cli_add_link()
897 rc = smcr_link_init(lgr, lnk_new, lnk_idx, &ini); in smc_llc_cli_add_link()
939 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_cli_add_link_invite() local
942 if (lgr->type == SMC_LGR_SYMMETRIC || in smc_llc_cli_add_link_invite()
943 lgr->type == SMC_LGR_ASYMMETRIC_PEER) in smc_llc_cli_add_link_invite()
946 ini.vlan_id = lgr->vlan_id; in smc_llc_cli_add_link_invite()
947 smc_pnet_find_alt_roce(lgr, &ini, link->smcibdev); in smc_llc_cli_add_link_invite()
975 static void smc_llc_process_cli_add_link(struct smc_link_group *lgr) in smc_llc_process_cli_add_link() argument
979 qentry = smc_llc_flow_qentry_clr(&lgr->llc_flow_lcl); in smc_llc_process_cli_add_link()
981 mutex_lock(&lgr->llc_conf_mutex); in smc_llc_process_cli_add_link()
986 mutex_unlock(&lgr->llc_conf_mutex); in smc_llc_process_cli_add_link()
989 static int smc_llc_active_link_count(struct smc_link_group *lgr) in smc_llc_active_link_count() argument
994 if (!smc_link_active(&lgr->lnk[i])) in smc_llc_active_link_count()
1002 static struct smc_link *smc_llc_find_asym_link(struct smc_link_group *lgr) in smc_llc_find_asym_link() argument
1012 if (!smc_link_usable(&lgr->lnk[i]) || in smc_llc_find_asym_link()
1013 !smc_link_usable(&lgr->lnk[j])) in smc_llc_find_asym_link()
1015 if (!memcmp(lgr->lnk[i].gid, lgr->lnk[j].gid, in smc_llc_find_asym_link()
1027 if (!smc_link_usable(&lgr->lnk[k])) in smc_llc_find_asym_link()
1030 !memcmp(lgr->lnk[i].peer_gid, lgr->lnk[k].peer_gid, in smc_llc_find_asym_link()
1036 !memcmp(lgr->lnk[j].peer_gid, lgr->lnk[k].peer_gid, in smc_llc_find_asym_link()
1043 return (asym_idx < 0) ? NULL : &lgr->lnk[asym_idx]; in smc_llc_find_asym_link()
1046 static void smc_llc_delete_asym_link(struct smc_link_group *lgr) in smc_llc_delete_asym_link() argument
1052 lnk_asym = smc_llc_find_asym_link(lgr); in smc_llc_delete_asym_link()
1057 lnk_new = smc_switch_conns(lgr, lnk_asym, false); in smc_llc_delete_asym_link()
1062 lgr->llc_flow_lcl.type = SMC_LLC_FLOW_DEL_LINK; in smc_llc_delete_asym_link()
1069 qentry = smc_llc_wait(lgr, lnk_new, SMC_LLC_WAIT_TIME, in smc_llc_delete_asym_link()
1075 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_delete_asym_link()
1084 struct smc_link_group *lgr = link->lgr; in smc_llc_srv_rkey_exchange() local
1092 mutex_lock(&lgr->rmbs_lock); in smc_llc_srv_rkey_exchange()
1093 num_rkeys_send = lgr->conns_num; in smc_llc_srv_rkey_exchange()
1094 buf_pos = smc_llc_get_first_rmb(lgr, &buf_lst); in smc_llc_srv_rkey_exchange()
1098 qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_TIME, in smc_llc_srv_rkey_exchange()
1108 smc_rtoken_set(lgr, link->link_idx, link_new->link_idx, in smc_llc_srv_rkey_exchange()
1114 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_srv_rkey_exchange()
1117 mutex_unlock(&lgr->rmbs_lock); in smc_llc_srv_rkey_exchange()
1125 struct smc_link_group *lgr = link->lgr; in smc_llc_srv_conf_link() local
1134 qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_FIRST_TIME, 0); in smc_llc_srv_conf_link()
1141 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_srv_conf_link()
1148 smcr_lgr_set_type_asym(lgr, lgr_new_t, link_new->link_idx); in smc_llc_srv_conf_link()
1150 smcr_lgr_set_type(lgr, lgr_new_t); in smc_llc_srv_conf_link()
1151 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_srv_conf_link()
1158 struct smc_link_group *lgr = link->lgr; in smc_llc_srv_add_link() local
1166 ini.vlan_id = lgr->vlan_id; in smc_llc_srv_add_link()
1167 smc_pnet_find_alt_roce(lgr, &ini, link->smcibdev); in smc_llc_srv_add_link()
1173 lnk_idx = smc_llc_alloc_alt_link(lgr, lgr_new_t); in smc_llc_srv_add_link()
1177 rc = smcr_link_init(lgr, &lgr->lnk[lnk_idx], lnk_idx, &ini); in smc_llc_srv_add_link()
1180 link_new = &lgr->lnk[lnk_idx]; in smc_llc_srv_add_link()
1187 qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_TIME, SMC_LLC_ADD_LINK); in smc_llc_srv_add_link()
1194 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_srv_add_link()
1198 if (lgr->type == SMC_LGR_SINGLE && in smc_llc_srv_add_link()
1204 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_srv_add_link()
1228 static void smc_llc_process_srv_add_link(struct smc_link_group *lgr) in smc_llc_process_srv_add_link() argument
1230 struct smc_link *link = lgr->llc_flow_lcl.qentry->link; in smc_llc_process_srv_add_link()
1233 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_process_srv_add_link()
1235 mutex_lock(&lgr->llc_conf_mutex); in smc_llc_process_srv_add_link()
1237 if (!rc && lgr->type == SMC_LGR_SYMMETRIC) { in smc_llc_process_srv_add_link()
1239 smc_llc_delete_asym_link(lgr); in smc_llc_process_srv_add_link()
1241 mutex_unlock(&lgr->llc_conf_mutex); in smc_llc_process_srv_add_link()
1258 struct smc_link_group *lgr = container_of(work, struct smc_link_group, in smc_llc_add_link_work() local
1261 if (list_empty(&lgr->list)) { in smc_llc_add_link_work()
1263 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_add_link_work()
1267 if (lgr->role == SMC_CLNT) in smc_llc_add_link_work()
1268 smc_llc_process_cli_add_link(lgr); in smc_llc_add_link_work()
1270 smc_llc_process_srv_add_link(lgr); in smc_llc_add_link_work()
1272 smc_llc_flow_stop(lgr, &lgr->llc_flow_lcl); in smc_llc_add_link_work()
1290 static void smc_llc_process_cli_delete_link(struct smc_link_group *lgr) in smc_llc_process_cli_delete_link() argument
1298 qentry = smc_llc_flow_qentry_clr(&lgr->llc_flow_lcl); in smc_llc_process_cli_delete_link()
1303 smc_lgr_terminate_sched(lgr); in smc_llc_process_cli_delete_link()
1306 mutex_lock(&lgr->llc_conf_mutex); in smc_llc_process_cli_delete_link()
1309 if (lgr->lnk[lnk_idx].link_id != del_llc->link_num) in smc_llc_process_cli_delete_link()
1311 lnk_del = &lgr->lnk[lnk_idx]; in smc_llc_process_cli_delete_link()
1321 lnk_asym = smc_llc_find_asym_link(lgr); in smc_llc_process_cli_delete_link()
1327 smc_switch_conns(lgr, lnk_del, false); in smc_llc_process_cli_delete_link()
1330 active_links = smc_llc_active_link_count(lgr); in smc_llc_process_cli_delete_link()
1334 smcr_lgr_set_type(lgr, SMC_LGR_SINGLE); in smc_llc_process_cli_delete_link()
1336 smcr_lgr_set_type(lgr, SMC_LGR_NONE); in smc_llc_process_cli_delete_link()
1337 smc_lgr_terminate_sched(lgr); in smc_llc_process_cli_delete_link()
1340 mutex_unlock(&lgr->llc_conf_mutex); in smc_llc_process_cli_delete_link()
1348 void smc_llc_send_link_delete_all(struct smc_link_group *lgr, bool ord, u32 rsn) in smc_llc_send_link_delete_all() argument
1361 if (!smc_link_sendable(&lgr->lnk[i])) in smc_llc_send_link_delete_all()
1363 if (!smc_llc_send_message_wait(&lgr->lnk[i], &delllc)) in smc_llc_send_link_delete_all()
1368 static void smc_llc_process_srv_delete_link(struct smc_link_group *lgr) in smc_llc_process_srv_delete_link() argument
1376 mutex_lock(&lgr->llc_conf_mutex); in smc_llc_process_srv_delete_link()
1377 qentry = smc_llc_flow_qentry_clr(&lgr->llc_flow_lcl); in smc_llc_process_srv_delete_link()
1383 smc_llc_send_link_delete_all(lgr, true, ntohl( in smc_llc_process_srv_delete_link()
1385 smc_lgr_terminate_sched(lgr); in smc_llc_process_srv_delete_link()
1391 if (lgr->lnk[i].link_id == del_llc->link_num) { in smc_llc_process_srv_delete_link()
1392 lnk_del = &lgr->lnk[i]; in smc_llc_process_srv_delete_link()
1400 if (smc_switch_conns(lgr, lnk_del, false)) in smc_llc_process_srv_delete_link()
1403 if (!list_empty(&lgr->list)) { in smc_llc_process_srv_delete_link()
1411 qentry2 = smc_llc_wait(lgr, lnk, SMC_LLC_WAIT_TIME, in smc_llc_process_srv_delete_link()
1414 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_process_srv_delete_link()
1419 active_links = smc_llc_active_link_count(lgr); in smc_llc_process_srv_delete_link()
1421 smcr_lgr_set_type(lgr, SMC_LGR_SINGLE); in smc_llc_process_srv_delete_link()
1423 smcr_lgr_set_type(lgr, SMC_LGR_NONE); in smc_llc_process_srv_delete_link()
1424 smc_lgr_terminate_sched(lgr); in smc_llc_process_srv_delete_link()
1427 if (lgr->type == SMC_LGR_SINGLE && !list_empty(&lgr->list)) { in smc_llc_process_srv_delete_link()
1432 mutex_unlock(&lgr->llc_conf_mutex); in smc_llc_process_srv_delete_link()
1438 struct smc_link_group *lgr = container_of(work, struct smc_link_group, in smc_llc_delete_link_work() local
1441 if (list_empty(&lgr->list)) { in smc_llc_delete_link_work()
1443 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_delete_link_work()
1447 if (lgr->role == SMC_CLNT) in smc_llc_delete_link_work()
1448 smc_llc_process_cli_delete_link(lgr); in smc_llc_delete_link_work()
1450 smc_llc_process_srv_delete_link(lgr); in smc_llc_delete_link_work()
1452 smc_llc_flow_stop(lgr, &lgr->llc_flow_lcl); in smc_llc_delete_link_work()
1456 static void smc_llc_rmt_conf_rkey(struct smc_link_group *lgr) in smc_llc_rmt_conf_rkey() argument
1465 qentry = lgr->llc_flow_rmt.qentry; in smc_llc_rmt_conf_rkey()
1478 smc_rtoken_set2(lgr, rk_idx, llc->rtoken[i].link_id, in smc_llc_rmt_conf_rkey()
1489 smc_llc_flow_qentry_del(&lgr->llc_flow_rmt); in smc_llc_rmt_conf_rkey()
1493 static void smc_llc_rmt_delete_rkey(struct smc_link_group *lgr) in smc_llc_rmt_delete_rkey() argument
1501 qentry = lgr->llc_flow_rmt.qentry; in smc_llc_rmt_delete_rkey()
1516 smc_llc_flow_qentry_del(&lgr->llc_flow_rmt); in smc_llc_rmt_delete_rkey()
1519 static void smc_llc_protocol_violation(struct smc_link_group *lgr, u8 type) in smc_llc_protocol_violation() argument
1522 "llc_type %d\n", SMC_LGR_ID_SIZE, &lgr->id, type); in smc_llc_protocol_violation()
1523 smc_llc_set_termination_rsn(lgr, SMC_LLC_DEL_PROT_VIOL); in smc_llc_protocol_violation()
1524 smc_lgr_terminate_sched(lgr); in smc_llc_protocol_violation()
1528 static void smc_llc_event_flush(struct smc_link_group *lgr) in smc_llc_event_flush() argument
1532 spin_lock_bh(&lgr->llc_event_q_lock); in smc_llc_event_flush()
1533 list_for_each_entry_safe(qentry, q, &lgr->llc_event_q, list) { in smc_llc_event_flush()
1537 spin_unlock_bh(&lgr->llc_event_q_lock); in smc_llc_event_flush()
1544 struct smc_link_group *lgr = link->lgr; in smc_llc_event_handler() local
1555 if (list_empty(&lgr->list)) in smc_llc_event_handler()
1557 if (lgr->role == SMC_CLNT) { in smc_llc_event_handler()
1559 if (lgr->llc_flow_lcl.type == in smc_llc_event_handler()
1562 if (smc_llc_flow_start(&lgr->llc_flow_lcl, in smc_llc_event_handler()
1564 schedule_work(&lgr->llc_add_link_work); in smc_llc_event_handler()
1568 if (lgr->llc_flow_lcl.type == SMC_LLC_FLOW_ADD_LINK && in smc_llc_event_handler()
1569 !lgr->llc_flow_lcl.qentry) { in smc_llc_event_handler()
1571 smc_llc_flow_qentry_set(&lgr->llc_flow_lcl, in smc_llc_event_handler()
1573 wake_up(&lgr->llc_msg_waiter); in smc_llc_event_handler()
1574 } else if (smc_llc_flow_start(&lgr->llc_flow_lcl, in smc_llc_event_handler()
1576 schedule_work(&lgr->llc_add_link_work); in smc_llc_event_handler()
1578 } else if (smc_llc_flow_start(&lgr->llc_flow_lcl, qentry)) { in smc_llc_event_handler()
1580 schedule_work(&lgr->llc_add_link_work); in smc_llc_event_handler()
1585 if (lgr->llc_flow_lcl.type != SMC_LLC_FLOW_NONE) { in smc_llc_event_handler()
1587 smc_llc_flow_qentry_set(&lgr->llc_flow_lcl, qentry); in smc_llc_event_handler()
1588 wake_up(&lgr->llc_msg_waiter); in smc_llc_event_handler()
1593 if (lgr->llc_flow_lcl.type == SMC_LLC_FLOW_ADD_LINK && in smc_llc_event_handler()
1594 !lgr->llc_flow_lcl.qentry) { in smc_llc_event_handler()
1596 smc_llc_flow_qentry_set(&lgr->llc_flow_lcl, qentry); in smc_llc_event_handler()
1597 wake_up(&lgr->llc_msg_waiter); in smc_llc_event_handler()
1598 } else if (smc_llc_flow_start(&lgr->llc_flow_lcl, qentry)) { in smc_llc_event_handler()
1599 schedule_work(&lgr->llc_del_link_work); in smc_llc_event_handler()
1604 if (smc_llc_flow_start(&lgr->llc_flow_rmt, qentry)) { in smc_llc_event_handler()
1606 smc_llc_rmt_conf_rkey(lgr); in smc_llc_event_handler()
1607 smc_llc_flow_stop(lgr, &lgr->llc_flow_rmt); in smc_llc_event_handler()
1617 if (smc_llc_flow_start(&lgr->llc_flow_rmt, qentry)) { in smc_llc_event_handler()
1619 smc_llc_rmt_delete_rkey(lgr); in smc_llc_event_handler()
1620 smc_llc_flow_stop(lgr, &lgr->llc_flow_rmt); in smc_llc_event_handler()
1624 smc_llc_protocol_violation(lgr, llc->raw.hdr.common.type); in smc_llc_event_handler()
1634 struct smc_link_group *lgr = container_of(work, struct smc_link_group, in smc_llc_event_work() local
1638 if (!lgr->llc_flow_lcl.type && lgr->delayed_event) { in smc_llc_event_work()
1639 qentry = lgr->delayed_event; in smc_llc_event_work()
1640 lgr->delayed_event = NULL; in smc_llc_event_work()
1648 spin_lock_bh(&lgr->llc_event_q_lock); in smc_llc_event_work()
1649 if (!list_empty(&lgr->llc_event_q)) { in smc_llc_event_work()
1650 qentry = list_first_entry(&lgr->llc_event_q, in smc_llc_event_work()
1653 spin_unlock_bh(&lgr->llc_event_q_lock); in smc_llc_event_work()
1657 spin_unlock_bh(&lgr->llc_event_q_lock); in smc_llc_event_work()
1664 enum smc_llc_flowtype flowtype = link->lgr->llc_flow_lcl.type; in smc_llc_rx_response()
1665 struct smc_llc_flow *flow = &link->lgr->llc_flow_lcl; in smc_llc_rx_response()
1692 smc_llc_protocol_violation(link->lgr, llc_type); in smc_llc_rx_response()
1699 smc_llc_flow_qentry_set(&link->lgr->llc_flow_lcl, qentry); in smc_llc_rx_response()
1700 wake_up(&link->lgr->llc_msg_waiter); in smc_llc_rx_response()
1705 struct smc_link_group *lgr = link->lgr; in smc_llc_enqueue() local
1723 spin_lock_irqsave(&lgr->llc_event_q_lock, flags); in smc_llc_enqueue()
1724 list_add_tail(&qentry->list, &lgr->llc_event_q); in smc_llc_enqueue()
1725 spin_unlock_irqrestore(&lgr->llc_event_q_lock, flags); in smc_llc_enqueue()
1726 queue_work(system_highpri_wq, &lgr->llc_event_work); in smc_llc_enqueue()
1777 void smc_llc_lgr_init(struct smc_link_group *lgr, struct smc_sock *smc) in smc_llc_lgr_init() argument
1781 INIT_WORK(&lgr->llc_event_work, smc_llc_event_work); in smc_llc_lgr_init()
1782 INIT_WORK(&lgr->llc_add_link_work, smc_llc_add_link_work); in smc_llc_lgr_init()
1783 INIT_WORK(&lgr->llc_del_link_work, smc_llc_delete_link_work); in smc_llc_lgr_init()
1784 INIT_LIST_HEAD(&lgr->llc_event_q); in smc_llc_lgr_init()
1785 spin_lock_init(&lgr->llc_event_q_lock); in smc_llc_lgr_init()
1786 spin_lock_init(&lgr->llc_flow_lock); in smc_llc_lgr_init()
1787 init_waitqueue_head(&lgr->llc_flow_waiter); in smc_llc_lgr_init()
1788 init_waitqueue_head(&lgr->llc_msg_waiter); in smc_llc_lgr_init()
1789 mutex_init(&lgr->llc_conf_mutex); in smc_llc_lgr_init()
1790 lgr->llc_testlink_time = net->ipv4.sysctl_tcp_keepalive_time; in smc_llc_lgr_init()
1794 void smc_llc_lgr_clear(struct smc_link_group *lgr) in smc_llc_lgr_clear() argument
1796 smc_llc_event_flush(lgr); in smc_llc_lgr_clear()
1797 wake_up_all(&lgr->llc_flow_waiter); in smc_llc_lgr_clear()
1798 wake_up_all(&lgr->llc_msg_waiter); in smc_llc_lgr_clear()
1799 cancel_work_sync(&lgr->llc_event_work); in smc_llc_lgr_clear()
1800 cancel_work_sync(&lgr->llc_add_link_work); in smc_llc_lgr_clear()
1801 cancel_work_sync(&lgr->llc_del_link_work); in smc_llc_lgr_clear()
1802 if (lgr->delayed_event) { in smc_llc_lgr_clear()
1803 kfree(lgr->delayed_event); in smc_llc_lgr_clear()
1804 lgr->delayed_event = NULL; in smc_llc_lgr_clear()
1819 SMC_LGR_ID_SIZE, &link->lgr->id, in smc_llc_link_active()
1824 if (link->lgr->llc_testlink_time) { in smc_llc_link_active()
1825 link->llc_testlink_time = link->lgr->llc_testlink_time; in smc_llc_link_active()
1837 SMC_LGR_ID_SIZE, &link->lgr->id, in smc_llc_link_clear()
1849 struct smc_link_group *lgr = send_link->lgr; in smc_llc_do_confirm_rkey() local
1857 qentry = smc_llc_wait(lgr, send_link, SMC_LLC_WAIT_TIME, in smc_llc_do_confirm_rkey()
1863 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_do_confirm_rkey()
1868 int smc_llc_do_delete_rkey(struct smc_link_group *lgr, in smc_llc_do_delete_rkey() argument
1875 send_link = smc_llc_usable_link(lgr); in smc_llc_do_delete_rkey()
1884 qentry = smc_llc_wait(lgr, send_link, SMC_LLC_WAIT_TIME, in smc_llc_do_delete_rkey()
1890 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); in smc_llc_do_delete_rkey()
1898 link_uid = htonl(*((u32 *)link->lgr->id) + link->link_id); in smc_llc_link_set_uid()