From: Ankitprasad Sharma <ankitprasad.r.sharma@xxxxxxxxx> Propagating correct error codes to userspace by using ERR_PTR and PTR_ERR macros for stolen memory based object allocation. We generally return -ENOMEM to the user whenever there is a failure in object allocation. This patch helps user to identify the correct reason for the failure and not just -ENOMEM each time. Signed-off-by: Ankitprasad Sharma <ankitprasad.r.sharma@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_gem.c | 4 ++-- drivers/gpu/drm/i915/i915_gem_stolen.c | 39 +++++++++++++++++++-------------- drivers/gpu/drm/i915/intel_display.c | 2 +- drivers/gpu/drm/i915/intel_fbdev.c | 2 +- drivers/gpu/drm/i915/intel_overlay.c | 4 ++-- drivers/gpu/drm/i915/intel_pm.c | 2 +- drivers/gpu/drm/i915/intel_ringbuffer.c | 4 ++-- 7 files changed, 31 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index b4c64d6..586610e 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -393,9 +393,9 @@ i915_gem_create(struct drm_file *file, if (flags & I915_CREATE_PLACEMENT_STOLEN) { mutex_lock(&dev->struct_mutex); obj = i915_gem_object_create_stolen(dev, size); - if (!obj) { + if (IS_ERR(obj)) { mutex_unlock(&dev->struct_mutex); - return -ENOMEM; + return PTR_ERR(obj); } /* Always clear fresh buffers before handing to userspace */ diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index d3c44cb..84ca15a 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c @@ -366,6 +366,7 @@ i915_pages_create_for_stolen(struct drm_device *dev, struct drm_i915_private *dev_priv = dev->dev_private; struct sg_table *st; struct scatterlist *sg; + int ret; DRM_DEBUG_DRIVER("offset=0x%x, size=%d\n", offset, size); BUG_ON(offset > dev_priv->gtt.stolen_size - size); @@ -377,11 +378,12 @@ i915_pages_create_for_stolen(struct drm_device *dev, st = kmalloc(sizeof(*st), GFP_KERNEL); if (st == NULL) - return NULL; + return ERR_PTR(-ENOMEM); - if (sg_alloc_table(st, 1, GFP_KERNEL)) { + ret = sg_alloc_table(st, 1, GFP_KERNEL); + if (ret) { kfree(st); - return NULL; + return ERR_PTR(ret); } sg = st->sgl; @@ -431,10 +433,11 @@ _i915_gem_object_create_stolen(struct drm_device *dev, struct i915_stolen_node *stolen) { struct drm_i915_gem_object *obj; + int ret; obj = i915_gem_object_alloc(dev); if (obj == NULL) - return NULL; + return ERR_PTR(-ENOMEM); drm_gem_private_object_init(dev, &obj->base, stolen->base.size); i915_gem_object_init(obj, &i915_gem_object_stolen_ops); @@ -442,8 +445,10 @@ _i915_gem_object_create_stolen(struct drm_device *dev, obj->pages = i915_pages_create_for_stolen(dev, stolen->base.start, stolen->base.size); - if (obj->pages == NULL) + if (IS_ERR(obj->pages)) { + ret = PTR_ERR(obj->pages); goto cleanup; + } i915_gem_object_pin_pages(obj); obj->stolen = stolen; @@ -458,7 +463,7 @@ _i915_gem_object_create_stolen(struct drm_device *dev, cleanup: i915_gem_object_free(obj); - return NULL; + return ERR_PTR(ret); } static bool mark_free(struct drm_i915_gem_object *obj, struct list_head *unwind) @@ -592,21 +597,21 @@ i915_gem_object_create_stolen(struct drm_device *dev, u64 size) struct i915_stolen_node *stolen; if (!drm_mm_initialized(&dev_priv->mm.stolen)) - return NULL; + return ERR_PTR(-ENODEV); DRM_DEBUG_KMS("creating stolen object: size=%llx\n", size); stolen = stolen_alloc(dev_priv, size); if (IS_ERR(stolen)) - return NULL; + return (void *) stolen; obj = _i915_gem_object_create_stolen(dev, stolen); - if (obj) + if (!IS_ERR(obj)) return obj; i915_gem_stolen_remove_node(dev_priv, &stolen->base); kfree(stolen); - return NULL; + return obj; } struct drm_i915_gem_object * @@ -623,7 +628,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, int ret; if (!drm_mm_initialized(&dev_priv->mm.stolen)) - return NULL; + return ERR_PTR(-ENODEV); DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n", stolen_offset, gtt_offset, size); @@ -631,11 +636,11 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, /* KISS and expect everything to be page-aligned */ if (WARN_ON(size == 0) || WARN_ON(size & 4095) || WARN_ON(stolen_offset & 4095)) - return NULL; + return ERR_PTR(-EINVAL); stolen = kzalloc(sizeof(*stolen), GFP_KERNEL); if (!stolen) - return NULL; + return ERR_PTR(-ENOMEM); stolen->base.start = stolen_offset; stolen->base.size = size; @@ -645,15 +650,15 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, if (ret) { DRM_DEBUG_KMS("failed to allocate stolen space\n"); kfree(stolen); - return NULL; + return ERR_PTR(ret); } obj = _i915_gem_object_create_stolen(dev, stolen); - if (obj == NULL) { + if (IS_ERR(obj)) { DRM_DEBUG_KMS("failed to allocate stolen object\n"); i915_gem_stolen_remove_node(dev_priv, &stolen->base); kfree(stolen); - return NULL; + return obj; } /* Some objects just need physical mem from stolen space */ @@ -695,5 +700,5 @@ err_out: i915_gem_stolen_remove_node(dev_priv, &stolen->base); kfree(stolen); drm_gem_object_unreference(&obj->base); - return NULL; + return ERR_PTR(ret); } diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index f604ce1..9719f86 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -2538,7 +2538,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, base_aligned, base_aligned, size_aligned); - if (!obj) + if (IS_ERR(obj)) return false; obj->tiling_mode = plane_config->tiling; diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c index 96476d7..6f5be31 100644 --- a/drivers/gpu/drm/i915/intel_fbdev.c +++ b/drivers/gpu/drm/i915/intel_fbdev.c @@ -140,7 +140,7 @@ static int intelfb_alloc(struct drm_fb_helper *helper, size = mode_cmd.pitches[0] * mode_cmd.height; size = PAGE_ALIGN(size); obj = i915_gem_object_create_stolen(dev, size); - if (obj == NULL) + if (IS_ERR(obj)) obj = i915_gem_alloc_object(dev, size); if (!obj) { DRM_ERROR("failed to allocate framebuffer\n"); diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c index 4445426..d36a650 100644 --- a/drivers/gpu/drm/i915/intel_overlay.c +++ b/drivers/gpu/drm/i915/intel_overlay.c @@ -1389,10 +1389,10 @@ void intel_setup_overlay(struct drm_device *dev) overlay->dev = dev; - reg_bo = NULL; + reg_bo = ERR_PTR(-ENOMEM); if (!OVERLAY_NEEDS_PHYSICAL(dev)) reg_bo = i915_gem_object_create_stolen(dev, PAGE_SIZE); - if (reg_bo == NULL) + if (IS_ERR(reg_bo)) reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE); if (reg_bo == NULL) goto out_free; diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 51f2f91..ba1657f 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -5304,7 +5304,7 @@ static void valleyview_setup_pctx(struct drm_device *dev) * memory, or any other relevant ranges. */ pctx = i915_gem_object_create_stolen(dev, pctx_size); - if (!pctx) { + if (IS_ERR(pctx)) { DRM_DEBUG("not enough stolen space for PCTX, disabling\n"); return; } diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 6e6b8db..74c0b7d 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -2007,10 +2007,10 @@ int intel_alloc_ringbuffer_obj(struct drm_device *dev, { struct drm_i915_gem_object *obj; - obj = NULL; + obj = ERR_PTR(-ENOMEM); if (!HAS_LLC(dev)) obj = i915_gem_object_create_stolen(dev, ringbuf->size); - if (obj == NULL) + if (IS_ERR(obj)) obj = i915_gem_alloc_object(dev, ringbuf->size); if (obj == NULL) return -ENOMEM; -- 1.9.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx