[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