Message ID | 1374934887-8928-1-git-send-email-dh.herrmann@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, Jul 27, 2013 at 04:21:27PM +0200, David Herrmann wrote: > i915 is the last user of the weird search+get_block drm_mm API. Convert it > to an explicit kmalloc()+insert_node(). This drops the last user of the > node-cache in drm_mm. We can remove it now in a follow-up patch. > > v2: > - simplify error path in i915_setup_compression() > v3: > - simplify error path even more > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch> > Cc: Chris Wilson <chris@chris-wilson.co.uk> > Signed-off-by: David Herrmann <dh.herrmann@gmail.com> I think this won't conflict badly with the ongoing VMA rework in drm/i915, so Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> for merging through drm-next directly. -Daniel > --- > drivers/gpu/drm/i915/i915_gem_stolen.c | 78 ++++++++++++++++++++-------------- > 1 file changed, 47 insertions(+), 31 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c > index e355170..a3d1a12 100644 > --- a/drivers/gpu/drm/i915/i915_gem_stolen.c > +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c > @@ -112,34 +112,36 @@ static int i915_setup_compression(struct drm_device *dev, int size) > { > struct drm_i915_private *dev_priv = dev->dev_private; > struct drm_mm_node *compressed_fb, *uninitialized_var(compressed_llb); > + int ret; > > - /* Try to over-allocate to reduce reallocations and fragmentation */ > - compressed_fb = drm_mm_search_free(&dev_priv->mm.stolen, > - size <<= 1, 4096, > - DRM_MM_SEARCH_DEFAULT); > - if (!compressed_fb) > - compressed_fb = drm_mm_search_free(&dev_priv->mm.stolen, > - size >>= 1, 4096, > - DRM_MM_SEARCH_DEFAULT); > - if (compressed_fb) > - compressed_fb = drm_mm_get_block(compressed_fb, size, 4096); > + compressed_fb = kzalloc(sizeof(*compressed_fb), GFP_KERNEL); > if (!compressed_fb) > - goto err; > + goto err_llb; > + > + /* Try to over-allocate to reduce reallocations and fragmentation */ > + ret = drm_mm_insert_node(&dev_priv->mm.stolen, compressed_fb, > + size <<= 1, 4096, DRM_MM_SEARCH_DEFAULT); > + if (ret) > + ret = drm_mm_insert_node(&dev_priv->mm.stolen, compressed_fb, > + size >>= 1, 4096, > + DRM_MM_SEARCH_DEFAULT); > + if (ret) > + goto err_llb; > > if (HAS_PCH_SPLIT(dev)) > I915_WRITE(ILK_DPFC_CB_BASE, compressed_fb->start); > else if (IS_GM45(dev)) { > I915_WRITE(DPFC_CB_BASE, compressed_fb->start); > } else { > - compressed_llb = drm_mm_search_free(&dev_priv->mm.stolen, > - 4096, 4096, > - DRM_MM_SEARCH_DEFAULT); > - if (compressed_llb) > - compressed_llb = drm_mm_get_block(compressed_llb, > - 4096, 4096); > + compressed_llb = kzalloc(sizeof(*compressed_llb), GFP_KERNEL); > if (!compressed_llb) > goto err_fb; > > + ret = drm_mm_insert_node(&dev_priv->mm.stolen, compressed_llb, > + 4096, 4096, DRM_MM_SEARCH_DEFAULT); > + if (ret) > + goto err_fb; > + > dev_priv->fbc.compressed_llb = compressed_llb; > > I915_WRITE(FBC_CFB_BASE, > @@ -157,8 +159,10 @@ static int i915_setup_compression(struct drm_device *dev, int size) > return 0; > > err_fb: > - drm_mm_put_block(compressed_fb); > -err: > + kfree(compressed_llb); > + drm_mm_remove_node(compressed_fb); > +err_llb: > + kfree(compressed_fb); > pr_info_once("drm: not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); > return -ENOSPC; > } > @@ -186,11 +190,15 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev) > if (dev_priv->fbc.size == 0) > return; > > - if (dev_priv->fbc.compressed_fb) > - drm_mm_put_block(dev_priv->fbc.compressed_fb); > + if (dev_priv->fbc.compressed_fb) { > + drm_mm_remove_node(dev_priv->fbc.compressed_fb); > + kfree(dev_priv->fbc.compressed_fb); > + } > > - if (dev_priv->fbc.compressed_llb) > - drm_mm_put_block(dev_priv->fbc.compressed_llb); > + if (dev_priv->fbc.compressed_llb) { > + drm_mm_remove_node(dev_priv->fbc.compressed_llb); > + kfree(dev_priv->fbc.compressed_llb); > + } > > dev_priv->fbc.size = 0; > } > @@ -323,6 +331,7 @@ i915_gem_object_create_stolen(struct drm_device *dev, u32 size) > struct drm_i915_private *dev_priv = dev->dev_private; > struct drm_i915_gem_object *obj; > struct drm_mm_node *stolen; > + int ret; > > if (!drm_mm_initialized(&dev_priv->mm.stolen)) > return NULL; > @@ -331,18 +340,23 @@ i915_gem_object_create_stolen(struct drm_device *dev, u32 size) > if (size == 0) > return NULL; > > - stolen = drm_mm_search_free(&dev_priv->mm.stolen, size, 4096, > - DRM_MM_SEARCH_DEFAULT); > - if (stolen) > - stolen = drm_mm_get_block(stolen, size, 4096); > - if (stolen == NULL) > + stolen = kzalloc(sizeof(*stolen), GFP_KERNEL); > + if (!stolen) > return NULL; > > + ret = drm_mm_insert_node(&dev_priv->mm.stolen, stolen, size, > + 4096, DRM_MM_SEARCH_DEFAULT); > + if (ret) { > + kfree(stolen); > + return NULL; > + } > + > obj = _i915_gem_object_create_stolen(dev, stolen); > if (obj) > return obj; > > - drm_mm_put_block(stolen); > + drm_mm_remove_node(stolen); > + kfree(stolen); > return NULL; > } > > @@ -386,7 +400,8 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, > obj = _i915_gem_object_create_stolen(dev, stolen); > if (obj == NULL) { > DRM_DEBUG_KMS("failed to allocate stolen object\n"); > - drm_mm_put_block(stolen); > + drm_mm_remove_node(stolen); > + kfree(stolen); > return NULL; > } > > @@ -426,7 +441,8 @@ void > i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) > { > if (obj->stolen) { > - drm_mm_put_block(obj->stolen); > + drm_mm_remove_node(obj->stolen); > + kfree(obj->stolen); > obj->stolen = NULL; > } > } > -- > 1.8.3.4 >
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index e355170..a3d1a12 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c @@ -112,34 +112,36 @@ static int i915_setup_compression(struct drm_device *dev, int size) { struct drm_i915_private *dev_priv = dev->dev_private; struct drm_mm_node *compressed_fb, *uninitialized_var(compressed_llb); + int ret; - /* Try to over-allocate to reduce reallocations and fragmentation */ - compressed_fb = drm_mm_search_free(&dev_priv->mm.stolen, - size <<= 1, 4096, - DRM_MM_SEARCH_DEFAULT); - if (!compressed_fb) - compressed_fb = drm_mm_search_free(&dev_priv->mm.stolen, - size >>= 1, 4096, - DRM_MM_SEARCH_DEFAULT); - if (compressed_fb) - compressed_fb = drm_mm_get_block(compressed_fb, size, 4096); + compressed_fb = kzalloc(sizeof(*compressed_fb), GFP_KERNEL); if (!compressed_fb) - goto err; + goto err_llb; + + /* Try to over-allocate to reduce reallocations and fragmentation */ + ret = drm_mm_insert_node(&dev_priv->mm.stolen, compressed_fb, + size <<= 1, 4096, DRM_MM_SEARCH_DEFAULT); + if (ret) + ret = drm_mm_insert_node(&dev_priv->mm.stolen, compressed_fb, + size >>= 1, 4096, + DRM_MM_SEARCH_DEFAULT); + if (ret) + goto err_llb; if (HAS_PCH_SPLIT(dev)) I915_WRITE(ILK_DPFC_CB_BASE, compressed_fb->start); else if (IS_GM45(dev)) { I915_WRITE(DPFC_CB_BASE, compressed_fb->start); } else { - compressed_llb = drm_mm_search_free(&dev_priv->mm.stolen, - 4096, 4096, - DRM_MM_SEARCH_DEFAULT); - if (compressed_llb) - compressed_llb = drm_mm_get_block(compressed_llb, - 4096, 4096); + compressed_llb = kzalloc(sizeof(*compressed_llb), GFP_KERNEL); if (!compressed_llb) goto err_fb; + ret = drm_mm_insert_node(&dev_priv->mm.stolen, compressed_llb, + 4096, 4096, DRM_MM_SEARCH_DEFAULT); + if (ret) + goto err_fb; + dev_priv->fbc.compressed_llb = compressed_llb; I915_WRITE(FBC_CFB_BASE, @@ -157,8 +159,10 @@ static int i915_setup_compression(struct drm_device *dev, int size) return 0; err_fb: - drm_mm_put_block(compressed_fb); -err: + kfree(compressed_llb); + drm_mm_remove_node(compressed_fb); +err_llb: + kfree(compressed_fb); pr_info_once("drm: not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); return -ENOSPC; } @@ -186,11 +190,15 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev) if (dev_priv->fbc.size == 0) return; - if (dev_priv->fbc.compressed_fb) - drm_mm_put_block(dev_priv->fbc.compressed_fb); + if (dev_priv->fbc.compressed_fb) { + drm_mm_remove_node(dev_priv->fbc.compressed_fb); + kfree(dev_priv->fbc.compressed_fb); + } - if (dev_priv->fbc.compressed_llb) - drm_mm_put_block(dev_priv->fbc.compressed_llb); + if (dev_priv->fbc.compressed_llb) { + drm_mm_remove_node(dev_priv->fbc.compressed_llb); + kfree(dev_priv->fbc.compressed_llb); + } dev_priv->fbc.size = 0; } @@ -323,6 +331,7 @@ i915_gem_object_create_stolen(struct drm_device *dev, u32 size) struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_gem_object *obj; struct drm_mm_node *stolen; + int ret; if (!drm_mm_initialized(&dev_priv->mm.stolen)) return NULL; @@ -331,18 +340,23 @@ i915_gem_object_create_stolen(struct drm_device *dev, u32 size) if (size == 0) return NULL; - stolen = drm_mm_search_free(&dev_priv->mm.stolen, size, 4096, - DRM_MM_SEARCH_DEFAULT); - if (stolen) - stolen = drm_mm_get_block(stolen, size, 4096); - if (stolen == NULL) + stolen = kzalloc(sizeof(*stolen), GFP_KERNEL); + if (!stolen) return NULL; + ret = drm_mm_insert_node(&dev_priv->mm.stolen, stolen, size, + 4096, DRM_MM_SEARCH_DEFAULT); + if (ret) { + kfree(stolen); + return NULL; + } + obj = _i915_gem_object_create_stolen(dev, stolen); if (obj) return obj; - drm_mm_put_block(stolen); + drm_mm_remove_node(stolen); + kfree(stolen); return NULL; } @@ -386,7 +400,8 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, obj = _i915_gem_object_create_stolen(dev, stolen); if (obj == NULL) { DRM_DEBUG_KMS("failed to allocate stolen object\n"); - drm_mm_put_block(stolen); + drm_mm_remove_node(stolen); + kfree(stolen); return NULL; } @@ -426,7 +441,8 @@ void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) { if (obj->stolen) { - drm_mm_put_block(obj->stolen); + drm_mm_remove_node(obj->stolen); + kfree(obj->stolen); obj->stolen = NULL; } }
i915 is the last user of the weird search+get_block drm_mm API. Convert it to an explicit kmalloc()+insert_node(). This drops the last user of the node-cache in drm_mm. We can remove it now in a follow-up patch. v2: - simplify error path in i915_setup_compression() v3: - simplify error path even more Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: David Herrmann <dh.herrmann@gmail.com> --- drivers/gpu/drm/i915/i915_gem_stolen.c | 78 ++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 31 deletions(-)