Re: [PATCH v6 29/42] x86/resctrl: Move get_config_index() to a header

From: Reinette Chatre
Date: Thu Mar 06 2025 - 17:53:12 EST


Hi James,

On 3/6/25 11:28 AM, James Morse wrote:
> Hi Reinette,
>
> On 01/03/2025 02:28, Reinette Chatre wrote:
>> On 2/28/25 11:51 AM, James Morse wrote:
>>> On 20/02/2025 01:27, Reinette Chatre wrote:
>>>> On 2/7/25 10:18 AM, James Morse wrote:
>>>>> get_config_index() is used by the architecture specific code to map a
>>>>> CLOSID+type pair to an index in the configuration arrays.
>>>>>
>>>>> MPAM needs to do this too to preserve the ABI to user-space, there is
>>>>> no reason to do it differently.
>>>>>
>>>>> Move the helper to a header file.
>>>
>>>>> --- a/include/linux/resctrl.h
>>>>> +++ b/include/linux/resctrl.h
>>>>> @@ -384,6 +384,21 @@ void resctrl_arch_mon_event_config_write(void *config_info);
>>>>> */
>>>>> void resctrl_arch_mon_event_config_read(void *config_info);
>>>>>
>>>>> +/* For use by arch code to remap resctrl's smaller CDP CLOSID range */
>>>>> +static inline u32 resctrl_get_config_index(u32 closid,
>>>>> + enum resctrl_conf_type type)
>>>>> +{
>>>>> + switch (type) {
>>>>> + default:
>>>>> + case CDP_NONE:
>>>>> + return closid;
>>>>> + case CDP_CODE:
>>>>> + return closid * 2 + 1;
>>>>> + case CDP_DATA:
>>>>> + return closid * 2;
>>>>> + }
>>>>> +}
>>>>> +
>>>
>>>> Could you please add the motivation for the use of an inline function?
>>>
>>> Putting this in the header file means it isn't duplicated, so its behaviour can't become
>>
>> I am not following this. How would making this part of a .c file of fs/resctrl with just
>> the prototype in include/linux/resctrl.h result in this function being duplicated?
>
> Ah, I misread this as one of the functions marked resctrl_arch_.
>
>
>>> different. If its in a header file, it has to be marked inline otherwise every C file that
>>> includes it gets a copy that probably isn't used, and upsets the linker.
>>>
>>> Calling from the arch code into the filesystem prevents the arch code from being
>>> standalone. This is a useful direction of travel because it allows fs/resctrl to one
>>> day become a module
>
>> Don't we have this already with all the needed CPU and domain management (
>> resctrl_online_ctrl_domain(), resctrl_online_mon_domain(), resctrl_online_cpu(),
>> resctrl_offline_cpu(), etc.)?
>
> And the realloc threshold, yes. These are the things that would need further abstraction
> to allow the filesystem to be a module that isn't loaded. But these would all be changes
> to the existing behaviour.
> This one is just putting the definition in a header.

hmmm ... this seems a stretch as an argument since filesystem is not currently a module
and cannot currently be a module. Adding a declaration to a header file that matches with
existing usage seems reasonable to me.

>
>
>>> Today, the compiler is choosing to inline this:
>>> | x86_64-linux-objdump -d ctrlmondata.o | grep resctrl_get_config_index | wc -l
>>> | 0
>>>
>>> This kind of arithmetic for an array lookup is the kind of thing its good to give the
>>> compiler full visibility of as its good fodder for constant folding.
>>>
>>> For so few call sites, I don't think this is really worth thinking about.
>>> Forcing this call out of line makes the kernel text bigger, but only by 32 bytes.
>>>
>>>
>>> I've expanded the last paragraph of the commit message to read:
>>> | Move the helper to a header file to allow all architectures that either
>>> | use or emulate CDP to use the same pattern of CLOSID values. Moving
>>> | this to a header file means it must be marked inline, which matches
>>> | the existing compiler choice for this static function.

This is fair and seems to be only valid reason.

Reinette