[Accel-config] Re: [RFC] Provide library API to read and write raw sysfs attributes

Ramesh Thomas <ramesh.thomas at intel.com> Mon, 07 Feb 2022 16:51:25 -0800
Newsgroups dev.linux.lists.accel-config
Message-ID <[email protected]>
On 2/7/2022 4:49 PM, Dave Jiang wrote:
> 
> On 2/7/2022 5:38 PM, Ramesh Thomas wrote:
>> On 2/7/2022 3:58 PM, Dave Jiang wrote:
>>>
>>> On 2/7/2022 4:46 PM, Ramesh Thomas wrote:
>>>> On 2/7/2022 3:24 PM, Dave Jiang wrote:
>>>>>
>>>>> On 2/7/2022 4:18 PM, Ramesh Thomas wrote:
>>>>>> On 2/7/2022 3:05 PM, Dave Jiang wrote:
>>>>>>>
>>>>>>> On 2/7/2022 2:54 PM, Ramesh Thomas wrote:
>>>>>>>> On 2/7/2022 1:43 PM, Dave Jiang wrote:
>>>>>>>>>
>>>>>>>>> On 2/7/2022 2:34 PM, Ramesh Thomas wrote:
>>>>>>>>>> On 2/4/2022 3:26 PM, Dave Jiang wrote:
>>>>>>>>>>>
>>>>>>>>>>> On 2/4/2022 2:03 PM, Ramesh Thomas wrote:
>>>>>>>>>>>> On 2/4/2022 12:42 PM, Dave Jiang wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>> On 2/4/2022 12:15 PM, Ramesh Thomas wrote:
>>>>>>>>>>>>>> I am thinking of providing some generic functions to read 
>>>>>>>>>>>>>> and write sysfs attributes without much processing. This 
>>>>>>>>>>>>>> will be useful where raw reads and writes are required 
>>>>>>>>>>>>>> e.g. listing values of attributes or initializing 
>>>>>>>>>>>>>> attributes in a loop. This will open up possibilities of 
>>>>>>>>>>>>>> advanced use cases where user can do custom batch 
>>>>>>>>>>>>>> configurations in addition to the load and save 
>>>>>>>>>>>>>> configuration option.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> There will be a get and set function for devices, groups, 
>>>>>>>>>>>>>> wqs and engines as follows
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> /* structure to read and write attributes from sysfs */
>>>>>>>>>>>>>> struct accfg_sysfs_attr {
>>>>>>>>>>>>>>         char attr[MAX_PARAM_LEN];
>>>>>>>>>>>>>> };
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> int accfg_get_device_attr(struct accfg_device *device, 
>>>>>>>>>>>>>> const char *attr_name,
>>>>>>>>>>>>>>                 struct *accfg_sysfs_attr);
>>>>>>>>>>>>>> int accfg_set_device_attr(struct accfg_device *device, 
>>>>>>>>>>>>>> const char *attr_name,
>>>>>>>>>>>>>>                 struct *accfg_sysfs_attr);
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> int accfg_get_group_attr(struct accfg_group *group, const 
>>>>>>>>>>>>>> char *attr_name,
>>>>>>>>>>>>>>                 struct *accfg_sysfs_attr);
>>>>>>>>>>>>>> int accfg_set_group_attr(struct accfg_group *group, const 
>>>>>>>>>>>>>> char *attr_name,
>>>>>>>>>>>>>>                 struct *accfg_sysfs_attr);
>>>>>>>>>>>>>>
>>>>>>>>>>>>> Does it provide additional processing on top of 
>>>>>>>>>>>>> sysfs_read_attr() helper function?
>>>>>>>>>>>>
>>>>>>>>>>>> It creates the path from from device, wq, engine and group 
>>>>>>>>>>>> structure. It will save last error (cmd_status) in accfg 
>>>>>>>>>>>> ctxt and return errors returned from driver. Other than that 
>>>>>>>>>>>> it does not do any attribute specific processing.
>>>>>>>>>>>
>>>>>>>>>>> Ok by me from high level view if it makes the code cleaner.
>>>>>>>>>>
>>>>>>>>>> Unfortunately this will not work. The intention was to provide 
>>>>>>>>>> a generic API to read/write sysfs attributes as strings. 
>>>>>>>>>> However since we cache attributes in their respective types 
>>>>>>>>>> (int, long, string etc.), attribute specific processing cannot 
>>>>>>>>>> be avoided.
>>>>>>>>>>
>>>>>>>>>> Maybe in future we could simplify things by not caching values 
>>>>>>>>>> in private structures. I don't see a reason to cache them when 
>>>>>>>>>> that is done in the sysfs and persisted in config files. We 
>>>>>>>>>> only need to validate when user enters a value and load all of 
>>>>>>>>>> them in json as strings.
>>>>>>>>>
>>>>>>>>> I think the issue is with apps using the libaccel-config API. 
>>>>>>>>> If an attribute is persistent, then you don't want to keep 
>>>>>>>>> pulling it from sysfs when you can read it locally. Especially 
>>>>>>>>> if something is needed for the fast I/O path.
>>>>>>>>
>>>>>>>> Since this is only a configuration tool, there is no need for 
>>>>>>>> fast I/O. We can store all the attributes in json as strings.
>>>>>>>
>>>>>>> That is only for the front end. If something like DML is calling 
>>>>>>> libaccel-config, and it asks for some wq attribute or device 
>>>>>>> attribute it potentially could be calling from somewhere in the 
>>>>>>> fast path.
>>>>>>
>>>>>> Libaccel-config has to stay in sync with syfs so I am not sure how 
>>>>>> can you avoid accessing it. Still we don't need private data 
>>>>>> structures to avoid reading sysfs. Json can store the attributes 
>>>>>> as strings.
>>>>>
>>>>> For changeable attributes yes. But for static attributes no. Just 
>>>>> for a hypothetical example, DML asks for the gencap of a device to 
>>>>> compare permission. This value should be cached. There's no reason 
>>>>> to re-read it at all from sysfs.
>>>>
>>>> Most of the configurations are changeable and even the 
>>>> non-changeable ones would need to be read once at least. My main 
>>>> point is we can just store them as strings in json instead of 
>>>> maintaining the interpreted values in private data structures.
>>> I'm confused about the json part. Isn't json only involved when we 
>>> are reading/writing the config files?
>>
>> Currently we create and load json object with the data only during 
>> config load/save and listing. I was thinking we can use the json 
>> database all the time. That would require querying json when we need 
>> to locate data. If we don't want to use json, we can still store in 
>> data structures like we do currently but as raw strings. That way only 
>> the API that deals with each attribute has to deal with the type and 
>> the storage only mirrors the sysfs.
> 
> I suppose that's up to you. Whatever makes the code cleaner and simpler.

It is a proposal for future improvements depending on priorities. 
Simplifying things would make it easier to maintain.