lkml.org 
[lkml]   [2019]   [Jan]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 34/50] drm/i915: Unwind failure on pinning the gen7 ppgtt
    Date
    4.19-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Chris Wilson <chris@chris-wilson.co.uk>

    commit 280d479b310298dfeb1d6f9a1617eca37beb6ce4 upstream.

    If we fail to pin the ggtt vma slot for the ppgtt page tables, we need
    to unwind the locals before reporting the error. Or else on subsequent
    attempts to bind the page tables into the ggtt, we will already believe
    that the vma has been pinned and continue on blithely. If something else
    should happen to be at that location, choas ensues.

    Fixes: a2bbf7148342 ("drm/i915/gtt: Only keep gen6 page directories pinned while active")
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
    Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
    Cc: Matthew Auld <matthew.william.auld@gmail.com>
    Cc: <stable@vger.kernel.org> # v4.19+
    Reviewed-by: Matthew Auld <matthew.william.auld@gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20181222030623.21710-1-chris@chris-wilson.co.uk
    (cherry picked from commit d4de753526f4d99f541f1b6ed1d963005c09700c)
    Signed-off-by: Jani Nikula <jani.nikula@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/gpu/drm/i915/i915_gem_gtt.c | 15 ++++++++++++---
    1 file changed, 12 insertions(+), 3 deletions(-)

    --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
    +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
    @@ -2128,6 +2128,7 @@ static struct i915_vma *pd_vma_create(st
    int gen6_ppgtt_pin(struct i915_hw_ppgtt *base)
    {
    struct gen6_hw_ppgtt *ppgtt = to_gen6_ppgtt(base);
    + int err;

    /*
    * Workaround the limited maximum vma->pin_count and the aliasing_ppgtt
    @@ -2143,9 +2144,17 @@ int gen6_ppgtt_pin(struct i915_hw_ppgtt
    * allocator works in address space sizes, so it's multiplied by page
    * size. We allocate at the top of the GTT to avoid fragmentation.
    */
    - return i915_vma_pin(ppgtt->vma,
    - 0, GEN6_PD_ALIGN,
    - PIN_GLOBAL | PIN_HIGH);
    + err = i915_vma_pin(ppgtt->vma,
    + 0, GEN6_PD_ALIGN,
    + PIN_GLOBAL | PIN_HIGH);
    + if (err)
    + goto unpin;
    +
    + return 0;
    +
    +unpin:
    + ppgtt->pin_count = 0;
    + return err;
    }

    void gen6_ppgtt_unpin(struct i915_hw_ppgtt *base)

    \
     
     \ /
      Last update: 2019-01-15 17:56    [W:4.194 / U:1.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site