[Skiboot] [PATCH v2 3/9] opal-msg: Enhance opal-get-msg API

Vasant Hegde hegdevasant at linux.vnet.ibm.com
Fri May 10 18:47:16 AEST 2019


On 05/10/2019 12:28 PM, Jeremy Kerr wrote:
> Hi Vasant,
> 
>>>> -int _opal_queue_msg(enum opal_msg_type msg_type, void *data,
>>>> -		    void (*consumed)(void *data, int status),
>>>> -		    size_t num_params, const u64 *params)
>>>> +static int __opal_queue_msg(enum opal_msg_type msg_type, void
>>>> *data,
>>>> +			    void (*consumed)(void *data, int status),
>>>> +			    size_t params_size, const void *params_data)
>>>
>>> Why add the new __opal_queue_msg(), when we have _opal_queue_msg()?
>>> Can't we just remove the "/sizeof(u64)" from the opal_queue_msg
>>> macro
>>> instead, and use _opal_queue_msg() for the low-level function?
>>
>> Yeah we can do that.. But _opal_queue_msg() is used in many places
>> directly.
>> So we have to change all places to pass actual size.. something like
>> below :
>>
>> diff --git a/core/hmi.c b/core/hmi.c
>> index e81328600..ab079a95a 100644
>> --- a/core/hmi.c
>> +++ b/core/hmi.c
>> @@ -337,7 +337,7 @@ static int queue_hmi_event(struct OpalHMIEvent
>> *hmi_evt, int
>> recover, uint64_t *
>>
>>           /* queue up for delivery to host. */
>>           return _opal_queue_msg(OPAL_MSG_HMI_EVT, NULL, NULL,
>> -                               num_params, (uint64_t *)hmi_evt);
>> +                               num_params * sizeof(u64), (uint64_t
>> *)hmi_evt);
>>    }
>>
>> To avoid these changes I created added function to pass buffer
>> (opal_queue_msg_buf()).
>>
>> If you still want I can change this. Please let me know.
> 
> I think it'd be simpler to reduce the number of functions here,
> especially as the difference between them is so subtle.
> 
> But as you say, it's not super important.

Correct. May be I will relook into it later.

> 
>>>> @@ -56,12 +62,14 @@ int _opal_queue_msg(enum opal_msg_type
>>>> msg_type,
>>>> void *data,
>>>>    	entry->consumed = consumed;
>>>>    	entry->data = data;
>>>>    	entry->msg.msg_type = cpu_to_be32(msg_type);
>>>> +	entry->msg.size = cpu_to_be32(params_size);
>>>>    
>>>> -	if (num_params > ARRAY_SIZE(entry->msg.params)) {
>>>> -		prerror("Discarding extra parameters\n");
>>>> -		num_params = ARRAY_SIZE(entry->msg.params);
>>>> +	if (params_size > OPAL_MSG_FIXED_PARAMS_SIZE) {
>>>> +		/* msg.params[0] contains address of data */
>>>> +		entry->msg.params[0] = (uint64_t)params_data;
>>>> +	} else {
>>>> +		memcpy(entry->msg.params, params_data, params_size);
>>>>    	}
>>>
>>> This concerns me a bit - now we have two different "formats" of
>>> message
>>> on the msg_pending_list, and it looks like there are now two
>>> different
>>> lifetime requirements on the params_data argument, depending on the
>>> size.
>>>
>>> Could we unify this?
>>
>> This is bit tricky one. In many places its just return code -OR-  some
>> values queued using opal_queue_msg.
> 
> I'm not sure I understand? Do you mean that not all callsites (ie, in
> the "just return code" case) are guaranteeing that their buffers remain
> valid until the callback?

Yes. Most places caller won't guarantee that their buffer remain valid until 
callback is called.

> 
> This sounds like a source of future bugs. For example, if we ever change
> the threshold between the two methods of message queuing.
> 
> Can we just use the memcpy() implementation and only have the one type
> of params storage instead?

I had thought about this.. But this will increase memory allocation (upto 64K).
May be this is better than two different implementation. I can do this.



> 
>>> Minor (but also on other patches in this series): reverse christmas-
>>> tree?
>>
>> Not sure what you meant here. you mean variable order ?
> 
> Yeah, this seems to be an ad-hoc convention that we've adopted, where
> the longer declarations go first:

Yeah. May be I will reoder.

-Vasant



More information about the Skiboot mailing list