summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAKASHI Takahiro <takahiro.akashi@linaro.org>2017-05-17 14:51:41 +0900
committerSimon Horman <horms@verge.net.au>2017-05-22 13:31:07 +0200
commitc95df0e099b14757de483245d7b1b45e2d6e2c91 (patch)
tree8b3ba1c87de84a7f8781345295f367e0a07c6e61
parent59d3e5b5ad6f0f33a9801bb69559d28efc62b4ce (diff)
kexec: extend the semantics of kexec_iomem_for_each_line
The current kexec_iomem_for_each_line() counts up all the lines for which a callback function returns zero(0) or positive, and otherwise it stops further scanning. This behavior is inconvenient in some cases. For instance, on arm64, we want to count up "System RAM" entries, but need to skip "reserved" entries. So this patch extends the semantics so that we will continue to scan succeeding entries but not count lines for which a callback function returns positive. The current users of kexec_iomem_for_each_line(), arm, sh and x86, will not be affected by this change because * arm The callback function only returns -1 or 0, and the return value of kexec_iomem_for_each_line() will never be used. * sh, x86 The callback function may return (-1 for sh,) 0 or 1, but always returns 1 once we have reached the maximum number of entries allowed. Even so the current kexec_iomem_for_each_line() counts them up. This change actually fixes this bug. Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> Tested-by: David Woodhouse <dwmw@amazon.co.uk> Tested-by: Pratyush Anand <panand@redhat.com> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--kexec/kexec-iomem.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/kexec/kexec-iomem.c b/kexec/kexec-iomem.c
index 7ec3853..b5b52b1 100644
--- a/kexec/kexec-iomem.c
+++ b/kexec/kexec-iomem.c
@@ -18,6 +18,9 @@
* Iterate over each line in the file returned by proc_iomem(). If match is
* NULL or if the line matches with our match-pattern then call the
* callback if non-NULL.
+ * If match is NULL, callback should return a negative if error.
+ * Otherwise the interation goes on, incrementing nr but only if callback
+ * returns 0 (matched).
*
* Return the number of lines matched.
*/
@@ -37,7 +40,7 @@ int kexec_iomem_for_each_line(char *match,
char *str;
int consumed;
int count;
- int nr = 0;
+ int nr = 0, ret;
fp = fopen(iomem, "r");
if (!fp)
@@ -50,11 +53,13 @@ int kexec_iomem_for_each_line(char *match,
str = line + consumed;
size = end - start + 1;
if (!match || memcmp(str, match, strlen(match)) == 0) {
- if (callback
- && callback(data, nr, str, start, size) < 0) {
- break;
+ if (callback) {
+ ret = callback(data, nr, str, start, size);
+ if (ret < 0)
+ break;
+ else if (ret == 0)
+ nr++;
}
- nr++;
}
}