Loading net/qrtr/qrtr.c +18 −9 Original line number Diff line number Diff line Loading @@ -106,8 +106,8 @@ static unsigned int qrtr_local_nid = -1; /* for node ids */ static RADIX_TREE(qrtr_nodes, GFP_KERNEL); /* broadcast list */ static LIST_HEAD(qrtr_all_nodes); /* lock for qrtr_nodes, qrtr_all_nodes and node reference */ static LIST_HEAD(qrtr_all_epts); /* lock for qrtr_nodes, qrtr_all_epts and node reference */ static DEFINE_MUTEX(qrtr_node_lock); /* local port allocation management */ Loading Loading @@ -150,9 +150,15 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb, static void __qrtr_node_release(struct kref *kref) { struct qrtr_node *node = container_of(kref, struct qrtr_node, ref); struct radix_tree_iter iter; void **slot; if (node->nid != QRTR_EP_NID_AUTO) radix_tree_delete(&qrtr_nodes, node->nid); if (node->nid != QRTR_EP_NID_AUTO) { radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) { if (node == *slot) radix_tree_delete(&qrtr_nodes, iter.index); } } list_del(&node->item); mutex_unlock(&qrtr_node_lock); Loading Loading @@ -232,11 +238,14 @@ static struct qrtr_node *qrtr_node_lookup(unsigned int nid) */ static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid) { if (node->nid != QRTR_EP_NID_AUTO || nid == QRTR_EP_NID_AUTO) if (nid == QRTR_EP_NID_AUTO) return; mutex_lock(&qrtr_node_lock); if (!radix_tree_lookup(&qrtr_nodes, nid)) radix_tree_insert(&qrtr_nodes, nid, node); if (node->nid == QRTR_EP_NID_AUTO) node->nid = nid; mutex_unlock(&qrtr_node_lock); } Loading Loading @@ -437,7 +446,7 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid) qrtr_node_assign(node, nid); mutex_lock(&qrtr_node_lock); list_add(&node->item, &qrtr_all_nodes); list_add(&node->item, &qrtr_all_epts); mutex_unlock(&qrtr_node_lock); ep->node = node; Loading Loading @@ -703,7 +712,7 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb, struct sk_buff *skbn; mutex_lock(&qrtr_node_lock); list_for_each_entry(node, &qrtr_all_nodes, item) { list_for_each_entry(node, &qrtr_all_epts, item) { skbn = skb_clone(skb, GFP_KERNEL); if (!skbn) break; Loading Loading
net/qrtr/qrtr.c +18 −9 Original line number Diff line number Diff line Loading @@ -106,8 +106,8 @@ static unsigned int qrtr_local_nid = -1; /* for node ids */ static RADIX_TREE(qrtr_nodes, GFP_KERNEL); /* broadcast list */ static LIST_HEAD(qrtr_all_nodes); /* lock for qrtr_nodes, qrtr_all_nodes and node reference */ static LIST_HEAD(qrtr_all_epts); /* lock for qrtr_nodes, qrtr_all_epts and node reference */ static DEFINE_MUTEX(qrtr_node_lock); /* local port allocation management */ Loading Loading @@ -150,9 +150,15 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb, static void __qrtr_node_release(struct kref *kref) { struct qrtr_node *node = container_of(kref, struct qrtr_node, ref); struct radix_tree_iter iter; void **slot; if (node->nid != QRTR_EP_NID_AUTO) radix_tree_delete(&qrtr_nodes, node->nid); if (node->nid != QRTR_EP_NID_AUTO) { radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) { if (node == *slot) radix_tree_delete(&qrtr_nodes, iter.index); } } list_del(&node->item); mutex_unlock(&qrtr_node_lock); Loading Loading @@ -232,11 +238,14 @@ static struct qrtr_node *qrtr_node_lookup(unsigned int nid) */ static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid) { if (node->nid != QRTR_EP_NID_AUTO || nid == QRTR_EP_NID_AUTO) if (nid == QRTR_EP_NID_AUTO) return; mutex_lock(&qrtr_node_lock); if (!radix_tree_lookup(&qrtr_nodes, nid)) radix_tree_insert(&qrtr_nodes, nid, node); if (node->nid == QRTR_EP_NID_AUTO) node->nid = nid; mutex_unlock(&qrtr_node_lock); } Loading Loading @@ -437,7 +446,7 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid) qrtr_node_assign(node, nid); mutex_lock(&qrtr_node_lock); list_add(&node->item, &qrtr_all_nodes); list_add(&node->item, &qrtr_all_epts); mutex_unlock(&qrtr_node_lock); ep->node = node; Loading Loading @@ -703,7 +712,7 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb, struct sk_buff *skbn; mutex_lock(&qrtr_node_lock); list_for_each_entry(node, &qrtr_all_nodes, item) { list_for_each_entry(node, &qrtr_all_epts, item) { skbn = skb_clone(skb, GFP_KERNEL); if (!skbn) break; Loading