[PATCH 1/5] drm/ttm: Add common debugfs code for resource managers

Daniel Vetter daniel at ffwll.ch
Fri Apr 8 07:56:14 UTC 2022


On Thu, Apr 07, 2022 at 02:15:52PM +0000, Zack Rusin wrote:
> On Thu, 2022-04-07 at 08:01 +0200, Christian König wrote:
> > Am 07.04.22 um 04:56 schrieb Zack Rusin:
> > > From: Zack Rusin <zackr at vmware.com>
> > > 
> > > Drivers duplicate the code required to add debugfs entries for
> > > various
> > > ttm resource managers. To fix it add common TTM resource manager
> > > code that each driver can reuse.
> > > 
> > > Because TTM resource managers can be initialized and set a lot
> > > later
> > > than TTM device initialization a seperate init function is
> > > required.
> > > Specific resource managers can overwrite
> > > ttm_resource_manager_func::debug to get more information from those
> > > debugfs entries.
> > > 
> > > Signed-off-by: Zack Rusin <zackr at vmware.com>
> > > Cc: Christian Koenig <christian.koenig at amd.com>
> > > Cc: Huang Rui <ray.huang at amd.com>
> > > Cc: David Airlie <airlied at linux.ie>
> > > Cc: Daniel Vetter <daniel at ffwll.ch>
> > 
> > Ah, yes that was on my TODO list for quite a while as well.
> > 
> > > ---
> > >   drivers/gpu/drm/ttm/ttm_resource.c | 65
> > > ++++++++++++++++++++++++++++++
> > >   include/drm/ttm/ttm_resource.h     |  4 ++
> > >   2 files changed, 69 insertions(+)
> > > 
> > > diff --git a/drivers/gpu/drm/ttm/ttm_resource.c
> > > b/drivers/gpu/drm/ttm/ttm_resource.c
> > > index 492ba3157e75..6392ad3e9a88 100644
> > > --- a/drivers/gpu/drm/ttm/ttm_resource.c
> > > +++ b/drivers/gpu/drm/ttm/ttm_resource.c
> > > @@ -29,6 +29,8 @@
> > >   #include <drm/ttm/ttm_resource.h>
> > >   #include <drm/ttm/ttm_bo_driver.h>
> > > 
> > > +#include "ttm_module.h"
> > > +
> > >   /**
> > >    * ttm_lru_bulk_move_init - initialize a bulk move structure
> > >    * @bulk: the structure to init
> > > @@ -644,3 +646,66 @@ ttm_kmap_iter_linear_io_fini(struct
> > > ttm_kmap_iter_linear_io *iter_io,
> > > 
> > >       ttm_mem_io_free(bdev, mem);
> > >   }
> > > +
> > > +#if defined(CONFIG_DEBUG_FS)
> > > +
> > > +#define TTM_RES_MAN_SHOW(i) \
> > > +     static int ttm_resource_manager##i##_show(struct seq_file *m,
> > > void *unused) \
> > > +     { \
> > > +             struct ttm_device *bdev = (struct ttm_device *)m-
> > > >private; \
> > > +             struct ttm_resource_manager *man =
> > > ttm_manager_type(bdev, i); \
> > > +             struct drm_printer p = drm_seq_file_printer(m); \
> > > +             ttm_resource_manager_debug(man, &p); \
> > > +             return 0; \
> > > +     }\
> > > +     DEFINE_SHOW_ATTRIBUTE(ttm_resource_manager##i)
> > > +
> > > +TTM_RES_MAN_SHOW(0);
> > > +TTM_RES_MAN_SHOW(1);
> > > +TTM_RES_MAN_SHOW(2);
> > > +TTM_RES_MAN_SHOW(3);
> > > +TTM_RES_MAN_SHOW(4);
> > > +TTM_RES_MAN_SHOW(5);
> > > +TTM_RES_MAN_SHOW(6);
> > 
> > Uff, please not a static array.
> > 
> > > +
> > > +#endif
> > > +
> > > +/**
> > > + * ttm_resource_manager_debugfs_init - Setup debugfs entries for
> > > specified
> > > + * resource managers.
> > > + * @bdev: The TTM device
> > > + * @file_names: A mapping between TTM_TT placements and the
> > > debugfs file
> > > + * names
> > > + * @num_file_names: The array size of @file_names.
> > > + *
> > > + * This function setups up debugfs files that can be used to look
> > > + * at debug statistics of the specified ttm_resource_managers.
> > > + * @file_names array is used to figure out which ttm placements
> > > + * will get debugfs files created for them.
> > > + */
> > > +void
> > > +ttm_resource_manager_debugfs_init(struct ttm_device *bdev,
> > > +                               const char * const file_names[],
> > > +                               uint32_t num_file_names)
> > > +{
> > > +#if defined(CONFIG_DEBUG_FS)
> > > +     uint32_t i;
> > > +     const struct file_operations *fops[] = {
> > > +             &ttm_resource_manager0_fops,
> > > +             &ttm_resource_manager1_fops,
> > > +             &ttm_resource_manager2_fops,
> > > +             &ttm_resource_manager3_fops,
> > > +             &ttm_resource_manager4_fops,
> > > +             &ttm_resource_manager5_fops,
> > > +             &ttm_resource_manager6_fops,
> > > +     };
> > > +
> > > +     WARN_ON(num_file_names > ARRAY_SIZE(fops));
> > > +
> > > +     for (i = 0; i < num_file_names; ++i)
> > > +             if (file_names[i] && fops[i])
> > > +                     debugfs_create_file(file_names[i], 0444,
> > > +                                         ttm_debugfs_root, bdev,
> > > fops[i]);
> > 
> > You can give the ttm_resource_manager directly as parameter here
> > instead
> > of the bdev and avoid the whole handling with the macro and global
> > arrays.
> 
> We could but that does change the behaviour. I was trying to preserve
> the old semantics. Because the lifetimes of driver specific managers
> are not handled by ttm, there's nothing preventing the drivers from,
> e.g. during reset, deleting the old and setting up new resource
> managers. By always using ttm_manager_type() we make sure that we're
> always using the current one. Passing ttm_resource_manager directly
> makes it impossible to validate that at _show() time
> ttm_resource_manager is still valid. It's not a problem for vmwgfx
> because we never reset the resource managers but I didn't feel
> comfortable changing the semantics like that for all drivers. It could
> lead to weird crashes, but if you prefer that approach I'm happy to
> change it.

Uh resetting resource managers during the lifetime of a drm_device sounds
very broken. I guess it's somewhat ok over suspend/resume or so when
userspace cannot access the driver, but even then it smells fishy.

Unless we have a driver doing that I don't think this is a use-case we
should support.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list