summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: f29312b)
raw | patch | inline | side by side (parent: f29312b)
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | |
Wed, 17 Dec 2014 12:34:22 +0000 (14:34 +0200) | ||
committer | Jyri Sarha <jsarha@ti.com> | |
Fri, 19 Dec 2014 10:23:44 +0000 (12:23 +0200) |
omap_gem_objects are added to dev->obj_list in omap_gem_new, and removed
in omap_gem_free_object. Unfortunately there's no locking for
dev->obj_list, which eventually leads to a crash:
WARNING: CPU: 1 PID: 1123 at lib/list_debug.c:59 __list_del_entry+0xa4/0xe0()
list_del corruption. prev->next should be e9281344, but was ea722b84
Add a spinlock to protect dev->obj_list.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Signed-off-by: Jyri Sarha <jsarha@ti.com>
in omap_gem_free_object. Unfortunately there's no locking for
dev->obj_list, which eventually leads to a crash:
WARNING: CPU: 1 PID: 1123 at lib/list_debug.c:59 __list_del_entry+0xa4/0xe0()
list_del corruption. prev->next should be e9281344, but was ea722b84
Add a spinlock to protect dev->obj_list.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Signed-off-by: Jyri Sarha <jsarha@ti.com>
drivers/gpu/drm/omapdrm/omap_drv.c | patch | blob | history | |
drivers/gpu/drm/omapdrm/omap_drv.h | patch | blob | history | |
drivers/gpu/drm/omapdrm/omap_gem.c | patch | blob | history |
index 7665a976a7461fcbcbd97e639989d4b0b3dfd00e..15e4fe5d0d7ba7203f375abf31279ace133063a4 100644 (file)
priv->wq = alloc_ordered_workqueue("omapdrm", 0);
+ spin_lock_init(&priv->list_lock);
INIT_LIST_HEAD(&priv->obj_list);
omap_gem_init(dev);
index c204c1e7ce87386f55deb912429fca18f9465cfa..a02b5131669d530855547d8480837175a97f1e53 100644 (file)
struct workqueue_struct *wq;
+ /* lock for obj_list below */
+ spinlock_t list_lock;
+
/* list of GEM objects: */
struct list_head obj_list;
index 06c52634250656250fd52480ac7e0101ce1bedcf..eaff3b23cb50e6c2aed4580bea1e05ea8d8bbbea 100644 (file)
void omap_gem_free_object(struct drm_gem_object *obj)
{
struct drm_device *dev = obj->dev;
+ struct omap_drm_private *priv = dev->dev_private;
struct omap_gem_object *omap_obj = to_omap_bo(obj);
evict(obj);
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+ spin_lock(&priv->list_lock);
list_del(&omap_obj->mm_list);
+ spin_unlock(&priv->list_lock);
drm_gem_free_mmap_offset(obj);
if (!omap_obj)
goto fail;
+ spin_lock(&priv->list_lock);
list_add(&omap_obj->mm_list, &priv->obj_list);
+ spin_unlock(&priv->list_lock);
obj = &omap_obj->base;