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@xxxxxxxxxxxxxx> 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); _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel