drm/nouveau: fallback to sw fbcon if we can't get mutex immediately

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
index bc30dbe..0fce4eb 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
@@ -61,8 +61,8 @@
 		return;
 
 	ret = -ENODEV;
-	if (!in_interrupt() && !(info->flags & FBINFO_HWACCEL_DISABLED)) {
-		mutex_lock(&dev_priv->channel->mutex);
+	if (!in_interrupt() && !(info->flags & FBINFO_HWACCEL_DISABLED) &&
+	    mutex_trylock(&dev_priv->channel->mutex)) {
 		if (dev_priv->card_type < NV_50)
 			ret = nv04_fbcon_fillrect(info, rect);
 		else
@@ -91,8 +91,8 @@
 		return;
 
 	ret = -ENODEV;
-	if (!in_interrupt() && !(info->flags & FBINFO_HWACCEL_DISABLED)) {
-		mutex_lock(&dev_priv->channel->mutex);
+	if (!in_interrupt() && !(info->flags & FBINFO_HWACCEL_DISABLED) &&
+	    mutex_trylock(&dev_priv->channel->mutex)) {
 		if (dev_priv->card_type < NV_50)
 			ret = nv04_fbcon_copyarea(info, image);
 		else
@@ -121,8 +121,8 @@
 		return;
 
 	ret = -ENODEV;
-	if (!in_interrupt() && !(info->flags & FBINFO_HWACCEL_DISABLED)) {
-		mutex_lock(&dev_priv->channel->mutex);
+	if (!in_interrupt() && !(info->flags & FBINFO_HWACCEL_DISABLED) &&
+	    mutex_trylock(&dev_priv->channel->mutex)) {
 		if (dev_priv->card_type < NV_50)
 			ret = nv04_fbcon_imageblit(info, image);
 		else
@@ -153,7 +153,9 @@
 	    info->flags & FBINFO_HWACCEL_DISABLED)
 		return 0;
 
-	mutex_lock(&chan->mutex);
+	if (!mutex_trylock(&chan->mutex))
+		return 0;
+
 	ret = RING_SPACE(chan, 4);
 	if (ret) {
 		mutex_unlock(&chan->mutex);