Commit f37e2868 authored by Li RongQing's avatar Li RongQing Committed by Leon Romanovsky
Browse files

RDMA/core: Reduce cond_resched() frequency in __ib_umem_release



The current implementation calls cond_resched() for every SG entry
in __ib_umem_release(), which can increase needless overhead.

This patch introduces RESCHED_LOOP_CNT_THRESHOLD (0x1000) to limit
how often cond_resched() is called. The function now yields the CPU
once every 4096 iterations, and yield at the very first iteration
for lots of small umem case, to reduce scheduling overhead.

Fixes: d056bc45 ("RDMA/core: Prevent soft lockup during large user memory region cleanup")
Signed-off-by: default avatarLi RongQing <lirongqing@baidu.com>
Link: https://patch.msgid.link/20251126025147.2627-1-lirongqing@baidu.com


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent 01dad9ca
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -45,6 +45,8 @@

#include "uverbs.h"

#define RESCHED_LOOP_CNT_THRESHOLD 0x1000

static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dirty)
{
	bool make_dirty = umem->writable && dirty;
@@ -58,6 +60,8 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int d
	for_each_sgtable_sg(&umem->sgt_append.sgt, sg, i) {
		unpin_user_page_range_dirty_lock(sg_page(sg),
			DIV_ROUND_UP(sg->length, PAGE_SIZE), make_dirty);

		if (i && !(i % RESCHED_LOOP_CNT_THRESHOLD))
			cond_resched();
	}