summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@arm.linux.org.uk>2016-06-06 17:59:39 +0100
committerSimon Horman <horms@verge.net.au>2016-06-08 09:21:52 +0900
commit7dc06a544ffd192634d624af163791dca791e845 (patch)
treec81d542f80763a170926d22c75c8f723d496ae76
parentba1e37a8ede8d7d981c677ef7273e01aec88da7f (diff)
kexec: add mem_regions sorting implementation
Add a mem_regions sorting implementation taken from the arm code. Reviewed-by: Pratyush Anand <panand@redhat.com> Signed-off-by: Russell King <rmk@arm.linux.org.uk> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--kexec/mem_regions.c27
-rw-r--r--kexec/mem_regions.h2
2 files changed, 29 insertions, 0 deletions
diff --git a/kexec/mem_regions.c b/kexec/mem_regions.c
index 4425b86..7b4bcf3 100644
--- a/kexec/mem_regions.c
+++ b/kexec/mem_regions.c
@@ -1,6 +1,33 @@
+#include <stdlib.h>
+
#include "kexec.h"
#include "mem_regions.h"
+static int mem_range_cmp(const void *a1, const void *a2)
+{
+ const struct memory_range *r1 = a1;
+ const struct memory_range *r2 = a2;
+
+ if (r1->start > r2->start)
+ return 1;
+ if (r1->start < r2->start)
+ return -1;
+
+ return 0;
+}
+
+/**
+ * mem_regions_sort() - sort ranges into ascending address order
+ * @ranges: ranges to sort
+ *
+ * Sort the memory regions into ascending address order.
+ */
+void mem_regions_sort(struct memory_ranges *ranges)
+{
+ qsort(ranges->ranges, ranges->size, sizeof(ranges->ranges),
+ mem_range_cmp);
+}
+
/**
* mem_regions_add() - add a memory region to a set of ranges
* @ranges: ranges to add the memory region to
diff --git a/kexec/mem_regions.h b/kexec/mem_regions.h
index b9cfba1..da7b5e8 100644
--- a/kexec/mem_regions.h
+++ b/kexec/mem_regions.h
@@ -3,6 +3,8 @@
struct memory_ranges;
+void mem_regions_sort(struct memory_ranges *ranges);
+
int mem_regions_add(struct memory_ranges *ranges, unsigned long long base,
unsigned long long length, int type);