[Mesa-dev] [PATCH 01/11] i965: Mark shader programs for capture in the error state.

Pohjolainen, Topi topi.pohjolainen at gmail.com
Sat May 13 04:22:51 UTC 2017


On Mon, May 01, 2017 at 01:54:45PM -0700, Matt Turner wrote:
> 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 at intel.com>

> ---
>  src/mesa/drivers/dri/i965/brw_bufmgr.c        | 1 +
>  src/mesa/drivers/dri/i965/brw_bufmgr.h        | 5 +++++
>  src/mesa/drivers/dri/i965/brw_program_cache.c | 4 ++++
>  src/mesa/drivers/dri/i965/intel_batchbuffer.c | 2 +-
>  src/mesa/drivers/dri/i965/intel_screen.c      | 8 ++++++++
>  src/mesa/drivers/dri/i965/intel_screen.h      | 7 +++++++
>  6 files changed, 26 insertions(+), 1 deletion(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c b/src/mesa/drivers/dri/i965/brw_bufmgr.c
> index 4b64331..2f17934 100644
> --- a/src/mesa/drivers/dri/i965/brw_bufmgr.c
> +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c
> @@ -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 {
> diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h b/src/mesa/drivers/dri/i965/brw_bufmgr.h
> index 1b1790a..56ec206 100644
> --- a/src/mesa/drivers/dri/i965/brw_bufmgr.h
> +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h
> @@ -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
>      *
> diff --git a/src/mesa/drivers/dri/i965/brw_program_cache.c b/src/mesa/drivers/dri/i965/brw_program_cache.c
> index c06ee23..93eb119 100644
> --- a/src/mesa/drivers/dri/i965/brw_program_cache.c
> +++ b/src/mesa/drivers/dri/i965/brw_program_cache.c
> @@ -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);
>  }
> diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> index 154c095..496b492 100644
> --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> @@ -530,7 +530,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;
>  
> diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
> index 34a5f18..514c17e 100644
> --- a/src/mesa/drivers/dri/i965/intel_screen.c
> +++ b/src/mesa/drivers/dri/i965/intel_screen.c
> @@ -1994,6 +1994,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;
> diff --git a/src/mesa/drivers/dri/i965/intel_screen.h b/src/mesa/drivers/dri/i965/intel_screen.h
> index fe0e044..f9c1db6 100644
> --- a/src/mesa/drivers/dri/i965/intel_screen.h
> +++ b/src/mesa/drivers/dri/i965/intel_screen.h
> @@ -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
> -- 
> 2.10.2
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list