Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/etnaviv: dump only failing submit

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@pengutronix.de>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>

+16 -31
+15 -30
drivers/gpu/drm/etnaviv/etnaviv_dump.c
··· 110 110 etnaviv_core_dump_header(iter, type, iter->data + size); 111 111 } 112 112 113 - void etnaviv_core_dump(struct etnaviv_gpu *gpu) 113 + void etnaviv_core_dump(struct etnaviv_gem_submit *submit) 114 114 { 115 + struct etnaviv_gpu *gpu = submit->gpu; 115 116 struct core_dump_iterator iter; 116 - struct etnaviv_vram_mapping *vram; 117 117 struct etnaviv_gem_object *obj; 118 - struct etnaviv_gem_submit *submit; 119 - struct drm_sched_job *s_job; 120 118 unsigned int n_obj, n_bomap_pages; 121 119 size_t file_size, mmu_size; 122 120 __le64 *bomap, *bomap_start; 121 + int i; 123 122 124 123 /* Only catch the first event, or when manually re-armed */ 125 124 if (!etnaviv_dump_core) ··· 129 130 130 131 mmu_size = etnaviv_iommu_dump_size(gpu->mmu); 131 132 132 - /* We always dump registers, mmu, ring and end marker */ 133 - n_obj = 4; 133 + /* We always dump registers, mmu, ring, hanging cmdbuf and end marker */ 134 + n_obj = 5; 134 135 n_bomap_pages = 0; 135 136 file_size = ARRAY_SIZE(etnaviv_dump_registers) * 136 137 sizeof(struct etnaviv_dump_registers) + 137 - mmu_size + gpu->buffer.size; 138 - 139 - /* Add in the active command buffers */ 140 - list_for_each_entry(s_job, &gpu->sched.ring_mirror_list, node) { 141 - submit = to_etnaviv_submit(s_job); 142 - file_size += submit->cmdbuf.size; 143 - n_obj++; 144 - } 138 + mmu_size + gpu->buffer.size + submit->cmdbuf.size; 145 139 146 140 /* Add in the active buffer objects */ 147 - list_for_each_entry(vram, &gpu->mmu->mappings, mmu_node) { 148 - if (!vram->use) 149 - continue; 150 - 151 - obj = vram->object; 141 + for (i = 0; i < submit->nr_bos; i++) { 142 + obj = submit->bos[i].obj; 152 143 file_size += obj->base.size; 153 144 n_bomap_pages += obj->base.size >> PAGE_SHIFT; 154 145 n_obj++; ··· 174 185 gpu->buffer.size, 175 186 etnaviv_cmdbuf_get_va(&gpu->buffer)); 176 187 177 - list_for_each_entry(s_job, &gpu->sched.ring_mirror_list, node) { 178 - submit = to_etnaviv_submit(s_job); 179 - etnaviv_core_dump_mem(&iter, ETDUMP_BUF_CMD, 180 - submit->cmdbuf.vaddr, submit->cmdbuf.size, 181 - etnaviv_cmdbuf_get_va(&submit->cmdbuf)); 182 - } 188 + etnaviv_core_dump_mem(&iter, ETDUMP_BUF_CMD, 189 + submit->cmdbuf.vaddr, submit->cmdbuf.size, 190 + etnaviv_cmdbuf_get_va(&submit->cmdbuf)); 183 191 184 192 /* Reserve space for the bomap */ 185 193 if (n_bomap_pages) { ··· 189 203 bomap_start = bomap = NULL; 190 204 } 191 205 192 - list_for_each_entry(vram, &gpu->mmu->mappings, mmu_node) { 206 + for (i = 0; i < submit->nr_bos; i++) { 207 + struct etnaviv_vram_mapping *vram; 193 208 struct page **pages; 194 209 void *vaddr; 195 210 196 - if (vram->use == 0) 197 - continue; 198 - 199 - obj = vram->object; 211 + obj = submit->bos[i].obj; 212 + vram = submit->bos[i].mapping; 200 213 201 214 mutex_lock(&obj->lock); 202 215 pages = etnaviv_gem_get_pages(obj);
+1 -1
drivers/gpu/drm/etnaviv/etnaviv_sched.c
··· 115 115 drm_sched_increase_karma(sched_job); 116 116 117 117 /* get the GPU back into the init state */ 118 - etnaviv_core_dump(gpu); 118 + etnaviv_core_dump(submit); 119 119 etnaviv_gpu_recover_hang(gpu); 120 120 121 121 drm_sched_resubmit_jobs(&gpu->sched);