diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-11-17 10:58:46 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-11-17 15:30:23 -0500 |
commit | 6288c79ea519f6ca3a54d87974b48ca6a8b986af (patch) | |
tree | 4d90b793f4ee66d0083520b973065e98a9783c6f | |
parent | a194b8cb849586306b3f097cfc87c6ccdd7e4ecd (diff) |
drm/i915: Add a few more sanity checks for stolen handling
We should never be called via obj->ops->release() on anything other than
a fully formed stolen object, so raise that to an assert. In the process
tidy up a comment and variable no longer used outside of a conditional
BUG.
Reported-by: kbuild test robot <fengguang.wu@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/20161117155846.4631-1-chris@chris-wilson.co.uk
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_stolen.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index 9b182ed93f3e..5bc9f699fdd2 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | |||
@@ -513,11 +513,10 @@ i915_pages_create_for_stolen(struct drm_device *dev, | |||
513 | u32 offset, u32 size) | 513 | u32 offset, u32 size) |
514 | { | 514 | { |
515 | struct drm_i915_private *dev_priv = to_i915(dev); | 515 | struct drm_i915_private *dev_priv = to_i915(dev); |
516 | struct i915_ggtt *ggtt = &dev_priv->ggtt; | ||
517 | struct sg_table *st; | 516 | struct sg_table *st; |
518 | struct scatterlist *sg; | 517 | struct scatterlist *sg; |
519 | 518 | ||
520 | GEM_BUG_ON(offset > ggtt->stolen_size - size); | 519 | GEM_BUG_ON(offset > dev_priv->ggtt.stolen_size - size); |
521 | 520 | ||
522 | /* We hide that we have no struct page backing our stolen object | 521 | /* We hide that we have no struct page backing our stolen object |
523 | * by wrapping the contiguous physical allocation with a fake | 522 | * by wrapping the contiguous physical allocation with a fake |
@@ -554,7 +553,7 @@ i915_gem_object_get_pages_stolen(struct drm_i915_gem_object *obj) | |||
554 | static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj, | 553 | static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj, |
555 | struct sg_table *pages) | 554 | struct sg_table *pages) |
556 | { | 555 | { |
557 | /* Should only be called during free */ | 556 | /* Should only be called from i915_gem_object_release_stolen() */ |
558 | sg_free_table(pages); | 557 | sg_free_table(pages); |
559 | kfree(pages); | 558 | kfree(pages); |
560 | } | 559 | } |
@@ -563,15 +562,16 @@ static void | |||
563 | i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) | 562 | i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) |
564 | { | 563 | { |
565 | struct drm_i915_private *dev_priv = to_i915(obj->base.dev); | 564 | struct drm_i915_private *dev_priv = to_i915(obj->base.dev); |
565 | struct drm_mm_node *stolen = fetch_and_zero(&obj->stolen); | ||
566 | |||
567 | GEM_BUG_ON(!stolen); | ||
566 | 568 | ||
567 | __i915_gem_object_unpin_pages(obj); | 569 | __i915_gem_object_unpin_pages(obj); |
568 | 570 | ||
569 | if (obj->stolen) { | 571 | i915_gem_stolen_remove_node(dev_priv, stolen); |
570 | i915_gem_stolen_remove_node(dev_priv, obj->stolen); | 572 | kfree(stolen); |
571 | kfree(obj->stolen); | ||
572 | obj->stolen = NULL; | ||
573 | } | ||
574 | } | 573 | } |
574 | |||
575 | static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = { | 575 | static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = { |
576 | .get_pages = i915_gem_object_get_pages_stolen, | 576 | .get_pages = i915_gem_object_get_pages_stolen, |
577 | .put_pages = i915_gem_object_put_pages_stolen, | 577 | .put_pages = i915_gem_object_put_pages_stolen, |