On Fri, Oct 18, 2024 at 01:18:21PM -0500, Denis Kenzior wrote: > 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@xxxxxxxxx> > Reviewed-by: Marcel Holtmann <marcel@xxxxxxxxxxxx> > Reviewed-by: Andy Gross <agross@xxxxxxxxxx> > --- > 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; Hi Denis, On systems with 32-bit longs, such as ARM, this will overflow. > + 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 > >