Message ID | 20241018181842.1368394-4-denkenz@gmail.com (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | QRTR Multi-endpoint support | expand |
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@gmail.com> > Reviewed-by: Marcel Holtmann <marcel@holtmann.org> > Reviewed-by: Andy Gross <agross@kernel.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; 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 > >
Hi Simon, > > On systems with 32-bit longs, such as ARM, this will overflow. Indeed. I mentioned this in the cover letter. Regards, -Denis
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);