On Fri, Sep 24, 2021 at 12:18 AM Christian König <ckoenig.leichtzumerken@xxxxxxxxx> wrote: > > Add functions to dump dma_fence and dma_resv objects into a seq_file and > use them for printing the debugfs informations. > > Signed-off-by: Christian König <christian.koenig@xxxxxxx> for the series, Reviewed-by: Rob Clark <robdclark@xxxxxxxxx> > --- > drivers/dma-buf/dma-buf.c | 11 +---------- > drivers/dma-buf/dma-fence.c | 16 ++++++++++++++++ > drivers/dma-buf/dma-resv.c | 23 +++++++++++++++++++++++ > include/linux/dma-fence.h | 1 + > include/linux/dma-resv.h | 1 + > 5 files changed, 42 insertions(+), 10 deletions(-) > > diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c > index d35c71743ccb..4975c9289b02 100644 > --- a/drivers/dma-buf/dma-buf.c > +++ b/drivers/dma-buf/dma-buf.c > @@ -1368,8 +1368,6 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) > { > struct dma_buf *buf_obj; > struct dma_buf_attachment *attach_obj; > - struct dma_resv_iter cursor; > - struct dma_fence *fence; > int count = 0, attach_count; > size_t size = 0; > int ret; > @@ -1397,14 +1395,7 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) > file_inode(buf_obj->file)->i_ino, > buf_obj->name ?: ""); > > - dma_resv_for_each_fence(&cursor, buf_obj->resv, true, fence) { > - seq_printf(s, "\t%s fence: %s %s %ssignalled\n", > - dma_resv_iter_is_exclusive(&cursor) ? > - "Exclusive" : "Shared", > - fence->ops->get_driver_name(fence), > - fence->ops->get_timeline_name(fence), > - dma_fence_is_signaled(fence) ? "" : "un"); > - } > + dma_resv_describe(buf_obj->resv, s); > > seq_puts(s, "\tAttached Devices:\n"); > attach_count = 0; > diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c > index 1e82ecd443fa..5175adf58644 100644 > --- a/drivers/dma-buf/dma-fence.c > +++ b/drivers/dma-buf/dma-fence.c > @@ -907,6 +907,22 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count, > } > EXPORT_SYMBOL(dma_fence_wait_any_timeout); > > +/** > + * dma_fence_describe - Dump fence describtion into seq_file > + * @fence: the 6fence to describe > + * @seq: the seq_file to put the textual description into > + * > + * Dump a textual description of the fence and it's state into the seq_file. > + */ > +void dma_fence_describe(struct dma_fence *fence, struct seq_file *seq) > +{ > + seq_printf(seq, "%s %s seq %llu %ssignalled\n", > + fence->ops->get_driver_name(fence), > + fence->ops->get_timeline_name(fence), fence->seqno, > + dma_fence_is_signaled(fence) ? "" : "un"); > +} > +EXPORT_SYMBOL(dma_fence_describe); > + > /** > * dma_fence_init - Initialize a custom fence. > * @fence: the fence to initialize > diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c > index 266ec9e3caef..6bb25d53e702 100644 > --- a/drivers/dma-buf/dma-resv.c > +++ b/drivers/dma-buf/dma-resv.c > @@ -38,6 +38,7 @@ > #include <linux/mm.h> > #include <linux/sched/mm.h> > #include <linux/mmu_notifier.h> > +#include <linux/seq_file.h> > > /** > * DOC: Reservation Object Overview > @@ -654,6 +655,28 @@ bool dma_resv_test_signaled(struct dma_resv *obj, bool test_all) > } > EXPORT_SYMBOL_GPL(dma_resv_test_signaled); > > +/** > + * dma_resv_describe - Dump description of the resv object into seq_file > + * @obj: the reservation object > + * @seq: the seq_file to dump the description into > + * > + * Dump a textual description of the fences inside an dma_resv object into the > + * seq_file. > + */ > +void dma_resv_describe(struct dma_resv *obj, struct seq_file *seq) > +{ > + struct dma_resv_iter cursor; > + struct dma_fence *fence; > + > + dma_resv_for_each_fence(&cursor, obj, true, fence) { > + seq_printf(seq, "\t%s fence:", > + dma_resv_iter_is_exclusive(&cursor) ? > + "Exclusive" : "Shared"); > + dma_fence_describe(fence, seq); > + } > +} > +EXPORT_SYMBOL_GPL(dma_resv_describe); > + > #if IS_ENABLED(CONFIG_LOCKDEP) > static int __init dma_resv_lockdep(void) > { > diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h > index a706b7bf51d7..1ea691753bd3 100644 > --- a/include/linux/dma-fence.h > +++ b/include/linux/dma-fence.h > @@ -264,6 +264,7 @@ void dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops, > > void dma_fence_release(struct kref *kref); > void dma_fence_free(struct dma_fence *fence); > +void dma_fence_describe(struct dma_fence *fence, struct seq_file *seq); > > /** > * dma_fence_put - decreases refcount of the fence > diff --git a/include/linux/dma-resv.h b/include/linux/dma-resv.h > index d4b4cd43f0f1..49c0152073fd 100644 > --- a/include/linux/dma-resv.h > +++ b/include/linux/dma-resv.h > @@ -486,5 +486,6 @@ int dma_resv_copy_fences(struct dma_resv *dst, struct dma_resv *src); > long dma_resv_wait_timeout(struct dma_resv *obj, bool wait_all, bool intr, > unsigned long timeout); > bool dma_resv_test_signaled(struct dma_resv *obj, bool test_all); > +void dma_resv_describe(struct dma_resv *obj, struct seq_file *seq); > > #endif /* _LINUX_RESERVATION_H */ > -- > 2.25.1 >