diff options
author | Vasant Hegde <hegdevasant@linux.vnet.ibm.com> | 2019-05-28 11:17:27 +0530 |
---|---|---|
committer | Vasant Hegde <hegdevasant@linux.vnet.ibm.com> | 2019-06-08 15:04:28 +0530 |
commit | 2fff264e25d2349a92d84b02e14c886121d90410 (patch) | |
tree | b64d03bf807f312d451209c0dacd97f913b5c76e | |
parent | c4f9c112fc172d19acdc9143045d5c745eb1b4de (diff) | |
download | skiboot-2fff264e25d2349a92d84b02e14c886121d90410.zip skiboot-2fff264e25d2349a92d84b02e14c886121d90410.tar.gz skiboot-2fff264e25d2349a92d84b02e14c886121d90410.tar.bz2 |
opal-prd: Fix prd message size issue
[ Upstream commit 9cae036fafea468219892406a846639f2715854d ]
If prd messages size is insufficient then read_prd_msg() call fails with
below error. And caller is not reallocating sufficient buffer. Also its
hard to guess the size.
sample log:
-----------
Mar 28 03:31:43 zz24p1 opal-prd: FW: error reading from firmware: alloc 32 rc -1: Invalid argument
Mar 28 03:31:43 zz24p1 opal-prd: FW: error reading from firmware: alloc 32 rc -1: Invalid argument
Mar 28 03:31:43 zz24p1 opal-prd: FW: error reading from firmware: alloc 32 rc -1: Invalid argument
....
Lets use `opal-msg-size` device tree property to allocate memory
for prd message.
Cc: Skiboot Stable <skiboot-stable@lists.ozlabs.org>
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
-rw-r--r-- | external/opal-prd/opal-prd.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/external/opal-prd/opal-prd.c b/external/opal-prd/opal-prd.c index 33ea5f5..d0a507c 100644 --- a/external/opal-prd/opal-prd.c +++ b/external/opal-prd/opal-prd.c @@ -2120,7 +2120,9 @@ static int init_control_socket(struct opal_prd_ctx *ctx) static int run_prd_daemon(struct opal_prd_ctx *ctx) { - int rc; + char *opal_msg_path; + void *buf; + int rc, len; /* log to syslog */ pr_log_daemon_init(); @@ -2130,14 +2132,31 @@ static int run_prd_daemon(struct opal_prd_ctx *ctx) ctx->fd = -1; ctx->socket = -1; - /* set up our message buffer */ - ctx->msg_alloc_len = sizeof(*ctx->msg); + /* + * Set up our message buffer. Use opal-msg-size device tree + * property to get message buffer size. + */ + rc = asprintf(&opal_msg_path, + "%s/ibm,opal/opal-msg-size", devicetree_base); + if (rc > 0) { + rc = open_and_read(opal_msg_path, &buf, &len); + if (rc == 0) { + ctx->msg_alloc_len = be32toh(*(__be32 *)buf); + free(buf); + } + + free(opal_msg_path); + } + + if (ctx->msg_alloc_len == 0) + ctx->msg_alloc_len = sizeof(*ctx->msg); + ctx->msg = malloc(ctx->msg_alloc_len); if (!ctx->msg) { pr_log(LOG_ERR, "FW: Can't allocate PRD message buffer: %m"); return -1; } - + memset(ctx->msg, 0, ctx->msg_alloc_len); list_head_init(&ctx->msgq); |