Lines Matching refs:node
198 struct midcomms_node *node; member
204 void (*ack_rcv)(struct midcomms_node *node);
253 const char *dlm_midcomms_state(struct midcomms_node *node) in dlm_midcomms_state() argument
255 return dlm_state_str(node->state); in dlm_midcomms_state()
258 unsigned long dlm_midcomms_flags(struct midcomms_node *node) in dlm_midcomms_flags() argument
260 return node->flags; in dlm_midcomms_flags()
263 int dlm_midcomms_send_queue_cnt(struct midcomms_node *node) in dlm_midcomms_send_queue_cnt() argument
265 return atomic_read(&node->send_queue_cnt); in dlm_midcomms_send_queue_cnt()
268 uint32_t dlm_midcomms_version(struct midcomms_node *node) in dlm_midcomms_version() argument
270 return node->version; in dlm_midcomms_version()
275 struct midcomms_node *node; in __find_node() local
277 hlist_for_each_entry_rcu(node, &node_hash[r], hlist) { in __find_node()
278 if (node->nodeid == nodeid) in __find_node()
279 return node; in __find_node()
293 static void dlm_mhandle_delete(struct midcomms_node *node, in dlm_mhandle_delete() argument
297 atomic_dec(&node->send_queue_cnt); in dlm_mhandle_delete()
301 static void dlm_send_queue_flush(struct midcomms_node *node) in dlm_send_queue_flush() argument
305 pr_debug("flush midcomms send queue of node %d\n", node->nodeid); in dlm_send_queue_flush()
308 spin_lock(&node->send_queue_lock); in dlm_send_queue_flush()
309 list_for_each_entry_rcu(mh, &node->send_queue, list) { in dlm_send_queue_flush()
310 dlm_mhandle_delete(node, mh); in dlm_send_queue_flush()
312 spin_unlock(&node->send_queue_lock); in dlm_send_queue_flush()
316 static void midcomms_node_reset(struct midcomms_node *node) in midcomms_node_reset() argument
318 pr_debug("reset node %d\n", node->nodeid); in midcomms_node_reset()
320 node->seq_next = DLM_SEQ_INIT; in midcomms_node_reset()
321 node->seq_send = DLM_SEQ_INIT; in midcomms_node_reset()
322 node->version = DLM_VERSION_NOT_SET; in midcomms_node_reset()
323 node->flags = 0; in midcomms_node_reset()
325 dlm_send_queue_flush(node); in midcomms_node_reset()
326 node->state = DLM_CLOSED; in midcomms_node_reset()
327 wake_up(&node->shutdown_wait); in midcomms_node_reset()
332 struct midcomms_node *node, *tmp; in nodeid2node() local
335 node = __find_node(nodeid, r); in nodeid2node()
336 if (node || !alloc) in nodeid2node()
337 return node; in nodeid2node()
339 node = kmalloc(sizeof(*node), alloc); in nodeid2node()
340 if (!node) in nodeid2node()
343 node->nodeid = nodeid; in nodeid2node()
344 spin_lock_init(&node->state_lock); in nodeid2node()
345 spin_lock_init(&node->send_queue_lock); in nodeid2node()
346 atomic_set(&node->send_queue_cnt, 0); in nodeid2node()
347 INIT_LIST_HEAD(&node->send_queue); in nodeid2node()
348 init_waitqueue_head(&node->shutdown_wait); in nodeid2node()
349 node->users = 0; in nodeid2node()
350 midcomms_node_reset(node); in nodeid2node()
359 kfree(node); in nodeid2node()
363 hlist_add_head_rcu(&node->hlist, &node_hash[r]); in nodeid2node()
366 node->debugfs = dlm_create_debug_comms_file(nodeid, node); in nodeid2node()
367 return node; in nodeid2node()
396 static int dlm_send_fin(struct midcomms_node *node, in dlm_send_fin() argument
397 void (*ack_rcv)(struct midcomms_node *node)) in dlm_send_fin() argument
404 mh = dlm_midcomms_get_mhandle(node->nodeid, mb_len, GFP_NOFS, &ppc); in dlm_send_fin()
417 pr_debug("sending fin msg to node %d\n", node->nodeid); in dlm_send_fin()
419 set_bit(DLM_NODE_FLAG_STOP_TX, &node->flags); in dlm_send_fin()
424 static void dlm_receive_ack(struct midcomms_node *node, uint32_t seq) in dlm_receive_ack() argument
429 list_for_each_entry_rcu(mh, &node->send_queue, list) { in dlm_receive_ack()
432 mh->ack_rcv(node); in dlm_receive_ack()
439 spin_lock(&node->send_queue_lock); in dlm_receive_ack()
440 list_for_each_entry_rcu(mh, &node->send_queue, list) { in dlm_receive_ack()
442 dlm_mhandle_delete(node, mh); in dlm_receive_ack()
448 spin_unlock(&node->send_queue_lock); in dlm_receive_ack()
452 static void dlm_pas_fin_ack_rcv(struct midcomms_node *node) in dlm_pas_fin_ack_rcv() argument
454 spin_lock(&node->state_lock); in dlm_pas_fin_ack_rcv()
456 node->nodeid, dlm_state_str(node->state)); in dlm_pas_fin_ack_rcv()
458 switch (node->state) { in dlm_pas_fin_ack_rcv()
461 midcomms_node_reset(node); in dlm_pas_fin_ack_rcv()
465 wake_up(&node->shutdown_wait); in dlm_pas_fin_ack_rcv()
468 spin_unlock(&node->state_lock); in dlm_pas_fin_ack_rcv()
470 __func__, node->state); in dlm_pas_fin_ack_rcv()
474 spin_unlock(&node->state_lock); in dlm_pas_fin_ack_rcv()
478 struct midcomms_node *node, in dlm_midcomms_receive_buffer() argument
481 if (seq == node->seq_next) { in dlm_midcomms_receive_buffer()
482 node->seq_next++; in dlm_midcomms_receive_buffer()
487 dlm_send_ack(node->nodeid, node->seq_next); in dlm_midcomms_receive_buffer()
489 spin_lock(&node->state_lock); in dlm_midcomms_receive_buffer()
491 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_receive_buffer()
493 switch (node->state) { in dlm_midcomms_receive_buffer()
495 node->state = DLM_CLOSE_WAIT; in dlm_midcomms_receive_buffer()
497 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_receive_buffer()
502 if (node->users == 0) { in dlm_midcomms_receive_buffer()
503 node->state = DLM_LAST_ACK; in dlm_midcomms_receive_buffer()
505 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_receive_buffer()
506 spin_unlock(&node->state_lock); in dlm_midcomms_receive_buffer()
511 node->state = DLM_CLOSING; in dlm_midcomms_receive_buffer()
513 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_receive_buffer()
516 midcomms_node_reset(node); in dlm_midcomms_receive_buffer()
518 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_receive_buffer()
519 wake_up(&node->shutdown_wait); in dlm_midcomms_receive_buffer()
525 spin_unlock(&node->state_lock); in dlm_midcomms_receive_buffer()
527 __func__, node->state); in dlm_midcomms_receive_buffer()
531 spin_unlock(&node->state_lock); in dlm_midcomms_receive_buffer()
533 set_bit(DLM_NODE_FLAG_STOP_RX, &node->flags); in dlm_midcomms_receive_buffer()
536 WARN_ON(test_bit(DLM_NODE_FLAG_STOP_RX, &node->flags)); in dlm_midcomms_receive_buffer()
537 dlm_receive_buffer(p, node->nodeid); in dlm_midcomms_receive_buffer()
538 set_bit(DLM_NODE_ULP_DELIVERED, &node->flags); in dlm_midcomms_receive_buffer()
545 if (seq < node->seq_next) in dlm_midcomms_receive_buffer()
546 dlm_send_ack(node->nodeid, node->seq_next); in dlm_midcomms_receive_buffer()
549 seq, node->seq_next, node->nodeid); in dlm_midcomms_receive_buffer()
555 set_bit(DLM_NODE_FLAG_STOP_RX, &node->flags); in dlm_midcomms_receive_buffer()
556 dlm_send_fin(node, dlm_pas_fin_ack_rcv); in dlm_midcomms_receive_buffer()
561 uint16_t msglen, int (*cb)(struct midcomms_node *node)) in dlm_midcomms_recv_node_lookup() argument
563 struct midcomms_node *node = NULL; in dlm_midcomms_recv_node_lookup() local
583 node = nodeid2node(nodeid, 0); in dlm_midcomms_recv_node_lookup()
584 if (node) { in dlm_midcomms_recv_node_lookup()
585 spin_lock(&node->state_lock); in dlm_midcomms_recv_node_lookup()
586 if (node->state != DLM_ESTABLISHED) in dlm_midcomms_recv_node_lookup()
588 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_recv_node_lookup()
590 switch (node->state) { in dlm_midcomms_recv_node_lookup()
592 node->state = DLM_ESTABLISHED; in dlm_midcomms_recv_node_lookup()
594 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_recv_node_lookup()
604 node->nodeid); in dlm_midcomms_recv_node_lookup()
606 midcomms_node_reset(node); in dlm_midcomms_recv_node_lookup()
607 node->state = DLM_ESTABLISHED; in dlm_midcomms_recv_node_lookup()
610 spin_unlock(&node->state_lock); in dlm_midcomms_recv_node_lookup()
624 node = nodeid2node(nodeid, allocation); in dlm_midcomms_recv_node_lookup()
625 if (!node) { in dlm_midcomms_recv_node_lookup()
646 ret = cb(node); in dlm_midcomms_recv_node_lookup()
650 return node; in dlm_midcomms_recv_node_lookup()
653 static int dlm_midcomms_version_check_3_2(struct midcomms_node *node) in dlm_midcomms_version_check_3_2() argument
655 switch (node->version) { in dlm_midcomms_version_check_3_2()
657 node->version = DLM_VERSION_3_2; in dlm_midcomms_version_check_3_2()
659 node->nodeid); in dlm_midcomms_version_check_3_2()
665 DLM_VERSION_3_2, node->nodeid, node->version); in dlm_midcomms_version_check_3_2()
724 struct midcomms_node *node; in dlm_midcomms_receive_buffer_3_2() local
729 node = dlm_midcomms_recv_node_lookup(nodeid, p, msglen, in dlm_midcomms_receive_buffer_3_2()
731 if (!node) in dlm_midcomms_receive_buffer_3_2()
757 WARN_ON(test_bit(DLM_NODE_FLAG_STOP_RX, &node->flags)); in dlm_midcomms_receive_buffer_3_2()
806 dlm_midcomms_receive_buffer(p, node, seq); in dlm_midcomms_receive_buffer_3_2()
810 dlm_receive_ack(node, seq); in dlm_midcomms_receive_buffer_3_2()
822 static int dlm_midcomms_version_check_3_1(struct midcomms_node *node) in dlm_midcomms_version_check_3_1() argument
824 switch (node->version) { in dlm_midcomms_version_check_3_1()
826 node->version = DLM_VERSION_3_1; in dlm_midcomms_version_check_3_1()
828 node->nodeid); in dlm_midcomms_version_check_3_1()
834 DLM_VERSION_3_1, node->nodeid, node->version); in dlm_midcomms_version_check_3_1()
844 struct midcomms_node *node; in dlm_midcomms_receive_buffer_3_1() local
848 node = dlm_midcomms_recv_node_lookup(nodeid, p, msglen, in dlm_midcomms_receive_buffer_3_1()
850 if (!node) { in dlm_midcomms_receive_buffer_3_1()
940 struct midcomms_node *node; in dlm_midcomms_receive_done() local
944 node = nodeid2node(nodeid, 0); in dlm_midcomms_receive_done()
945 if (!node) { in dlm_midcomms_receive_done()
951 switch (node->version) { in dlm_midcomms_receive_done()
961 &node->flags)) { in dlm_midcomms_receive_done()
966 spin_lock(&node->state_lock); in dlm_midcomms_receive_done()
968 switch (node->state) { in dlm_midcomms_receive_done()
970 spin_unlock(&node->state_lock); in dlm_midcomms_receive_done()
971 dlm_send_ack(node->nodeid, node->seq_next); in dlm_midcomms_receive_done()
974 spin_unlock(&node->state_lock); in dlm_midcomms_receive_done()
983 struct midcomms_node *node; in dlm_midcomms_unack_msg_resend() local
988 node = nodeid2node(nodeid, 0); in dlm_midcomms_unack_msg_resend()
989 if (!node) { in dlm_midcomms_unack_msg_resend()
995 switch (node->version) { in dlm_midcomms_unack_msg_resend()
1004 list_for_each_entry_rcu(mh, &node->send_queue, list) { in dlm_midcomms_unack_msg_resend()
1011 mh->seq, node->nodeid); in dlm_midcomms_unack_msg_resend()
1031 atomic_inc(&mh->node->send_queue_cnt); in midcomms_new_msg_cb()
1033 spin_lock(&mh->node->send_queue_lock); in midcomms_new_msg_cb()
1034 list_add_tail_rcu(&mh->list, &mh->node->send_queue); in midcomms_new_msg_cb()
1035 spin_unlock(&mh->node->send_queue_lock); in midcomms_new_msg_cb()
1037 mh->seq = mh->node->seq_send++; in midcomms_new_msg_cb()
1069 struct midcomms_node *node; in dlm_midcomms_get_mhandle() local
1075 node = nodeid2node(nodeid, 0); in dlm_midcomms_get_mhandle()
1076 if (!node) { in dlm_midcomms_get_mhandle()
1082 WARN_ON(test_bit(DLM_NODE_FLAG_STOP_TX, &node->flags)); in dlm_midcomms_get_mhandle()
1091 mh->node = node; in dlm_midcomms_get_mhandle()
1093 switch (node->version) { in dlm_midcomms_get_mhandle()
1147 switch (mh->node->version) { in dlm_midcomms_commit_mhandle()
1178 static void dlm_act_fin_ack_rcv(struct midcomms_node *node) in dlm_act_fin_ack_rcv() argument
1180 spin_lock(&node->state_lock); in dlm_act_fin_ack_rcv()
1182 node->nodeid, dlm_state_str(node->state)); in dlm_act_fin_ack_rcv()
1184 switch (node->state) { in dlm_act_fin_ack_rcv()
1186 node->state = DLM_FIN_WAIT2; in dlm_act_fin_ack_rcv()
1188 node->nodeid, dlm_state_str(node->state)); in dlm_act_fin_ack_rcv()
1191 midcomms_node_reset(node); in dlm_act_fin_ack_rcv()
1193 node->nodeid, dlm_state_str(node->state)); in dlm_act_fin_ack_rcv()
1194 wake_up(&node->shutdown_wait); in dlm_act_fin_ack_rcv()
1198 wake_up(&node->shutdown_wait); in dlm_act_fin_ack_rcv()
1201 spin_unlock(&node->state_lock); in dlm_act_fin_ack_rcv()
1203 __func__, node->state); in dlm_act_fin_ack_rcv()
1207 spin_unlock(&node->state_lock); in dlm_act_fin_ack_rcv()
1212 struct midcomms_node *node; in dlm_midcomms_add_member() local
1219 node = nodeid2node(nodeid, GFP_NOFS); in dlm_midcomms_add_member()
1220 if (!node) { in dlm_midcomms_add_member()
1225 spin_lock(&node->state_lock); in dlm_midcomms_add_member()
1226 if (!node->users) { in dlm_midcomms_add_member()
1228 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_add_member()
1229 switch (node->state) { in dlm_midcomms_add_member()
1233 node->state = DLM_ESTABLISHED; in dlm_midcomms_add_member()
1235 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_add_member()
1243 node->nodeid); in dlm_midcomms_add_member()
1245 midcomms_node_reset(node); in dlm_midcomms_add_member()
1246 node->state = DLM_ESTABLISHED; in dlm_midcomms_add_member()
1251 node->users++; in dlm_midcomms_add_member()
1252 pr_debug("node %d users inc count %d\n", nodeid, node->users); in dlm_midcomms_add_member()
1253 spin_unlock(&node->state_lock); in dlm_midcomms_add_member()
1260 struct midcomms_node *node; in dlm_midcomms_remove_member() local
1267 node = nodeid2node(nodeid, 0); in dlm_midcomms_remove_member()
1268 if (!node) { in dlm_midcomms_remove_member()
1273 spin_lock(&node->state_lock); in dlm_midcomms_remove_member()
1274 node->users--; in dlm_midcomms_remove_member()
1275 pr_debug("node %d users dec count %d\n", nodeid, node->users); in dlm_midcomms_remove_member()
1281 if (node->users == 0) { in dlm_midcomms_remove_member()
1283 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_remove_member()
1284 switch (node->state) { in dlm_midcomms_remove_member()
1289 node->state = DLM_LAST_ACK; in dlm_midcomms_remove_member()
1290 spin_unlock(&node->state_lock); in dlm_midcomms_remove_member()
1293 node->nodeid, dlm_state_str(node->state)); in dlm_midcomms_remove_member()
1303 __func__, node->state); in dlm_midcomms_remove_member()
1307 spin_unlock(&node->state_lock); in dlm_midcomms_remove_member()
1313 set_bit(DLM_NODE_FLAG_STOP_RX, &node->flags); in dlm_midcomms_remove_member()
1314 dlm_send_fin(node, dlm_pas_fin_ack_rcv); in dlm_midcomms_remove_member()
1320 struct midcomms_node *node = container_of(rcu, struct midcomms_node, rcu); in midcomms_node_release() local
1322 WARN_ON(atomic_read(&node->send_queue_cnt)); in midcomms_node_release()
1323 kfree(node); in midcomms_node_release()
1326 static void midcomms_shutdown(struct midcomms_node *node) in midcomms_shutdown() argument
1331 switch (node->version) { in midcomms_shutdown()
1338 spin_lock(&node->state_lock); in midcomms_shutdown()
1340 node->nodeid, dlm_state_str(node->state)); in midcomms_shutdown()
1341 switch (node->state) { in midcomms_shutdown()
1343 node->state = DLM_FIN_WAIT1; in midcomms_shutdown()
1345 node->nodeid, dlm_state_str(node->state)); in midcomms_shutdown()
1349 spin_unlock(&node->state_lock); in midcomms_shutdown()
1357 spin_unlock(&node->state_lock); in midcomms_shutdown()
1359 if (node->state == DLM_FIN_WAIT1) { in midcomms_shutdown()
1360 dlm_send_fin(node, dlm_act_fin_ack_rcv); in midcomms_shutdown()
1367 ret = wait_event_timeout(node->shutdown_wait, in midcomms_shutdown()
1368 node->state == DLM_CLOSED || in midcomms_shutdown()
1369 test_bit(DLM_NODE_FLAG_CLOSE, &node->flags), in midcomms_shutdown()
1371 if (!ret || test_bit(DLM_NODE_FLAG_CLOSE, &node->flags)) { in midcomms_shutdown()
1373 node->nodeid, dlm_state_str(node->state)); in midcomms_shutdown()
1374 midcomms_node_reset(node); in midcomms_shutdown()
1379 node->nodeid, dlm_state_str(node->state)); in midcomms_shutdown()
1384 struct midcomms_node *node; in dlm_midcomms_shutdown() local
1390 hlist_for_each_entry_rcu(node, &node_hash[i], hlist) { in dlm_midcomms_shutdown()
1391 midcomms_shutdown(node); in dlm_midcomms_shutdown()
1393 dlm_delete_debug_comms_file(node->debugfs); in dlm_midcomms_shutdown()
1396 hlist_del_rcu(&node->hlist); in dlm_midcomms_shutdown()
1399 call_srcu(&nodes_srcu, &node->rcu, midcomms_node_release); in dlm_midcomms_shutdown()
1410 struct midcomms_node *node; in dlm_midcomms_close() local
1420 node = nodeid2node(nodeid, 0); in dlm_midcomms_close()
1421 if (node) { in dlm_midcomms_close()
1423 set_bit(DLM_NODE_FLAG_CLOSE, &node->flags); in dlm_midcomms_close()
1424 wake_up(&node->shutdown_wait); in dlm_midcomms_close()
1432 node = nodeid2node(nodeid, 0); in dlm_midcomms_close()
1433 if (!node) { in dlm_midcomms_close()
1440 spin_lock(&node->state_lock); in dlm_midcomms_close()
1441 midcomms_node_reset(node); in dlm_midcomms_close()
1442 spin_unlock(&node->state_lock); in dlm_midcomms_close()
1451 struct midcomms_node *node; member
1467 h->u.h_seq = cpu_to_le32(rd->node->seq_send++); in midcomms_new_rawmsg_cb()
1476 int dlm_midcomms_rawmsg_send(struct midcomms_node *node, void *buf, in dlm_midcomms_rawmsg_send() argument
1483 rd.node = node; in dlm_midcomms_rawmsg_send()
1486 msg = dlm_lowcomms_new_msg(node->nodeid, buflen, GFP_NOFS, in dlm_midcomms_rawmsg_send()