Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af69592a authored by Rob Clark's avatar Rob Clark Committed by Greg Kroah-Hartman
Browse files

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: default avatarRob Clark <rob@ti.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 510d4d32
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -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;