X-Git-Url: http://git.monstr.eu/?a=blobdiff_plain;f=kernel%2Fresource.c;h=26e9f25469231803d6e00f3d7e397b0ffcb51a89;hb=5d6b1fa301b13cc651ee717a9b518124dea2f814;hp=7b36976e5dea84d11b73fcd5d4ae8963ce4c9aa7;hpb=4f4aeb7fd0f7e6ca008bb2147ba36cee13876595;p=linux-2.6-microblaze.git diff --git a/kernel/resource.c b/kernel/resource.c index 7b36976e5dea..26e9f2546923 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -357,6 +357,23 @@ int __weak page_is_ram(unsigned long pfn) return walk_system_ram_range(pfn, 1, NULL, __is_ram) == 1; } +static resource_size_t simple_align_resource(void *data, + const struct resource *avail, + resource_size_t size, + resource_size_t align) +{ + return avail->start; +} + +static void resource_clip(struct resource *res, resource_size_t min, + resource_size_t max) +{ + if (res->start < min) + res->start = min; + if (res->end > max) + res->end = max; +} + /* * Find empty slot in the resource tree given range and alignment. */ @@ -386,13 +403,11 @@ static int find_resource(struct resource *root, struct resource *new, tmp.end = this->start - 1; else tmp.end = root->end; - if (tmp.start < min) - tmp.start = min; - if (tmp.end > max) - tmp.end = max; + + resource_clip(&tmp, min, max); tmp.start = ALIGN(tmp.start, align); - if (alignf) - tmp.start = alignf(alignf_data, &tmp, size, align); + + tmp.start = alignf(alignf_data, &tmp, size, align); if (tmp.start < tmp.end && tmp.end - tmp.start >= size - 1) { new->start = tmp.start; new->end = tmp.start + size - 1; @@ -428,6 +443,9 @@ int allocate_resource(struct resource *root, struct resource *new, { int err; + if (!alignf) + alignf = simple_align_resource; + write_lock(&resource_lock); err = find_resource(root, new, size, min, max, align, alignf, alignf_data); if (err >= 0 && __request_resource(root, new))