summaryrefslogtreecommitdiffstats
path: root/include/linux/sort.h
diff options
context:
space:
mode:
authorRasmus Villemoes <linux@rasmusvillemoes.dk>2019-08-16 13:01:22 -0300
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>2019-08-19 13:14:53 -0300
commit4333fb96ca1086d1cec0f93f78c453aa2dee8a5c (patch)
tree35d091d349c42e60a719f5f339653a6e50a328c1 /include/linux/sort.h
parent4843a543fad3bf8221cf14e5d5f32d15cee89e84 (diff)
downloadlinux-4333fb96ca1086d1cec0f93f78c453aa2dee8a5c.tar.gz
linux-4333fb96ca1086d1cec0f93f78c453aa2dee8a5c.tar.bz2
linux-4333fb96ca1086d1cec0f93f78c453aa2dee8a5c.zip
media: lib/sort.c: implement sort() variant taking context argument
Our list_sort() utility has always supported a context argument that is passed through to the comparison routine. Now there's a use case for the similar thing for sort(). This implements sort_r by simply extending the existing sort function in the obvious way. To avoid code duplication, we want to implement sort() in terms of sort_r(). The naive way to do that is static int cmp_wrapper(const void *a, const void *b, const void *ctx) { int (*real_cmp)(const void*, const void*) = ctx; return real_cmp(a, b); } sort(..., cmp) { sort_r(..., cmp_wrapper, cmp) } but this would do two indirect calls for each comparison. Instead, do as is done for the default swap functions - that only adds a cost of a single easily predicted branch to each comparison call. Aside from introducing support for the context argument, this also serves as preparation for patches that will eliminate the indirect comparison calls in common cases. Requested-by: Boris Brezillon <boris.brezillon@collabora.com> Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Acked-by: Andrew Morton <akpm@linux-foundation.org> Tested-by: Philipp Zabel <p.zabel@pengutronix.de> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Diffstat (limited to 'include/linux/sort.h')
-rw-r--r--include/linux/sort.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/include/linux/sort.h b/include/linux/sort.h
index 2b99a5dd073d..61b96d0ebc44 100644
--- a/include/linux/sort.h
+++ b/include/linux/sort.h
@@ -4,6 +4,11 @@
#include <linux/types.h>
+void sort_r(void *base, size_t num, size_t size,
+ int (*cmp)(const void *, const void *, const void *),
+ void (*swap)(void *, void *, int),
+ const void *priv);
+
void sort(void *base, size_t num, size_t size,
int (*cmp)(const void *, const void *),
void (*swap)(void *, void *, int));