[PATCH] drm/etnaviv: dump only failing submit
Lucas Stach
l.stach at pengutronix.de
Fri Aug 9 09:09:58 UTC 2019
Am Dienstag, den 02.07.2019, 16:18 +0200 schrieb Lucas Stach:
> Due to the tracking provided by the scheduler we know exactly which
> submit is failing. Only dump this single submit and the required
> auxiliary information. This cuts down the size of the devcoredumps
> by only including relevant information.
>
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
Anyone up for reviewing this one?
Regards,
Lucas
> ---
> drivers/gpu/drm/etnaviv/etnaviv_dump.c | 57 +++++++++----------------
> drivers/gpu/drm/etnaviv/etnaviv_dump.h | 4 +-
> drivers/gpu/drm/etnaviv/etnaviv_sched.c | 2 +-
> 3 files changed, 22 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_dump.c b/drivers/gpu/drm/etnaviv/etnaviv_dump.c
> index 515515ef24f9..bab09bae35d0 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_dump.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_dump.c
> @@ -91,9 +91,9 @@ static void etnaviv_core_dump_registers(struct core_dump_iterator *iter,
> }
>
> static void etnaviv_core_dump_mmu(struct core_dump_iterator *iter,
> > - struct etnaviv_gpu *gpu, size_t mmu_size)
> > + struct etnaviv_iommu *mmu, size_t mmu_size)
> {
> > - etnaviv_iommu_dump(gpu->mmu, iter->data);
> > + etnaviv_iommu_dump(mmu, iter->data);
>
> > etnaviv_core_dump_header(iter, ETDUMP_BUF_MMU, iter->data + mmu_size);
> }
> @@ -108,17 +108,15 @@ static void etnaviv_core_dump_mem(struct core_dump_iterator *iter, u32 type,
> > etnaviv_core_dump_header(iter, type, iter->data + size);
> }
>
> -void etnaviv_core_dump(struct etnaviv_gpu *gpu)
> +void etnaviv_core_dump(struct etnaviv_gem_submit *submit)
> {
> > + struct etnaviv_gpu *gpu = submit->gpu;
> > struct core_dump_iterator iter;
> > - struct etnaviv_vram_mapping *vram;
> > struct etnaviv_gem_object *obj;
> > - struct etnaviv_gem_submit *submit;
> > - struct drm_sched_job *s_job;
> > unsigned int n_obj, n_bomap_pages;
> > size_t file_size, mmu_size;
> > __le64 *bomap, *bomap_start;
> > - unsigned long flags;
> > + int i;
>
> > /* Only catch the first event, or when manually re-armed */
> > if (!etnaviv_dump_core)
> @@ -129,28 +127,16 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu)
>
> > mmu_size = etnaviv_iommu_dump_size(gpu->mmu);
>
> > - /* We always dump registers, mmu, ring and end marker */
> > - n_obj = 4;
> > + /* We always dump registers, mmu, ring, hanging cmdbuf and end marker */
> > + n_obj = 5;
> > n_bomap_pages = 0;
> > file_size = ARRAY_SIZE(etnaviv_dump_registers) *
> > sizeof(struct etnaviv_dump_registers) +
> > - mmu_size + gpu->buffer.size;
> -
> > - /* Add in the active command buffers */
> > - spin_lock_irqsave(&gpu->sched.job_list_lock, flags);
> > - list_for_each_entry(s_job, &gpu->sched.ring_mirror_list, node) {
> > - submit = to_etnaviv_submit(s_job);
> > - file_size += submit->cmdbuf.size;
> > - n_obj++;
> > - }
> > - spin_unlock_irqrestore(&gpu->sched.job_list_lock, flags);
> > + mmu_size + gpu->buffer.size + submit->cmdbuf.size;
>
> > /* Add in the active buffer objects */
> > - list_for_each_entry(vram, &gpu->mmu->mappings, mmu_node) {
> > - if (!vram->use)
> > - continue;
> -
> > - obj = vram->object;
> > + for (i = 0; i < submit->nr_bos; i++) {
> > + obj = submit->bos[i].obj;
> > file_size += obj->base.size;
> > n_bomap_pages += obj->base.size >> PAGE_SHIFT;
> > n_obj++;
> @@ -181,19 +167,15 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu)
> > memset(iter.hdr, 0, iter.data - iter.start);
>
> > etnaviv_core_dump_registers(&iter, gpu);
> > - etnaviv_core_dump_mmu(&iter, gpu, mmu_size);
> > + etnaviv_core_dump_mmu(&iter, gpu->mmu, mmu_size);
> +
> > etnaviv_core_dump_mem(&iter, ETDUMP_BUF_RING, gpu->buffer.vaddr,
> > gpu->buffer.size,
> > etnaviv_cmdbuf_get_va(&gpu->buffer));
>
> > - spin_lock_irqsave(&gpu->sched.job_list_lock, flags);
> > - list_for_each_entry(s_job, &gpu->sched.ring_mirror_list, node) {
> > - submit = to_etnaviv_submit(s_job);
> > - etnaviv_core_dump_mem(&iter, ETDUMP_BUF_CMD,
> > - submit->cmdbuf.vaddr, submit->cmdbuf.size,
> > - etnaviv_cmdbuf_get_va(&submit->cmdbuf));
> > - }
> > - spin_unlock_irqrestore(&gpu->sched.job_list_lock, flags);
> > + etnaviv_core_dump_mem(&iter, ETDUMP_BUF_CMD,
> > + submit->cmdbuf.vaddr, submit->cmdbuf.size,
> > + etnaviv_cmdbuf_get_va(&submit->cmdbuf));
>
> > /* Reserve space for the bomap */
> > if (n_bomap_pages) {
> @@ -206,14 +188,13 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu)
> > bomap_start = bomap = NULL;
> > }
>
> > - list_for_each_entry(vram, &gpu->mmu->mappings, mmu_node) {
> > + for (i = 0; i < submit->nr_bos; i++) {
> > + struct etnaviv_vram_mapping *vram;
> > struct page **pages;
> > void *vaddr;
>
> > - if (vram->use == 0)
> > - continue;
> -
> > - obj = vram->object;
> > + obj = submit->bos[i].obj;
> > + vram = submit->bos[i].mapping;
>
> > mutex_lock(&obj->lock);
> > pages = etnaviv_gem_get_pages(obj);
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_dump.h b/drivers/gpu/drm/etnaviv/etnaviv_dump.h
> index 2d916c2667ee..a125c46b895b 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_dump.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_dump.h
> @@ -35,8 +35,8 @@ struct etnaviv_dump_registers {
> };
>
> #ifdef __KERNEL__
> -struct etnaviv_gpu;
> -void etnaviv_core_dump(struct etnaviv_gpu *gpu);
> +struct etnaviv_gem_submit;
> +void etnaviv_core_dump(struct etnaviv_gem_submit *submit);
> #endif
>
> #endif
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_sched.c b/drivers/gpu/drm/etnaviv/etnaviv_sched.c
> index 6d24fea1766b..b2e0a34bb796 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_sched.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_sched.c
> @@ -115,7 +115,7 @@ static void etnaviv_sched_timedout_job(struct drm_sched_job *sched_job)
> > drm_sched_increase_karma(sched_job);
>
> > /* get the GPU back into the init state */
> > - etnaviv_core_dump(gpu);
> > + etnaviv_core_dump(submit);
> > etnaviv_gpu_recover_hang(gpu);
>
> > drm_sched_resubmit_jobs(&gpu->sched);
More information about the dri-devel
mailing list