summaryrefslogtreecommitdiff
path: root/drivers/staging/omapdrm
diff options
context:
space:
mode:
authorRob Clark <rob@ti.com>2011-12-16 11:34:34 -0600
committerGreg Kroah-Hartman <gregkh@suse.de>2011-12-16 10:59:25 -0800
commitaf69592aa098ff8cd640e8109ba946db3c1cdb4e (patch)
treecdabc9ba67eba37319e7026a4626bb3e962a9d51 /drivers/staging/omapdrm
parent510d4d32f25f49dedd7da88c29fdb4d0aada5815 (diff)
staging: drm/omap: avoid aquiring mutex in atomic context (v2)
omap_gem_roll() could be called by fbcon in atomic context or when struct_mutext is held. Avoid aquiring mutex (deadlock), or calling tiler_pin() (which itself is not safe for atomic context) in these cases. Signed-off-by: Rob Clark <rob@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/omapdrm')
-rw-r--r--drivers/staging/omapdrm/omap_gem.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/staging/omapdrm/omap_gem.c b/drivers/staging/omapdrm/omap_gem.c
index 96848913085..63490f75350 100644
--- a/drivers/staging/omapdrm/omap_gem.c
+++ b/drivers/staging/omapdrm/omap_gem.c
@@ -538,10 +538,22 @@ int omap_gem_roll(struct drm_gem_object *obj, uint32_t roll)
return -EINVAL;
}
- mutex_lock(&obj->dev->struct_mutex);
-
omap_obj->roll = roll;
+ if (in_atomic() || mutex_is_locked(&obj->dev->struct_mutex)) {
+ /* this can get called from fbcon in atomic context.. so
+ * just ignore it and wait for next time called from
+ * interruptible context to update the PAT.. the result
+ * may be that user sees wrap-around instead of scrolling
+ * momentarily on the screen. If we wanted to be fancier
+ * we could perhaps schedule some workqueue work at this
+ * point.
+ */
+ return 0;
+ }
+
+ mutex_lock(&obj->dev->struct_mutex);
+
/* if we aren't mapped yet, we don't need to do anything */
if (omap_obj->block) {
struct page **pages;