[Skiboot] [PATCH v2 5/6] FSP/ELOG: Fix possible event notifier hangs

Vasant Hegde hegdevasant at linux.vnet.ibm.com
Wed Jul 13 19:23:04 AEST 2016


On 07/04/2016 03:18 PM, Mukesh Ojha wrote:
> Few questions.
>
> On Saturday 02 July 2016 09:03 PM, Vasant Hegde wrote:
>> In some corner cases host may send acknowledgement without
>> reading actual data (fsp_opal_elog_info -> fsp_opal_elog_ack).
>> Because of this elog_read_from_fsp_head_state may be stuck in
>> wrong state (ELOG_STATE_HOST_INFO) and not able to send remaining
>> ELOG's to host. Hence reset ELOG state and start sending remaining
>> ELOG's.
>>
>> Also in normal case we will ACK the logs which are already processed
>> (elog_read_processed). Hence rearrange the code such that we go
>> through elog_read_processed first.
>>
>> Finally return OPAL_PARAMETER if we are not able to find ELOG ID.
>>
>> Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
>> ---
>>   hw/fsp/fsp-elog-read.c  | 18 +++++++++++++++---
>>   hw/fsp/fsp-elog-write.c |  3 +++
>>   2 files changed, 18 insertions(+), 3 deletions(-)
>>
>> diff --git a/hw/fsp/fsp-elog-read.c b/hw/fsp/fsp-elog-read.c
>> index b606236..8c01a1c 100644
>> --- a/hw/fsp/fsp-elog-read.c
>> +++ b/hw/fsp/fsp-elog-read.c
>> @@ -416,21 +416,33 @@ static int64_t fsp_opal_elog_ack(uint64_t ack_id)
>>           return rc;
>>       }
>>       lock(&elog_read_lock);
>> -    list_for_each_safe(&elog_read_pending, record, next_record, link) {
>> +    list_for_each_safe(&elog_read_processed, record, next_record, link) {
>>           if (record->log_id != ack_id)
>>               continue;
>>           list_del(&record->link);
>>           list_add(&elog_read_free, &record->link);
>> +        unlock(&elog_read_lock);
>> +        return rc;
>>       }
>> -    list_for_each_safe(&elog_read_processed, record, next_record, link) {
>> +    list_for_each_safe(&elog_read_pending, record, next_record, link) {
>
> Is it really necessary to check the ack_id in the pending list?
> As this function will be called only for id which is already in the processed list.
> Same we do it for opal errorlogs.

Its required. If host ACKs without reading it.. then it will be in pending list.


>>           if (record->log_id != ack_id)
>>               continue;
>> +        /* It means host has sent ACK without reading actual data.
>> +         * Because of this elog_read_from_fsp_head_state may be
>> +         * stuck in wrong state (ELOG_STATE_HOST_INFO) and not able
>> +         * to send remaning ELOG's to host. Hence reset ELOG state
>
> s/remaning/remaining

Ah yes.. will fix .

-Vasant



More information about the Skiboot mailing list