You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.7 KiB
80 lines
2.7 KiB
6 years ago
|
From e7bb07ee7b499f71990e9e83596bdb2ddabdd4cd Mon Sep 17 00:00:00 2001
|
||
|
Message-Id: <e7bb07ee7b499f71990e9e83596bdb2ddabdd4cd.1489676829.git.panand@redhat.com>
|
||
|
In-Reply-To: <f85183096d31d865c97565614535d84943b12908.1489676829.git.panand@redhat.com>
|
||
|
References: <f85183096d31d865c97565614535d84943b12908.1489676829.git.panand@redhat.com>
|
||
|
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
|
||
|
Date: Wed, 15 Mar 2017 18:38:16 +0900
|
||
|
Subject: [PATCH 02/10] kexec: exntend 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 incovenient 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>
|
||
|
---
|
||
|
kexec/kexec-iomem.c | 15 ++++++++++-----
|
||
|
1 file changed, 10 insertions(+), 5 deletions(-)
|
||
|
|
||
|
diff --git a/kexec/kexec-iomem.c b/kexec/kexec-iomem.c
|
||
|
index 485a2e810080..0a0277a422d8 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++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.9.3
|
||
|
|