only need to check one time out of the loop.

Signed-off-by: Yinghai Lu <[email protected]>
---
 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


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to