[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20241018181842.1368394-4-denkenz@gmail.com>
Date: Fri, 18 Oct 2024 13:18:21 -0500
From: Denis Kenzior <denkenz@...il.com>
To: netdev@...r.kernel.org
Cc: denkenz@...il.com,
Marcel Holtmann <marcel@...tmann.org>,
Andy Gross <agross@...nel.org>,
Manivannan Sadhasivam <manivannan.sadhasivam@...aro.org>,
"David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>,
linux-arm-msm@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: [RFC PATCH v1 03/10] net: qrtr: support identical node ids
Add support for tracking multiple endpoints that may have conflicting
node identifiers. This is achieved by using both the node and endpoint
identifiers as the key inside the radix_tree data structure.
For backward compatibility with existing clients, the previous key
schema (node identifier only) is preserved. However, this schema will
only support the first endpoint/node combination. This is acceptable
for legacy clients as support for multiple endpoints with conflicting
node identifiers was not previously possible.
Signed-off-by: Denis Kenzior <denkenz@...il.com>
Reviewed-by: Marcel Holtmann <marcel@...tmann.org>
Reviewed-by: Andy Gross <agross@...nel.org>
---
net/qrtr/af_qrtr.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c
index be275871fb2a..e83d491a8da9 100644
--- a/net/qrtr/af_qrtr.c
+++ b/net/qrtr/af_qrtr.c
@@ -418,12 +418,20 @@ static struct qrtr_node *qrtr_node_lookup(unsigned int nid)
static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid)
{
unsigned long flags;
+ unsigned long key;
if (nid == QRTR_EP_NID_AUTO)
return;
spin_lock_irqsave(&qrtr_nodes_lock, flags);
- radix_tree_insert(&qrtr_nodes, nid, node);
+
+ /* Always insert with the endpoint_id + node_id */
+ key = (unsigned long)node->ep->id << 32 | nid;
+ radix_tree_insert(&qrtr_nodes, key, node);
+
+ if (!radix_tree_lookup(&qrtr_nodes, nid))
+ radix_tree_insert(&qrtr_nodes, nid, node);
+
if (node->nid == QRTR_EP_NID_AUTO)
node->nid = nid;
spin_unlock_irqrestore(&qrtr_nodes_lock, flags);
--
2.45.2
Powered by blists - more mailing lists