From 822ff8ce4c28df4eb55df984a546b88cb4fcd0e7 Mon Sep 17 00:00:00 2001 From: Deepak Kumar Singh Date: Tue, 24 Nov 2020 23:44:24 +0530 Subject: [PATCH] net: qrtr: Use cyclic idr allocator for port assignment Use cyclic id allocator to avoid immediate reassignment of same port id. Assigning incremental port id gives more clarity over ports assignment and makes it easy to debug problem in certain scenario. Change-Id: Ib432ff641f4c81ba33ff0176cb67f1cdf4b3b1f9 Signed-off-by: Deepak Kumar Singh --- net/qrtr/qrtr.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index eca3c5ec84bf..d5f77efbd149 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -1381,27 +1381,25 @@ static void qrtr_port_remove(struct qrtr_sock *ipc) */ static int qrtr_port_assign(struct qrtr_sock *ipc, int *port) { - u32 min_port; int rc; if (!*port) { - min_port = QRTR_MIN_EPH_SOCKET; - rc = idr_alloc_u32(&qrtr_ports, ipc, &min_port, QRTR_MAX_EPH_SOCKET, GFP_ATOMIC); - if (!rc) - *port = min_port; + rc = idr_alloc_cyclic(&qrtr_ports, ipc, QRTR_MIN_EPH_SOCKET, + QRTR_MAX_EPH_SOCKET + 1, GFP_ATOMIC); + if (rc >= 0) + *port = rc; } else if (*port < QRTR_MIN_EPH_SOCKET && - !(capable(CAP_NET_ADMIN) || - in_egroup_p(AID_VENDOR_QRTR) || - in_egroup_p(GLOBAL_ROOT_GID))) { + !(capable(CAP_NET_ADMIN) || + in_egroup_p(AID_VENDOR_QRTR) || + in_egroup_p(GLOBAL_ROOT_GID))) { rc = -EACCES; } else if (*port == QRTR_PORT_CTRL) { - min_port = 0; - rc = idr_alloc_u32(&qrtr_ports, ipc, &min_port, 0, GFP_ATOMIC); + rc = idr_alloc(&qrtr_ports, ipc, 0, 1, GFP_ATOMIC); } else { - min_port = *port; - rc = idr_alloc_u32(&qrtr_ports, ipc, &min_port, *port, GFP_ATOMIC); - if (!rc) - *port = min_port; + rc = idr_alloc_cyclic(&qrtr_ports, ipc, *port, *port + 1, + GFP_ATOMIC); + if (rc >= 0) + *port = rc; } if (rc == -ENOSPC)