aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_stolen.c
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2013-07-05 17:41:02 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-07-08 16:04:32 -0400
commitb3a070cccb9135f8bec63d9f194ddaa422136fb0 (patch)
tree64459a4af873cf5a1db2ddcd1d86d3bea24d7a38 /drivers/gpu/drm/i915/i915_gem_stolen.c
parentb79480ba5074ae81d1c32073bce3981652e0f717 (diff)
drm: pre allocate node for create_block
For an upcoming patch where we introduce the i915 VMA, it's ideal to have the drm_mm_node as part of the VMA struct (ie. it's pre-allocated). Part of the conversion to VMAs is to kill off obj->gtt_space. Doing this will break a bunch of code, but amongst them are 2 callers of drm_mm_create_block(), both related to stolen memory. It also allows us to embed the drm_mm_node into the object currently which provides a nice transition over to the new code. v2: Reordered to do before ripping out obj->gtt_offset. Some minor cleanups made available because of reordering. v3: s/continue/break on failed stolen node allocation (David) Set obj->gtt_space on failed node allocation (David) Only unref stolen (fix double free) on failed create_stolen (David) Free node, and NULL it in failed create_stolen (David) Add back accidentally removed newline (David) CC: <dri-devel@lists.freedesktop.org> Reviewed-by: David Herrmann <dh.herrmann@gmail.com> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Acked-by: David Airlie <airlied@linux.ie> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_stolen.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_stolen.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c
index 0f18d75fa9f8..2746ff2d846a 100644
--- a/drivers/gpu/drm/i915/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
@@ -330,6 +330,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
330 struct drm_i915_private *dev_priv = dev->dev_private; 330 struct drm_i915_private *dev_priv = dev->dev_private;
331 struct drm_i915_gem_object *obj; 331 struct drm_i915_gem_object *obj;
332 struct drm_mm_node *stolen; 332 struct drm_mm_node *stolen;
333 int ret;
333 334
334 if (dev_priv->mm.stolen_base == 0) 335 if (dev_priv->mm.stolen_base == 0)
335 return NULL; 336 return NULL;
@@ -344,11 +345,15 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
344 if (WARN_ON(size == 0)) 345 if (WARN_ON(size == 0))
345 return NULL; 346 return NULL;
346 347
347 stolen = drm_mm_create_block(&dev_priv->mm.stolen, 348 stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
348 stolen_offset, size, 349 if (!stolen)
349 false); 350 return NULL;
350 if (stolen == NULL) { 351
352 ret = drm_mm_create_block(&dev_priv->mm.stolen, stolen, stolen_offset,
353 size);
354 if (ret) {
351 DRM_DEBUG_KMS("failed to allocate stolen space\n"); 355 DRM_DEBUG_KMS("failed to allocate stolen space\n");
356 kfree(stolen);
352 return NULL; 357 return NULL;
353 } 358 }
354 359
@@ -369,13 +374,18 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
369 * later. 374 * later.
370 */ 375 */
371 if (drm_mm_initialized(&dev_priv->mm.gtt_space)) { 376 if (drm_mm_initialized(&dev_priv->mm.gtt_space)) {
372 obj->gtt_space = drm_mm_create_block(&dev_priv->mm.gtt_space, 377 obj->gtt_space = kzalloc(sizeof(*obj->gtt_space), GFP_KERNEL);
373 gtt_offset, size, 378 if (!obj->gtt_space) {
374 false); 379 DRM_DEBUG_KMS("-ENOMEM stolen GTT space\n");
375 if (obj->gtt_space == NULL) { 380 goto unref_out;
381 }
382
383 ret = drm_mm_create_block(&dev_priv->mm.gtt_space,
384 obj->gtt_space,
385 gtt_offset, size);
386 if (ret) {
376 DRM_DEBUG_KMS("failed to allocate stolen GTT space\n"); 387 DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
377 drm_gem_object_unreference(&obj->base); 388 goto free_out;
378 return NULL;
379 } 389 }
380 } else 390 } else
381 obj->gtt_space = I915_GTT_RESERVED; 391 obj->gtt_space = I915_GTT_RESERVED;
@@ -387,6 +397,13 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
387 list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list); 397 list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
388 398
389 return obj; 399 return obj;
400
401free_out:
402 kfree(obj->gtt_space);
403 obj->gtt_space = NULL;
404unref_out:
405 drm_gem_object_unreference(&obj->base);
406 return NULL;
390} 407}
391 408
392void 409void