Skip to content

Commit 2372137

Browse files
visitorckwakpm00
authored andcommitted
ubifs: remove unnecessary cond_resched() from list_sort() compare
Patch series "lib/list_sort: Clean up list_sort() scheduling workarounds", v3. Historically, list_sort() included a hack in merge_final() that periodically invoked dummy cmp(priv, b, b) calls when merging highly unbalanced lists. This allowed the caller to invoke cond_resched() within their comparison callbacks to avoid soft lockups. However, an audit of the kernel tree shows that fs/ubifs/ has been the sole user of this mechanism. For all other generic list_sort() users, this results in wasted function calls and unnecessary overhead in a tight loop. Recent discussions and code inspection confirmed that the lists being sorted in UBIFS are bounded in size (a few thousand elements at most), and the comparison functions are extremely lightweight. Therefore, UBIFS does not actually need to rely on this mechanism. This patch (of 2): Historically, UBIFS embedded cond_resched() calls inside its list_sort() comparison callbacks (data_nodes_cmp, nondata_nodes_cmp, and replay_entries_cmp) to prevent soft lockups when sorting long lists. However, further inspection by Richard Weinberger reveals that these compare functions are extremely lightweight and do not perform any blocking MTD I/O. Furthermore, the lists being sorted are strictly bounded in size: - In the GC case, the list contains at most the number of nodes that fit into a single LEB. - In the replay case, the list spans across a few LEBs from the UBIFS journal, amounting to at most a few thousand elements. Since the compare functions are called a few thousand times at most, the overhead of frequent scheduling points is unjustified. Removing the cond_resched() calls simplifies the comparison logic and reduces unnecessary context switch checks during the sort. Link: https://lkml.kernel.org/r/20260320180938.1827148-1-visitorckw@gmail.com Link: https://lkml.kernel.org/r/20260320180938.1827148-2-visitorckw@gmail.com Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com> Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com> Acked-by: Richard Weinberger <richard@nod.at> Cc: Ching-Chun (Jim) Huang <jserv@ccns.ncku.edu.tw> Cc: Christoph Hellwig <hch@infradead.org> Cc: Mars Cheng <marscheng@google.com> Cc: Yu-Chun Lin <eleanor15x@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent af53e85 commit 2372137

2 files changed

Lines changed: 0 additions & 3 deletions

File tree

fs/ubifs/gc.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ static int data_nodes_cmp(void *priv, const struct list_head *a,
109109
struct ubifs_info *c = priv;
110110
struct ubifs_scan_node *sa, *sb;
111111

112-
cond_resched();
113112
if (a == b)
114113
return 0;
115114

@@ -153,7 +152,6 @@ static int nondata_nodes_cmp(void *priv, const struct list_head *a,
153152
struct ubifs_info *c = priv;
154153
struct ubifs_scan_node *sa, *sb;
155154

156-
cond_resched();
157155
if (a == b)
158156
return 0;
159157

fs/ubifs/replay.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,6 @@ static int replay_entries_cmp(void *priv, const struct list_head *a,
305305
struct ubifs_info *c = priv;
306306
struct replay_entry *ra, *rb;
307307

308-
cond_resched();
309308
if (a == b)
310309
return 0;
311310

0 commit comments

Comments
 (0)