Lines Matching refs:node

154 static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
157 static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
170 struct qrtr_node *node = container_of(kref, struct qrtr_node, ref); in __qrtr_node_release() local
181 if (*slot == node) in __qrtr_node_release()
186 list_del(&node->item); in __qrtr_node_release()
189 skb_queue_purge(&node->rx_queue); in __qrtr_node_release()
192 radix_tree_for_each_slot(slot, &node->qrtr_tx_flow, &iter, 0) { in __qrtr_node_release()
194 radix_tree_iter_delete(&node->qrtr_tx_flow, &iter, slot); in __qrtr_node_release()
197 kfree(node); in __qrtr_node_release()
201 static struct qrtr_node *qrtr_node_acquire(struct qrtr_node *node) in qrtr_node_acquire() argument
203 if (node) in qrtr_node_acquire()
204 kref_get(&node->ref); in qrtr_node_acquire()
205 return node; in qrtr_node_acquire()
209 static void qrtr_node_release(struct qrtr_node *node) in qrtr_node_release() argument
211 if (!node) in qrtr_node_release()
213 kref_put_mutex(&node->ref, __qrtr_node_release, &qrtr_node_lock); in qrtr_node_release()
221 static void qrtr_tx_resume(struct qrtr_node *node, struct sk_buff *skb) in qrtr_tx_resume() argument
224 u64 remote_node = le32_to_cpu(pkt->client.node); in qrtr_tx_resume()
232 flow = radix_tree_lookup(&node->qrtr_tx_flow, key); in qrtr_tx_resume()
259 static int qrtr_tx_wait(struct qrtr_node *node, int dest_node, int dest_port, in qrtr_tx_wait() argument
271 mutex_lock(&node->qrtr_tx_lock); in qrtr_tx_wait()
272 flow = radix_tree_lookup(&node->qrtr_tx_flow, key); in qrtr_tx_wait()
277 if (radix_tree_insert(&node->qrtr_tx_flow, key, flow)) { in qrtr_tx_wait()
283 mutex_unlock(&node->qrtr_tx_lock); in qrtr_tx_wait()
293 !node->ep); in qrtr_tx_wait()
296 } else if (!node->ep) { in qrtr_tx_wait()
323 static void qrtr_tx_flow_failed(struct qrtr_node *node, int dest_node, in qrtr_tx_flow_failed() argument
330 flow = radix_tree_lookup(&node->qrtr_tx_flow, key); in qrtr_tx_flow_failed()
340 static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb, in qrtr_node_enqueue() argument
348 confirm_rx = qrtr_tx_wait(node, to->sq_node, to->sq_port, type); in qrtr_node_enqueue()
360 hdr->dst_node_id = cpu_to_le32(node->nid); in qrtr_node_enqueue()
373 mutex_lock(&node->ep_lock); in qrtr_node_enqueue()
375 if (node->ep) in qrtr_node_enqueue()
376 rc = node->ep->xmit(node->ep, skb); in qrtr_node_enqueue()
379 mutex_unlock(&node->ep_lock); in qrtr_node_enqueue()
384 qrtr_tx_flow_failed(node, to->sq_node, to->sq_port); in qrtr_node_enqueue()
395 struct qrtr_node *node; in qrtr_node_lookup() local
400 node = radix_tree_lookup(&qrtr_nodes, nid); in qrtr_node_lookup()
401 node = qrtr_node_acquire(node); in qrtr_node_lookup()
405 return node; in qrtr_node_lookup()
413 static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid) in qrtr_node_assign() argument
421 radix_tree_insert(&qrtr_nodes, nid, node); in qrtr_node_assign()
422 if (node->nid == QRTR_EP_NID_AUTO) in qrtr_node_assign()
423 node->nid = nid; in qrtr_node_assign()
437 struct qrtr_node *node = ep->node; in qrtr_endpoint_post() local
517 qrtr_node_assign(node, cb->src_node); in qrtr_endpoint_post()
524 qrtr_node_assign(node, le32_to_cpu(pkt->server.node)); in qrtr_endpoint_post()
528 qrtr_tx_resume(node, skb); in qrtr_endpoint_post()
587 struct qrtr_node *node; in qrtr_endpoint_register() local
592 node = kzalloc(sizeof(*node), GFP_KERNEL); in qrtr_endpoint_register()
593 if (!node) in qrtr_endpoint_register()
596 kref_init(&node->ref); in qrtr_endpoint_register()
597 mutex_init(&node->ep_lock); in qrtr_endpoint_register()
598 skb_queue_head_init(&node->rx_queue); in qrtr_endpoint_register()
599 node->nid = QRTR_EP_NID_AUTO; in qrtr_endpoint_register()
600 node->ep = ep; in qrtr_endpoint_register()
602 INIT_RADIX_TREE(&node->qrtr_tx_flow, GFP_KERNEL); in qrtr_endpoint_register()
603 mutex_init(&node->qrtr_tx_lock); in qrtr_endpoint_register()
605 qrtr_node_assign(node, nid); in qrtr_endpoint_register()
608 list_add(&node->item, &qrtr_all_nodes); in qrtr_endpoint_register()
610 ep->node = node; in qrtr_endpoint_register()
622 struct qrtr_node *node = ep->node; in qrtr_endpoint_unregister() local
623 struct sockaddr_qrtr src = {AF_QIPCRTR, node->nid, QRTR_PORT_CTRL}; in qrtr_endpoint_unregister()
632 mutex_lock(&node->ep_lock); in qrtr_endpoint_unregister()
633 node->ep = NULL; in qrtr_endpoint_unregister()
634 mutex_unlock(&node->ep_lock); in qrtr_endpoint_unregister()
639 if (*slot != node) in qrtr_endpoint_unregister()
651 mutex_lock(&node->qrtr_tx_lock); in qrtr_endpoint_unregister()
652 radix_tree_for_each_slot(slot, &node->qrtr_tx_flow, &iter, 0) { in qrtr_endpoint_unregister()
656 mutex_unlock(&node->qrtr_tx_lock); in qrtr_endpoint_unregister()
658 qrtr_node_release(node); in qrtr_endpoint_unregister()
659 ep->node = NULL; in qrtr_endpoint_unregister()
704 pkt->client.node = cpu_to_le32(ipc->us.sq_node); in qrtr_port_remove()
848 static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb, in qrtr_local_enqueue() argument
879 static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb, in qrtr_bcast_enqueue() argument
886 list_for_each_entry(node, &qrtr_all_nodes, item) { in qrtr_bcast_enqueue()
891 qrtr_node_enqueue(node, skbn, type, from, to); in qrtr_bcast_enqueue()
908 struct qrtr_node *node; in qrtr_sendmsg() local
945 node = NULL; in qrtr_sendmsg()
956 node = qrtr_node_lookup(addr->sq_node); in qrtr_sendmsg()
957 if (!node) { in qrtr_sendmsg()
992 rc = enqueue_fn(node, skb, type, &ipc->us, addr); in qrtr_sendmsg()
997 qrtr_node_release(node); in qrtr_sendmsg()
1008 struct qrtr_node *node; in qrtr_send_resume_tx() local
1012 node = qrtr_node_lookup(remote.sq_node); in qrtr_send_resume_tx()
1013 if (!node) in qrtr_send_resume_tx()
1021 pkt->client.node = cpu_to_le32(cb->dst_node); in qrtr_send_resume_tx()
1024 ret = qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX, &local, &remote); in qrtr_send_resume_tx()
1026 qrtr_node_release(node); in qrtr_send_resume_tx()