Commit 61b3d6c4 authored by Rasmus Villemoes's avatar Rasmus Villemoes Committed by Linus Torvalds

lib: list_sort.c: Limit number of unused cmp callbacks

The helper merge_and_restore_back_links() makes sure to call the
caller's cmp function during the final ->prev pointer fixup, so that the
cmp function may call cond_resched().  However, if the cmp function does
not call cond_resched() at all, this is entirely redundant.  If it does,
doing at least two function calls for every two pointer assignments is a
bit excessive.  This patch limits the calls to once for every 256
iterations.
Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Cc: Don Mullis <don.mullis@gmail.com>
Cc: Dave Chinner <david@fromorbit.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 69412303
...@@ -47,6 +47,7 @@ static void merge_and_restore_back_links(void *priv, ...@@ -47,6 +47,7 @@ static void merge_and_restore_back_links(void *priv,
struct list_head *a, struct list_head *b) struct list_head *a, struct list_head *b)
{ {
struct list_head *tail = head; struct list_head *tail = head;
u8 count = 0;
while (a && b) { while (a && b) {
/* if equal, take 'a' -- important for sort stability */ /* if equal, take 'a' -- important for sort stability */
...@@ -70,6 +71,7 @@ static void merge_and_restore_back_links(void *priv, ...@@ -70,6 +71,7 @@ static void merge_and_restore_back_links(void *priv,
* element comparison is needed, so the client's cmp() * element comparison is needed, so the client's cmp()
* routine can invoke cond_resched() periodically. * routine can invoke cond_resched() periodically.
*/ */
if (unlikely(!(++count)))
(*cmp)(priv, tail->next, tail->next); (*cmp)(priv, tail->next, tail->next);
tail->next->prev = tail; tail->next->prev = tail;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment