Skip to content

Commit c51a22e

Browse files
Sagi Grimbergkeithbusch
Sagi Grimberg
authored andcommitted
nvmet-rdma: Avoid o(n^2) loop in delete_ctrl
When deleting a nvmet-rdma ctrl, we essentially loop over all queues that belong to the controller and schedule a removal of each. Instead of restarting the loop every time a queue is found, do a simple safe list traversal. This addresses an unneeded time spent scheduling queue removal in cases there a lot of queues. Signed-off-by: Sagi Grimberg <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Keith Busch <[email protected]>
1 parent 0e34bd9 commit c51a22e

File tree

1 file changed

+6
-10
lines changed

1 file changed

+6
-10
lines changed

drivers/nvme/target/rdma.c

+6-10
Original file line numberDiff line numberDiff line change
@@ -1814,18 +1814,14 @@ static int nvmet_rdma_cm_handler(struct rdma_cm_id *cm_id,
18141814

18151815
static void nvmet_rdma_delete_ctrl(struct nvmet_ctrl *ctrl)
18161816
{
1817-
struct nvmet_rdma_queue *queue;
1817+
struct nvmet_rdma_queue *queue, *n;
18181818

1819-
restart:
18201819
mutex_lock(&nvmet_rdma_queue_mutex);
1821-
list_for_each_entry(queue, &nvmet_rdma_queue_list, queue_list) {
1822-
if (queue->nvme_sq.ctrl == ctrl) {
1823-
list_del_init(&queue->queue_list);
1824-
mutex_unlock(&nvmet_rdma_queue_mutex);
1825-
1826-
__nvmet_rdma_queue_disconnect(queue);
1827-
goto restart;
1828-
}
1820+
list_for_each_entry_safe(queue, n, &nvmet_rdma_queue_list, queue_list) {
1821+
if (queue->nvme_sq.ctrl != ctrl)
1822+
continue;
1823+
list_del_init(&queue->queue_list);
1824+
__nvmet_rdma_queue_disconnect(queue);
18291825
}
18301826
mutex_unlock(&nvmet_rdma_queue_mutex);
18311827
}

0 commit comments

Comments
 (0)