|
@@ -47,6 +47,7 @@ static void merge_and_restore_back_links(void *priv,
|
|
|
struct list_head *a, struct list_head *b)
|
|
|
{
|
|
|
struct list_head *tail = head;
|
|
|
+ u8 count = 0;
|
|
|
|
|
|
while (a && b) {
|
|
|
/* if equal, take 'a' -- important for sort stability */
|
|
@@ -70,7 +71,8 @@ static void merge_and_restore_back_links(void *priv,
|
|
|
* element comparison is needed, so the client's cmp()
|
|
|
* routine can invoke cond_resched() periodically.
|
|
|
*/
|
|
|
- (*cmp)(priv, tail->next, tail->next);
|
|
|
+ if (unlikely(!(++count)))
|
|
|
+ (*cmp)(priv, tail->next, tail->next);
|
|
|
|
|
|
tail->next->prev = tail;
|
|
|
tail = tail->next;
|