Lines Matching refs:node

30  * @src_node_id: source node
34 * @dst_node_id: destination node
55 * @src_node_id: source node
57 * @dst_node_id: destination node
102 /* for node ids */
107 /* lock for qrtr_all_nodes and node reference */
114 * struct qrtr_node - endpoint node
117 * @ref: reference count for node
118 * @nid: node id
119 * @qrtr_tx_flow: tree of qrtr_tx_flow, keyed by node << 32 | port
152 static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
155 static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
161 /* Release node resources and free the node.
164 * kref_put_mutex. As such, the node mutex is expected to be locked on call.
168 struct qrtr_node *node = container_of(kref, struct qrtr_node, ref);
175 if (node->nid != QRTR_EP_NID_AUTO)
176 radix_tree_delete(&qrtr_nodes, node->nid);
179 list_del(&node->item);
182 skb_queue_purge(&node->rx_queue);
185 radix_tree_for_each_slot(slot, &node->qrtr_tx_flow, &iter, 0) {
187 radix_tree_iter_delete(&node->qrtr_tx_flow, &iter, slot);
190 kfree(node);
193 /* Increment reference to node. */
194 static struct qrtr_node *qrtr_node_acquire(struct qrtr_node *node)
196 if (node)
197 kref_get(&node->ref);
198 return node;
201 /* Decrement reference to node and release as necessary. */
202 static void qrtr_node_release(struct qrtr_node *node)
204 if (!node)
206 kref_put_mutex(&node->ref, __qrtr_node_release, &qrtr_node_lock);
211 * @node: qrtr_node that the QRTR_TYPE_RESUME_TX packet arrived on
214 static void qrtr_tx_resume(struct qrtr_node *node, struct sk_buff *skb)
217 u64 remote_node = le32_to_cpu(pkt->client.node);
225 flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
239 * @node: qrtr_node that the packet is to be send to
240 * @dest_node: node id of the destination
252 static int qrtr_tx_wait(struct qrtr_node *node, int dest_node, int dest_port,
264 mutex_lock(&node->qrtr_tx_lock);
265 flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
270 if (radix_tree_insert(&node->qrtr_tx_flow, key, flow)) {
276 mutex_unlock(&node->qrtr_tx_lock);
286 !node->ep);
289 } else if (!node->ep) {
305 * @node: qrtr_node that the packet is to be send to
306 * @dest_node: node id of the destination
316 static void qrtr_tx_flow_failed(struct qrtr_node *node, int dest_node,
323 flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
333 static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb,
341 confirm_rx = qrtr_tx_wait(node, to->sq_node, to->sq_port, type);
353 hdr->dst_node_id = cpu_to_le32(node->nid);
366 mutex_lock(&node->ep_lock);
368 if (node->ep)
369 rc = node->ep->xmit(node->ep, skb);
372 mutex_unlock(&node->ep_lock);
377 qrtr_tx_flow_failed(node, to->sq_node, to->sq_port);
382 /* Lookup node by id.
388 struct qrtr_node *node;
393 node = radix_tree_lookup(&qrtr_nodes, nid);
394 node = qrtr_node_acquire(node);
398 return node;
401 /* Assign node id to node.
403 * This is mostly useful for automatic node id assignment, based on
406 static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid)
410 if (node->nid != QRTR_EP_NID_AUTO || nid == QRTR_EP_NID_AUTO)
414 radix_tree_insert(&qrtr_nodes, nid, node);
415 node->nid = nid;
429 struct qrtr_node *node = ep->node;
506 qrtr_node_assign(node, cb->src_node);
509 /* Remote node endpoint can bridge other distant nodes */
513 qrtr_node_assign(node, le32_to_cpu(pkt->server.node));
517 qrtr_tx_resume(node, skb);
567 * @nid: desired node id; may be QRTR_EP_NID_AUTO for auto-assignment
574 struct qrtr_node *node;
579 node = kzalloc(sizeof(*node), GFP_KERNEL);
580 if (!node)
583 kref_init(&node->ref);
584 mutex_init(&node->ep_lock);
585 skb_queue_head_init(&node->rx_queue);
586 node->nid = QRTR_EP_NID_AUTO;
587 node->ep = ep;
589 INIT_RADIX_TREE(&node->qrtr_tx_flow, GFP_KERNEL);
590 mutex_init(&node->qrtr_tx_lock);
592 qrtr_node_assign(node, nid);
595 list_add(&node->item, &qrtr_all_nodes);
597 ep->node = node;
609 struct qrtr_node *node = ep->node;
610 struct sockaddr_qrtr src = {AF_QIPCRTR, node->nid, QRTR_PORT_CTRL};
618 mutex_lock(&node->ep_lock);
619 node->ep = NULL;
620 mutex_unlock(&node->ep_lock);
629 /* Wake up any transmitters waiting for resume-tx from the node */
630 mutex_lock(&node->qrtr_tx_lock);
631 radix_tree_for_each_slot(slot, &node->qrtr_tx_flow, &iter, 0) {
635 mutex_unlock(&node->qrtr_tx_lock);
637 qrtr_node_release(node);
638 ep->node = NULL;
683 pkt->client.node = cpu_to_le32(ipc->us.sq_node);
827 static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
858 static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
865 list_for_each_entry(node, &qrtr_all_nodes, item) {
870 qrtr_node_enqueue(node, skbn, type, from, to);
887 struct qrtr_node *node;
924 node = NULL;
935 node = qrtr_node_lookup(addr->sq_node);
936 if (!node) {
971 rc = enqueue_fn(node, skb, type, &ipc->us, addr);
976 qrtr_node_release(node);
987 struct qrtr_node *node;
991 node = qrtr_node_lookup(remote.sq_node);
992 if (!node)
1000 pkt->client.node = cpu_to_le32(cb->dst_node);
1003 ret = qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX, &local, &remote);
1005 qrtr_node_release(node);