diff options
author | AKASHI Takahiro <takahiro.akashi@linaro.org> | 2019-12-18 11:42:30 -0500 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2020-01-03 09:34:30 +0100 |
commit | cf977b1af9ec67fabcc6a625589c49c52d07b11d (patch) | |
tree | 11e8eaf1edebb001dd557933ffbed70483d0a055 | |
parent | bd077966e2b9041c24df5b689e67670f02be7b0d (diff) |
kexec: add variant helper functions for handling memory regions
mem_regions_alloc_and_add() and mem_regions_alloc_and_exclude() are
functionally equivalent to, respectively, mem_regions_add() and
mem_regions_exclude() except the formers will re-allocate memory
dynamically when no more entries are available in 'ranges' array.
Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Tested-by: Bhupesh Sharma <bhsharma@redhat.com>
Tested-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r-- | kexec/mem_regions.c | 42 | ||||
-rw-r--r-- | kexec/mem_regions.h | 7 |
2 files changed, 49 insertions, 0 deletions
diff --git a/kexec/mem_regions.c b/kexec/mem_regions.c index 50c8abc..ad7d3f1 100644 --- a/kexec/mem_regions.c +++ b/kexec/mem_regions.c @@ -125,3 +125,45 @@ int mem_regions_exclude(struct memory_ranges *ranges, } return 0; } + +#define KEXEC_MEMORY_RANGES 16 + +int mem_regions_alloc_and_add(struct memory_ranges *ranges, + unsigned long long base, + unsigned long long length, int type) +{ + void *new_ranges; + + if (ranges->size >= ranges->max_size) { + new_ranges = realloc(ranges->ranges, + sizeof(struct memory_range) * + (ranges->max_size + KEXEC_MEMORY_RANGES)); + if (!new_ranges) + return -1; + + ranges->ranges = new_ranges; + ranges->max_size += KEXEC_MEMORY_RANGES; + } + + return mem_regions_add(ranges, base, length, type); +} + +int mem_regions_alloc_and_exclude(struct memory_ranges *ranges, + const struct memory_range *range) +{ + void *new_ranges; + + /* for safety, we should have at least one free entry in ranges */ + if (ranges->size >= ranges->max_size) { + new_ranges = realloc(ranges->ranges, + sizeof(struct memory_range) * + (ranges->max_size + KEXEC_MEMORY_RANGES)); + if (!new_ranges) + return -1; + + ranges->ranges = new_ranges; + ranges->max_size += KEXEC_MEMORY_RANGES; + } + + return mem_regions_exclude(ranges, range); +} diff --git a/kexec/mem_regions.h b/kexec/mem_regions.h index ae9e972..e306d67 100644 --- a/kexec/mem_regions.h +++ b/kexec/mem_regions.h @@ -12,4 +12,11 @@ int mem_regions_exclude(struct memory_ranges *ranges, int mem_regions_add(struct memory_ranges *ranges, unsigned long long base, unsigned long long length, int type); +int mem_regions_alloc_and_exclude(struct memory_ranges *ranges, + const struct memory_range *range); + +int mem_regions_alloc_and_add(struct memory_ranges *ranges, + unsigned long long base, + unsigned long long length, int type); + #endif |