i965: Mark shader programs for capture in the error state.

When the GPU hangs, the kernel saves some state for us. Until now it has
not included the shader programs, which are very often the reason the
GPU hang occurred. With the programs saved in the error state, we should
be more capable of debugging hangs.

Thanks to Chris Wilson and Ben Widawsky who provided the kernel support
for this feature ("drm/i915: Copy user requested buffers into the error
state"), which will be in kernel v4.13.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
This commit is contained in:
Matt Turner 2017-04-25 10:00:19 -07:00
parent 0aa578714e
commit 8ca8ebbf78
6 changed files with 26 additions and 1 deletions

View file

@ -599,6 +599,7 @@ bo_unreference_final(struct brw_bo *bo, time_t time)
bo->free_time = time;
bo->name = NULL;
bo->kflags = 0;
list_addtail(&bo->head, &bucket->head);
} else {

View file

@ -97,6 +97,11 @@ struct brw_bo {
int refcount;
const char *name;
#ifndef EXEC_OBJECT_CAPTURE
#define EXEC_OBJECT_CAPTURE (1<<7)
#endif
uint64_t kflags;
/**
* Kenel-assigned global name for this object
*

View file

@ -216,6 +216,8 @@ brw_cache_new_bo(struct brw_cache *cache, uint32_t new_size)
struct brw_bo *new_bo;
new_bo = brw_bo_alloc(brw->bufmgr, "program cache", new_size, 64);
if (can_do_exec_capture(brw->screen))
new_bo->kflags = EXEC_OBJECT_CAPTURE;
if (brw->has_llc)
brw_bo_map_unsynchronized(brw, new_bo);
@ -407,6 +409,8 @@ brw_init_caches(struct brw_context *brw)
calloc(cache->size, sizeof(struct brw_cache_item *));
cache->bo = brw_bo_alloc(brw->bufmgr, "program cache", 4096, 64);
if (can_do_exec_capture(brw->screen))
cache->bo->kflags = EXEC_OBJECT_CAPTURE;
if (brw->has_llc)
brw_bo_map_unsynchronized(brw, cache->bo);
}

View file

@ -550,7 +550,7 @@ add_exec_bo(struct intel_batchbuffer *batch, struct brw_bo *bo)
}
validation_entry->alignment = bo->align;
validation_entry->offset = bo->offset64;
validation_entry->flags = 0;
validation_entry->flags = bo->kflags;
validation_entry->rsvd1 = 0;
validation_entry->rsvd2 = 0;

View file

@ -2029,6 +2029,14 @@ __DRIconfig **intelInitScreen2(__DRIscreen *dri_screen)
screen->cmd_parser_version = 0;
}
/* Kernel 4.13 retuired for exec object capture */
#ifndef I915_PARAM_HAS_EXEC_CAPTURE
#define I915_PARAM_HAS_EXEC_CAPTURE 45
#endif
if (intel_get_boolean(screen, I915_PARAM_HAS_EXEC_CAPTURE)) {
screen->kernel_features |= KERNEL_ALLOWS_EXEC_CAPTURE;
}
if (!intel_detect_pipelined_so(screen)) {
/* We can't do anything, so the effective version is 0. */
screen->cmd_parser_version = 0;

View file

@ -74,6 +74,7 @@ struct intel_screen
#define KERNEL_ALLOWS_MI_MATH_AND_LRR (1<<2)
#define KERNEL_ALLOWS_HSW_SCRATCH1_AND_ROW_CHICKEN3 (1<<3)
#define KERNEL_ALLOWS_COMPUTE_DISPATCH (1<<4)
#define KERNEL_ALLOWS_EXEC_CAPTURE (1<<5)
struct brw_bufmgr *bufmgr;
@ -155,6 +156,12 @@ can_do_predicate_writes(const struct intel_screen *screen)
return screen->kernel_features & KERNEL_ALLOWS_PREDICATE_WRITES;
}
static inline bool
can_do_exec_capture(const struct intel_screen *screen)
{
return screen->kernel_features & KERNEL_ALLOWS_EXEC_CAPTURE;
}
#ifdef __cplusplus
}
#endif