[Skiboot] [PATCH] ipmi: Fix the opal_ipmi_recv() call to handle the error path
Alistair Popple
alistair at popple.id.au
Fri Jul 31 15:26:36 AEST 2015
Hi Neelesh,
Comments below.
On Thu, 16 Jul 2015 16:41:35 Neelesh Gupta wrote:
> In the error path of the OPAL function to receive the ipmi message,
> the function returns the error code without deleting the message
> containing response. Though the kernel doesn't claim this message
> later and continue with the subsequent ipmi commands. This leads to
> a scenario when there is a mismatch between the ipmi command and its
> response for all the subsequent ipmi commands.
>
> Signed-off-by: Neelesh Gupta <neelegup at linux.vnet.ibm.com>
> Cc: Alistair Popple <alistair at popple.id.au>
> ---
> hw/ipmi/ipmi-opal.c | 19 ++++++++++++-------
> 1 file changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/hw/ipmi/ipmi-opal.c b/hw/ipmi/ipmi-opal.c
> index 237f8c0..d37f151 100644
> --- a/hw/ipmi/ipmi-opal.c
> +++ b/hw/ipmi/ipmi-opal.c
> @@ -75,25 +75,25 @@ static int64_t opal_ipmi_recv(uint64_t interface,
> msg = list_top(&msgq, struct ipmi_msg, link);
>
> if (!msg) {
> - rc = OPAL_EMPTY;
> - goto out_unlock;
My preference would be to keep out_unlock and add out_del_msg. Eg:
out_del_msg:
list_del(&msg->link);
if (list_empty(&msgq))
opal_update_pending_evt(ipmi_backend->opal_event_ipmi_recv,
0);
ipmi_free_msg(msg);
out_unlock:
unlock(&msgq_lock);
return rc;
> + unlock(&msgq_lock);
> + return OPAL_EMPTY;
> }
>
> if (opal_ipmi_msg->version != OPAL_IPMI_MSG_FORMAT_VERSION_1) {
> prerror("OPAL IPMI: Incorrect version\n");
> rc = OPAL_UNSUPPORTED;
> - goto out_unlock;
> + goto out_del_msg;
> }
>
> if (interface != IPMI_DEFAULT_INTERFACE) {
> prerror("IPMI: Invalid interface 0x%llx in opal_ipmi_recv\n",
interface);
> - rc = OPAL_EMPTY;
> - goto out_unlock;
> + rc = OPAL_PARAMETER;
> + goto out_del_msg;
> }
>
> if (*msg_len - sizeof(struct opal_ipmi_msg) < msg->resp_size + 1) {
> rc = OPAL_RESOURCE;
> - goto out_unlock;
> + goto out_del_msg;
> }
>
> list_del(&msg->link);
> @@ -115,8 +115,13 @@ static int64_t opal_ipmi_recv(uint64_t interface,
>
> return OPAL_SUCCESS;
>
> -out_unlock:
> +out_del_msg:
> + list_del(&msg->link);
> + if (list_empty(&msgq))
> + opal_update_pending_evt(ipmi_backend->opal_event_ipmi_recv,
0);
> unlock(&msgq_lock);
> +
> + ipmi_free_msg(msg);
> return rc;
> }
>
>
> _______________________________________________
> Skiboot mailing list
> Skiboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot
>
More information about the Skiboot
mailing list