Skip to content

Commit

Permalink
drm/i915/bdw: Free PPGTT struct
Browse files Browse the repository at this point in the history
GEN8 never freed the PPGTT struct. As GEN8 doesn't use full PPGTT, the
leak is small and only found on a module reload. ie. I don't think this
needs to go to stable.

v2: The very naive, kfree in gen8 ppgtt cleanup, is subject to a double
free on PPGTT initialization failure. (Spotted by Imre). Instead this
patch pulls the ppgtt struct freeing out of the cleanup and leaves it to
the allocators/callers or the one doing the last kref_put as in standard
convention

Reported-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Ben Widawsky authored and Daniel Vetter committed Mar 4, 2014
1 parent 321f2ad commit b18b6bd
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 3 deletions.
12 changes: 10 additions & 2 deletions drivers/gpu/drm/i915/i915_gem_context.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,8 @@
static int do_switch(struct intel_ring_buffer *ring,
struct i915_hw_context *to);

static void ppgtt_release(struct kref *kref)
static void do_ppgtt_cleanup(struct i915_hw_ppgtt *ppgtt)
{
struct i915_hw_ppgtt *ppgtt = container_of(kref, struct i915_hw_ppgtt, ref);
struct drm_device *dev = ppgtt->base.dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct i915_address_space *vm = &ppgtt->base;
Expand Down Expand Up @@ -135,6 +134,15 @@ static void ppgtt_release(struct kref *kref)
ppgtt->base.cleanup(&ppgtt->base);
}

static void ppgtt_release(struct kref *kref)
{
struct i915_hw_ppgtt *ppgtt =
container_of(kref, struct i915_hw_ppgtt, ref);

do_ppgtt_cleanup(ppgtt);
kfree(ppgtt);
}

static size_t get_context_alignment(struct drm_device *dev)
{
if (IS_GEN6(dev))
Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/i915/i915_gem_gtt.c
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,6 @@ static void gen6_ppgtt_cleanup(struct i915_address_space *vm)
for (i = 0; i < ppgtt->num_pd_entries; i++)
__free_page(ppgtt->pt_pages[i]);
kfree(ppgtt->pt_pages);
kfree(ppgtt);
}

static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
Expand Down

0 comments on commit b18b6bd

Please sign in to comment.