Browse Source

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>
Rob Clark 13 years ago
parent
commit
af69592aa0
1 changed files with 14 additions and 2 deletions
  1. 14 2
      drivers/staging/omapdrm/omap_gem.c

+ 14 - 2
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;