Reviewed-by: CQ Tang <cq.tang@xxxxxxxxx> --CQ > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of > Chris Wilson > Sent: Monday, October 19, 2020 1:35 AM > To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx > Cc: Auld, Matthew <matthew.auld@xxxxxxxxx>; Chris Wilson <chris@chris- > wilson.co.uk> > Subject: [PATCH] drm/i915/gt: Onion unwind for scratch page > allocation failure > > In switching to using objects for our ppGTT scratch pages, care was not taken > to avoid trying to unref NULL objects on failure. And for gen6 ppGTT, it > appears we forgot entirely to unwind after a partial allocation failure. > > Fixes: 89351925a477 ("drm/i915/gt: Switch to object allocations for page > directories") > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Matthew Auld <matthew.auld@xxxxxxxxx> > Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/gt/gen6_ppgtt.c | 18 ++++++++++++------ > drivers/gpu/drm/i915/gt/gen8_ppgtt.c | 3 ++- > 2 files changed, 14 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gt/gen6_ppgtt.c > b/drivers/gpu/drm/i915/gt/gen6_ppgtt.c > index c0d17f87b00f..680bd9442eb0 100644 > --- a/drivers/gpu/drm/i915/gt/gen6_ppgtt.c > +++ b/drivers/gpu/drm/i915/gt/gen6_ppgtt.c > @@ -239,18 +239,24 @@ static int gen6_ppgtt_init_scratch(struct > gen6_ppgtt *ppgtt) > I915_CACHE_NONE, PTE_READ_ONLY); > > vm->scratch[1] = vm->alloc_pt_dma(vm, I915_GTT_PAGE_SIZE_4K); > - if (IS_ERR(vm->scratch[1])) > - return PTR_ERR(vm->scratch[1]); > + if (IS_ERR(vm->scratch[1])) { > + ret = PTR_ERR(vm->scratch[1]); > + goto err_scratch0; > + } > > ret = pin_pt_dma(vm, vm->scratch[1]); > - if (ret) { > - i915_gem_object_put(vm->scratch[1]); > - return ret; > - } > + if (ret) > + goto err_scratch1; > > fill32_px(vm->scratch[1], vm->scratch[0]->encode); > > return 0; > + > +err_scratch1: > + i915_gem_object_put(vm->scratch[1]); > +err_scratch0: > + i915_gem_object_put(vm->scratch[0]); > + return ret; > } > > static void gen6_ppgtt_free_pd(struct gen6_ppgtt *ppgtt) diff --git > a/drivers/gpu/drm/i915/gt/gen8_ppgtt.c > b/drivers/gpu/drm/i915/gt/gen8_ppgtt.c > index b236aa046f91..a37c968ef8f7 100644 > --- a/drivers/gpu/drm/i915/gt/gen8_ppgtt.c > +++ b/drivers/gpu/drm/i915/gt/gen8_ppgtt.c > @@ -607,7 +607,8 @@ static int gen8_init_scratch(struct i915_address_space > *vm) > return 0; > > free_scratch: > - free_scratch(vm); > + while (i--) > + i915_gem_object_put(vm->scratch[i]); > return -ENOMEM; > } > > -- > 2.20.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx