diff options
author | Yinghai Lu <yinghai@kernel.org> | 2012-09-17 22:25:34 -0700 |
---|---|---|
committer | Yinghai Lu <yinghai@kernel.org> | 2012-09-17 22:25:34 -0700 |
commit | f4f613dbfa3bda174816a6a6ff0e7442bee105ea (patch) | |
tree | 150f66e41d2fbff4dd511f8bf2acbb78486fbe41 | |
parent | d798967c7aeed6707d70125a6f80c2c82f77a66b (diff) | |
download | linux-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.c | 14 |
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; } |