aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2012-09-17 22:25:34 -0700
committerYinghai Lu <yinghai@kernel.org>2012-09-17 22:25:34 -0700
commitf4f613dbfa3bda174816a6a6ff0e7442bee105ea (patch)
tree150f66e41d2fbff4dd511f8bf2acbb78486fbe41
parentd798967c7aeed6707d70125a6f80c2c82f77a66b (diff)
downloadlinux-yinghai-f4f613dbfa3bda174816a6a6ff0e7442bee105ea.tar.gz
resource: Only return range with needed align
Compare align between put range in head and tail, pick small one to leave big one for future user. Signed-off-by: Yinghai Lu <yinghai@kernel.org>
-rw-r--r--kernel/resource.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/kernel/resource.c b/kernel/resource.c
index ef467ed80e251..9084e34c837a1 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -509,8 +509,20 @@ out:
}
if (!ret) {
- new->start = avail_start;
+ /* compare which one have max order */
+ new->start = round_down(avail_start + avail_size - size,
+ constraint->align);
+ new->end = avail_start + avail_size - 1;
+ new->start = constraint->alignf(constraint->alignf_data, new,
+ size, constraint->align);
new->end = new->start + size - 1;
+
+ if (new->start < avail_start ||
+ new->end > (avail_start + avail_size - 1) ||
+ __ffs64(new->start) >= __ffs64(avail_start)) {
+ new->start = avail_start;
+ new->end = new->start + size - 1;
+ }
}
return ret;
}