Skip to content

Commit

Permalink
drm/i915/guc: Avoid reclaim locks during reset
Browse files Browse the repository at this point in the history
During reset, we must be very selective in which locks we take as most
are tainted by being held across a wait or reclaim (kmalloc) which
implicitly waits. Inside the guc reset path, we reset the ADS to sane
defaults, but must keep it pinned from initialisation to avoid having to
pin it during reset.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190701100502.15639-1-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson committed Jul 1, 2019
1 parent 3ee2771 commit f18819a
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 13 deletions.
4 changes: 4 additions & 0 deletions drivers/gpu/drm/i915/intel_guc.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
#include "i915_utils.h"
#include "i915_vma.h"

struct __guc_ads_blob;

struct guc_preempt_work {
struct work_struct work;
struct intel_engine_cs *engine;
Expand Down Expand Up @@ -65,6 +67,8 @@ struct intel_guc {
} interrupts;

struct i915_vma *ads_vma;
struct __guc_ads_blob *ads_blob;

struct i915_vma *stage_desc_pool;
void *stage_desc_pool_vaddr;
struct ida stage_ids;
Expand Down
26 changes: 13 additions & 13 deletions drivers/gpu/drm/i915/intel_guc_ads.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,18 +83,14 @@ struct __guc_ads_blob {
u8 reg_state_buffer[GUC_S3_SAVE_SPACE_PAGES * PAGE_SIZE];
} __packed;

static int __guc_ads_init(struct intel_guc *guc)
static void __guc_ads_init(struct intel_guc *guc)
{
struct drm_i915_private *dev_priv = guc_to_i915(guc);
struct __guc_ads_blob *blob;
struct __guc_ads_blob *blob = guc->ads_blob;
const u32 skipped_size = LRC_PPHWSP_SZ * PAGE_SIZE + LR_HW_CONTEXT_SIZE;
u32 base;
u8 engine_class;

blob = i915_gem_object_pin_map(guc->ads_vma->obj, I915_MAP_WB);
if (IS_ERR(blob))
return PTR_ERR(blob);

/* GuC scheduling policies */
guc_policies_init(&blob->policies);

Expand Down Expand Up @@ -144,9 +140,7 @@ static int __guc_ads_init(struct intel_guc *guc)
blob->ads.gt_system_info = base + ptr_offset(blob, system_info);
blob->ads.clients_info = base + ptr_offset(blob, clients_info);

i915_gem_object_unpin_map(guc->ads_vma->obj);

return 0;
i915_gem_object_flush_map(guc->ads_vma->obj);
}

/**
Expand All @@ -160,6 +154,7 @@ int intel_guc_ads_create(struct intel_guc *guc)
{
const u32 size = PAGE_ALIGN(sizeof(struct __guc_ads_blob));
struct i915_vma *vma;
void *blob;
int ret;

GEM_BUG_ON(guc->ads_vma);
Expand All @@ -168,11 +163,16 @@ int intel_guc_ads_create(struct intel_guc *guc)
if (IS_ERR(vma))
return PTR_ERR(vma);

blob = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
if (IS_ERR(blob)) {
ret = PTR_ERR(blob);
goto err_vma;
}

guc->ads_vma = vma;
guc->ads_blob = blob;

ret = __guc_ads_init(guc);
if (ret)
goto err_vma;
__guc_ads_init(guc);

return 0;

Expand All @@ -183,7 +183,7 @@ int intel_guc_ads_create(struct intel_guc *guc)

void intel_guc_ads_destroy(struct intel_guc *guc)
{
i915_vma_unpin_and_release(&guc->ads_vma, 0);
i915_vma_unpin_and_release(&guc->ads_vma, I915_VMA_RELEASE_MAP);
}

/**
Expand Down

0 comments on commit f18819a

Please sign in to comment.