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.
79 lines
2.7 KiB
79 lines
2.7 KiB
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 |
|
|
|
|