[Skiboot] [PATCH] ipmi: Fix the opal_ipmi_recv() call to handle the error path
Neelesh Gupta
neelegup at linux.vnet.ibm.com
Fri Jul 31 16:01:11 AEST 2015
Hi Alistair,
On 07/31/2015 10:56 AM, Alistair Popple wrote:
> 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;
I earlier thought of not calling an interface (ipmi_free_msg) while
taking the lock,
but not a concern in this case, so will change as you suggested.
Thanks,
Neelesh.
>
>> + 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
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/skiboot/attachments/20150731/f3152b57/attachment.html>
More information about the Skiboot
mailing list