[PATCH 4/8] Move out mem_min/max checking in locate_hole

Yinghai Lu
2012-11-16T23:04:44Z

only need to check one time out of the loop.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
kexec/kexec.c | 27 +++++++++++++++++----------
1 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/kexec/kexec.c b/kexec/kexec.c
index 00f90f5..b8d77bb 100644
--- a/kexec/kexec.c
+++ b/kexec/kexec.c
@@ -190,9 +190,9 @@ int sort_segments(struct kexec_info *info)
return 0;
}

-unsigned long locate_hole(struct kexec_info *info,
- unsigned long hole_size, unsigned long hole_align,
- unsigned long hole_min, unsigned long hole_max,
+static unsigned long __locate_hole(struct kexec_info *info,
+ unsigned long hole_size, unsigned long hole_align,
+ unsigned long hole_min, unsigned long hole_max,
int hole_end)
{
int i, j;
@@ -253,22 +253,16 @@ unsigned long locate_hole(struct kexec_info *info,
/* First filter the range start and end values
* through the lens of mem_min, mem_max and hole_align.
*/
- if (start < mem_min) {
- start = mem_min;
- }
if (start < hole_min) {
start = hole_min;
}
start = (start + hole_align - 1) &
~((unsigned long long)hole_align - 1);
- if (end > mem_max) {
- end = mem_max;
- }
if (end > hole_max) {
end = hole_max;
}
/* Is this still a valid memory range? */
- if ((start >= end) || (start >= mem_max) || (end <= mem_min)) {
+ if (start >= end) {
continue;
}
/* Is there enough space left so we can use it? */
@@ -297,6 +291,19 @@ unsigned long locate_hole(struct kexec_info *info,
return hole_base;
}

+unsigned long locate_hole(struct kexec_info *info,
+ unsigned long hole_size, unsigned long hole_align,
+ unsigned long hole_min, unsigned long hole_max,
+ int hole_end)
+{
+ hole_min = max(hole_min, (unsigned long)mem_min);
+ hole_max = min(hole_max, (unsigned long)mem_max);
+
+ return __locate_hole(info, hole_size, hole_align,
+ hole_min, hole_max, hole_end);
+
+}
+
void add_segment_phys_virt(struct kexec_info *info,
const void *buf, size_t bufsz,
unsigned long base, size_t memsz, int phys)
--
1.7.7