[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:38:03 -0800
Newsgroups dev.linux.lists.accel-config
Message-ID <[email protected]>
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.