[Intel-gfx] [PATCH v4] drm/i915/gt: allow setting generic data pointer
Daniele Ceraolo Spurio
daniele.ceraolospurio at intel.com
Mon Mar 9 23:11:44 UTC 2020
On 3/9/20 3:38 PM, Andi Shyti wrote:
> Hi Daniele,
>
>>>>>> Quoting Andi Shyti (2020-03-06 23:03:44)
>>>>>>> -void debugfs_gt_register_files(struct intel_gt *gt,
>>>>>>> - struct dentry *root,
>>>>>>> - const struct debugfs_gt_file *files,
>>>>>>> - unsigned long count)
>>>>>>> +void intel_gt_debugfs_register_files(struct dentry *root,
>>>>>>> + const struct debugfs_gt_file *files,
>>>>>>> + unsigned long count, void *data)
>>>>>>> {
>>>>>>> while (count--) {
>>>>>>> - if (!files->eval || files->eval(gt))
>>>>>>> + if (!files->eval || files->eval(data))
>>>>>>> debugfs_create_file(files->name,
>>>>>>> - 0444, root, gt,
>>>>>>> + 0444, root, data,
>>>>>>> files->fops);
>>>>>>
>>>>>> And now we are not a intel_gt routine, you'll want to move again :)
>>>>>> i915_debugfs_utils.c ? :)
>>>>>
>>>>> Actually, this is what it came to and this was the first
>>>>> discussion I had with Daniele and that's also why I was loyal to
>>>>> th "_gt_" wrappers until the end. But I had to agree that this
>>>>> was becoming more a limitation.
>>>>>
>>>>> The biggest difference left, which by the way is the real
>>>>> distinguishing factor other than the *gt pointer, is that we
>>>>> create files under gt directory, instead of having the root
>>>>> imposed by the drm (even though the caller can eventually choose
>>>>> different roots).
>>>>>
>>>>> We could perhaps store the root pointer in the intel_gt
>>>>> structure so that this function stays de facto an intel_gt
>>>>> routine and the caller doesn't need to care where the files will
>>>>> be generated. This is what we planned to do with sysfs as well.
>>>>>
>>>>> What do you think?
>>>>
>>>> I thought we were passing along the root. If not I think we should, more
>>>> of a debugfs constructor context?
>>>
>>> What do you mean with debugfs constructor context? Is it a
>>> gt->debugfs_root pointer like the gt->sysfs_root?
>>>
>
>> Getting the root pointer internally from gt wouldn't work well for
>> subfolders, like the gt/uc/ folder I want to add for GuC/HuC files.
>
> this was not my idea, actually I was thinking the opposite.
>
> When in this case you call "intel_gt_debugfs_register_files", you
> would provide "gt" pointer where the funcion extracts and handles
> by its own the debugfs_root. The caller doesn't need to care
> about it.
>
> Another idea could be to use contexts, e.g. guc or pm or whatever
> comes to mind, and the intel_gt_debugfs handles everything
> including subdirectories.
>
>> I think extracting this generic helper to a common file, possibly as a follow-up
>> step, isn't a bad idea, also considering that there is at least 1 more
>> use-case in i915_debugfs_register(). Maybe we can generalize as something
>> like:
>>
>> struct i915_debugfs_files {
>> const char *name;
>> const struct file_operations *fops;
>> bool (*eval)(void *data);
>> }
>>
>> void i915_debugfs_register_files(struct dentry *root,
>> const struct i915_debugfs_files *files,
>> unsigned long count, void *data)
>> {
>> while (count--) {
>> umode_t mode = files->fops->write ? 0644 : 0444;
>> if (!files->eval || files->eval(data))
>> debugfs_create_file(files->name,
>> mode, root, data,
>> files->fops);
>> }
>> }
>
> apart from the mode, isn't this the same as the latest patch you
> actually reviewed?
>
Yes, but by adding the mode and making the naming generic we can re-use
it outside the GT code, e.g. in i915_debugfs_connector_add() and to
replace the loop in i915_debugfs_register(). I was reconnecting to
Chris' proposal of having a common function in i915_debugfs_utils.c (or
even just in i915_debugfs.c ?).
>> void i915_debugfs_register_files(struct dentry *root,
>
> based on my proposal, root would point, in your case, to the
> "guc/" directory that will be created under the "gt/". NULL if
> you want the file to be created in the main "gt/" directory.
>
If I'm understanding correctly, you're proposing to pass both struct
intel_gt *gt and struct dentry *root, with the latter being set only if
we want a folder different that gt/ ? What would that gain us compared
to just passing the desired root every time like we currently do?
> While if we want to go by context, we could do something like:
>
> struct i915_debugfs_files {
> const char *name;
> const struct file_operations *fops;
> bool (*eval)(void *data);
> enum intel_gt_context context;
This seems overkill, also because you'd have to save all the roots
inside of the gt struct to allow accessing them from within the
register_files function.
> }
>
> and the gt handles everything.
Maybe I'm misunderstanding your proposal, but it feels like you're
trying to find a use for a gt variable we don't really need just to keep
this as a gt routine.
Daniele
>
> Andi
>
More information about the Intel-gfx
mailing list