[Skiboot] [PATCH] Fix infinite loop in wait_for_resource if CAPP ucode load fails
Stewart Smith
stewart at linux.vnet.ibm.com
Tue May 12 14:05:59 AEST 2015
On failing to load CAPP microcode, we would call wait_for_resource_loaded
for the next PHB but without issuing a new request, thus making
wait_for_resource spin forever waiting for something that will
never complete.
Fix is to just track result of load.
Reported-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
Signed-off-by: Stewart Smith <stewart at linux.vnet.ibm.com>
---
hw/phb3.c | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/hw/phb3.c b/hw/phb3.c
index d9cb57d..eb2ed46 100644
--- a/hw/phb3.c
+++ b/hw/phb3.c
@@ -2182,7 +2182,7 @@ static struct {
uint32_t ec_level;
struct capp_lid_hdr *lid;
size_t size;
- bool loaded;
+ int load_result;
} capp_ucode_info = { 0, NULL, 0, false };
#define CAPP_UCODE_MAX_SIZE 0x20000
@@ -2190,26 +2190,23 @@ static struct {
static int64_t capp_lid_download(void)
{
int64_t ret;
- int loaded;
- if (capp_ucode_info.loaded == true)
- return OPAL_SUCCESS;
+ if (capp_ucode_info.load_result != OPAL_EMPTY)
+ return capp_ucode_info.load_result;
- loaded = wait_for_resource_loaded(RESOURCE_ID_CAPP,
- capp_ucode_info.ec_level);
+ capp_ucode_info.load_result = wait_for_resource_loaded(
+ RESOURCE_ID_CAPP,
+ capp_ucode_info.ec_level);
- if (loaded != OPAL_SUCCESS) {
+ if (capp_ucode_info.load_result != OPAL_SUCCESS) {
prerror("CAPP: Error loading ucode lid. index=%x\n",
capp_ucode_info.ec_level);
ret = OPAL_RESOURCE;
free(capp_ucode_info.lid);
capp_ucode_info.lid = NULL;
- capp_ucode_info.loaded = false;
goto end;
}
- capp_ucode_info.loaded = true;
-
ret = OPAL_SUCCESS;
end:
return ret;
@@ -4506,7 +4503,7 @@ int phb3_preload_capp_ucode(void)
/* Assert that we're preloading */
assert(capp_ucode_info.lid == NULL);
- capp_ucode_info.loaded = false;
+ capp_ucode_info.load_result = OPAL_EMPTY;
capp_ucode_info.ec_level = index;
--
1.7.10.4
More information about the Skiboot
mailing list