Skip to content

Commit

Permalink
drm: free core gem object from driver callbacks
Browse files Browse the repository at this point in the history
When drivers embed the core gem object into their own structures,
they'll have to do this. Temporarily this results in an ugly

kfree(gem_obj);

in every gem driver.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Daniel Vetter authored and Dave Airlie committed Apr 20, 2010
1 parent 1d39704 commit fd632aa
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 7 deletions.
10 changes: 3 additions & 7 deletions drivers/gpu/drm/drm_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,15 +422,15 @@ drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
idr_destroy(&file_private->object_idr);
}

static void
drm_gem_object_free_common(struct drm_gem_object *obj)
void
drm_gem_object_release(struct drm_gem_object *obj)
{
struct drm_device *dev = obj->dev;
fput(obj->filp);
atomic_dec(&dev->object_count);
atomic_sub(obj->size, &dev->object_memory);
kfree(obj);
}
EXPORT_SYMBOL(drm_gem_object_release);

/**
* Called after the last reference to the object has been lost.
Expand All @@ -448,8 +448,6 @@ drm_gem_object_free(struct kref *kref)

if (dev->driver->gem_free_object != NULL)
dev->driver->gem_free_object(obj);

drm_gem_object_free_common(obj);
}
EXPORT_SYMBOL(drm_gem_object_free);

Expand All @@ -472,8 +470,6 @@ drm_gem_object_free_unlocked(struct kref *kref)
dev->driver->gem_free_object(obj);
mutex_unlock(&dev->struct_mutex);
}

drm_gem_object_free_common(obj);
}
EXPORT_SYMBOL(drm_gem_object_free_unlocked);

Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -4474,6 +4474,9 @@ void i915_gem_free_object(struct drm_gem_object *obj)
kfree(obj_priv->page_cpu_valid);
kfree(obj_priv->bit_17);
kfree(obj->driver_private);

drm_gem_object_release(obj);
kfree(obj);
}

/** Unbinds all inactive objects. */
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/nouveau/nouveau_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ nouveau_gem_object_del(struct drm_gem_object *gem)
}

ttm_bo_unref(&bo);

drm_gem_object_release(gem);
kfree(gem);
}

int
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/radeon/radeon_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ void radeon_gem_object_free(struct drm_gem_object *gobj)
if (robj) {
radeon_bo_unref(&robj);
}

drm_gem_object_release(gobj);
kfree(gobj);
}

int radeon_gem_object_create(struct radeon_device *rdev, int size,
Expand Down
1 change: 1 addition & 0 deletions include/drm/drmP.h
Original file line number Diff line number Diff line change
Expand Up @@ -1428,6 +1428,7 @@ extern void drm_sysfs_connector_remove(struct drm_connector *connector);
/* Graphics Execution Manager library functions (drm_gem.c) */
int drm_gem_init(struct drm_device *dev);
void drm_gem_destroy(struct drm_device *dev);
void drm_gem_object_release(struct drm_gem_object *obj);
void drm_gem_object_free(struct kref *kref);
void drm_gem_object_free_unlocked(struct kref *kref);
struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
Expand Down

0 comments on commit fd632aa

Please sign in to comment.