[PATCH v3 1/6] drm/debugfs: Introduce wrapper for debugfs list

Daniel Vetter daniel at ffwll.ch
Wed Feb 8 18:58:49 UTC 2023


On Wed, Feb 08, 2023 at 03:39:13PM -0300, Maíra Canal wrote:
> On 2/8/23 15:06, Daniel Vetter wrote:
> > On Tue, Jan 31, 2023 at 04:58:21PM -0300, Maíra Canal wrote:
> > > Introduce a struct wrapper for all the debugfs-related stuff: the list
> > > of debugfs files and the mutex that protects it. This will make it
> > > easier to initialize all the debugfs list in a DRM object and will
> > > create a good abstraction for a possible implementation of the debugfs
> > > infrastructure for KMS objects.
> > > 
> > > Signed-off-by: Maíra Canal <mcanal at igalia.com>
> > > ---
> > >   drivers/gpu/drm/drm_debugfs.c  | 18 ++++++++++++++++++
> > >   drivers/gpu/drm/drm_internal.h | 12 ++++++++++++
> > >   include/drm/drm_debugfs.h      | 16 ++++++++++++++++
> > >   3 files changed, 46 insertions(+)
> > > 
> > > diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> > > index 4f643a490dc3..8658d3929ea5 100644
> > > --- a/drivers/gpu/drm/drm_debugfs.c
> > > +++ b/drivers/gpu/drm/drm_debugfs.c
> > > @@ -218,6 +218,24 @@ void drm_debugfs_create_files(const struct drm_info_list *files, int count,
> > >   }
> > >   EXPORT_SYMBOL(drm_debugfs_create_files);
> > > +struct drm_debugfs_files *drm_debugfs_files_init(void)
> > > +{
> > > +	struct drm_debugfs_files *debugfs_files;
> > > +
> > > +	debugfs_files = kzalloc(sizeof(*debugfs_files), GFP_KERNEL);
> > > +
> > > +	INIT_LIST_HEAD(&debugfs_files->list);
> > > +	mutex_init(&debugfs_files->mutex);
> > > +
> > > +	return debugfs_files;
> > > +}
> > > +
> > > +void drm_debugfs_files_destroy(struct drm_debugfs_files *debugfs_files)
> > > +{
> > > +	mutex_destroy(&debugfs_files->mutex);
> > > +	kfree(debugfs_files);
> > > +}
> > > +
> > >   int drm_debugfs_init(struct drm_minor *minor, int minor_id,
> > >   		     struct dentry *root)
> > >   {
> > > diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
> > > index ed2103ee272c..f1c8766ed828 100644
> > > --- a/drivers/gpu/drm/drm_internal.h
> > > +++ b/drivers/gpu/drm/drm_internal.h
> > > @@ -23,6 +23,7 @@
> > >   #include <linux/kthread.h>
> > > +#include <drm/drm_debugfs.h>
> > >   #include <drm/drm_ioctl.h>
> > >   #include <drm/drm_vblank.h>
> > > @@ -183,6 +184,8 @@ int drm_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev,
> > >   /* drm_debugfs.c drm_debugfs_crc.c */
> > >   #if defined(CONFIG_DEBUG_FS)
> > > +struct drm_debugfs_files *drm_debugfs_files_init(void);
> > > +void drm_debugfs_files_destroy(struct drm_debugfs_files *debugfs_files);
> > >   int drm_debugfs_init(struct drm_minor *minor, int minor_id,
> > >   		     struct dentry *root);
> > >   void drm_debugfs_cleanup(struct drm_minor *minor);
> > > @@ -193,6 +196,15 @@ void drm_debugfs_crtc_add(struct drm_crtc *crtc);
> > >   void drm_debugfs_crtc_remove(struct drm_crtc *crtc);
> > >   void drm_debugfs_crtc_crc_add(struct drm_crtc *crtc);
> > >   #else
> > > +static inline struct drm_debugfs_files *drm_debugfs_files_init(void)
> > > +{
> > > +	return NULL;
> > > +}
> > > +
> > > +static inline void drm_debugfs_files_destroy(struct drm_debugfs_files *debugfs_files)
> > > +{
> > > +}
> > > +
> > >   static inline int drm_debugfs_init(struct drm_minor *minor, int minor_id,
> > >   				   struct dentry *root)
> > >   {
> > > diff --git a/include/drm/drm_debugfs.h b/include/drm/drm_debugfs.h
> > > index 7616f457ce70..423aa3de506a 100644
> > > --- a/include/drm/drm_debugfs.h
> > > +++ b/include/drm/drm_debugfs.h
> > > @@ -32,6 +32,8 @@
> > >   #ifndef _DRM_DEBUGFS_H_
> > >   #define _DRM_DEBUGFS_H_
> > > +#include <linux/list.h>
> > > +#include <linux/mutex.h>
> > >   #include <linux/types.h>
> > >   #include <linux/seq_file.h>
> > >   /**
> > > @@ -79,6 +81,20 @@ struct drm_info_node {
> > >   	struct dentry *dent;
> > >   };
> > > +/**
> > > + * struct drm_debugfs_files - Encapsulates the debugfs list and its mutex
> > > + *
> > > + * This structure represents the debugfs list of files and is encapsulated
> > > + * with a mutex to protect the access of the list.
> > > + */
> > > +struct drm_debugfs_files {
> > > +	/** @list: List of debugfs files to be created by the DRM object. */
> > > +	struct list_head list;
> > > +
> > > +	/** @mutex: Protects &list access. */
> > > +	struct mutex mutex;
> > 
> > I'm not seeing any use for the mutex here? Also unless you also plan to
> > put like the debugfs directory pointers in this struct, I'm not sure we
> > need this abstraction since it's purely internal to debugfs code (so also
> > should really be in the headers where drivers could perhaps come up with
> > funny ideas).
> 
> Isn't this mutex needed to guarantee race-conditions safety when adding new
> files to the list, as drm_debugfs_add_file() is called by the drivers? [1]
> 
> [1] https://cgit.freedesktop.org/drm/drm-misc/tree/drivers/gpu/drm/drm_debugfs.c#n343

Hm I looked at the wrong place and only spotted the locking for the old
drm_minor debugfs stuff ... it does look a bit funny if we only do this in
add_file(), also usually drivers really don't have anything multi-threaded
in there. If you e.g. look at __drm_universal_plane_init() then the

	list_add_tail(&plane->head, &config->plane_list);

also doesn't have any locks. The assumption that driver load code isn't
multi-threaded is pretty deeply in-grained (note that it's different for
drm_connector because those can be hotplugged at any later point and even
concurrently with driver load finishing). So I don't think we need this in
the debugfs side. But since it's there already definitely a separate patch
to remove that locking.
-Daniel

> 
> Best Regards,
> - Maíra Canal
> 
> > -Daniel
> > 
> > > +};
> > > +
> > >   /**
> > >    * struct drm_debugfs_info - debugfs info list entry
> > >    *
> > > -- 
> > > 2.39.1
> > > 
> > 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list