]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.11-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 26 Jun 2017 13:39:49 +0000 (15:39 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 26 Jun 2017 13:39:49 +0000 (15:39 +0200)
added patches:
drm-fix-getconnector-regression.patch

queue-4.11/drm-fix-getconnector-regression.patch [new file with mode: 0644]
queue-4.11/series

diff --git a/queue-4.11/drm-fix-getconnector-regression.patch b/queue-4.11/drm-fix-getconnector-regression.patch
new file mode 100644 (file)
index 0000000..5a069b4
--- /dev/null
@@ -0,0 +1,113 @@
+From e94ac3510b6a0f696f2c442c4fc4051c8101ef12 Mon Sep 17 00:00:00 2001
+From: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date: Tue, 20 Jun 2017 22:28:37 +0200
+Subject: drm: Fix GETCONNECTOR regression
+
+From: Daniel Vetter <daniel.vetter@ffwll.ch>
+
+commit e94ac3510b6a0f696f2c442c4fc4051c8101ef12 upstream.
+
+In
+
+commit 91eefc05f0ac71902906b2058360e61bd25137fe
+Author: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date:   Wed Dec 14 00:08:10 2016 +0100
+
+    drm: Tighten locking in drm_mode_getconnector
+
+I reordered the logic a bit in that IOCTL, but that broke userspace
+since it'll get the new mode list, but not the new property values.
+Fix that again.
+
+v2: Fix up the error path handling when copy_to_user for the modes
+failes (Dhinakaran).
+
+Fixes: 91eefc05f0ac ("drm: Tighten locking in drm_mode_getconnector")
+Cc: Sean Paul <seanpaul@chromium.org>
+Cc: Daniel Vetter <daniel.vetter@intel.com>
+Cc: Jani Nikula <jani.nikula@linux.intel.com>
+Cc: David Airlie <airlied@linux.ie>
+Cc: dri-devel@lists.freedesktop.org
+Reported-by: "H.J. Lu" <hjl.tools@gmail.com>
+Tested-by: "H.J. Lu" <hjl.tools@gmail.com>
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100576
+Cc: "H.J. Lu" <hjl.tools@gmail.com>
+Cc: "Pandiyan, Dhinakaran" <dhinakaran.pandiyan@intel.com>
+Reviewed-by: Sean Paul <seanpaul@chromium.org>
+Reviewed-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
+Link: http://patchwork.freedesktop.org/patch/msgid/20170620202837.1701-1-daniel.vetter@ffwll.ch
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/drm_connector.c |   38 ++++++++++++++++++++------------------
+ 1 file changed, 20 insertions(+), 18 deletions(-)
+
+--- a/drivers/gpu/drm/drm_connector.c
++++ b/drivers/gpu/drm/drm_connector.c
+@@ -1169,21 +1169,6 @@ int drm_mode_getconnector(struct drm_dev
+       if (!connector)
+               return -ENOENT;
+-      drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
+-      encoder = drm_connector_get_encoder(connector);
+-      if (encoder)
+-              out_resp->encoder_id = encoder->base.id;
+-      else
+-              out_resp->encoder_id = 0;
+-
+-      ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic,
+-                      (uint32_t __user *)(unsigned long)(out_resp->props_ptr),
+-                      (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr),
+-                      &out_resp->count_props);
+-      drm_modeset_unlock(&dev->mode_config.connection_mutex);
+-      if (ret)
+-              goto out_unref;
+-
+       for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++)
+               if (connector->encoder_ids[i] != 0)
+                       encoders_count++;
+@@ -1196,7 +1181,7 @@ int drm_mode_getconnector(struct drm_dev
+                               if (put_user(connector->encoder_ids[i],
+                                            encoder_ptr + copied)) {
+                                       ret = -EFAULT;
+-                                      goto out_unref;
++                                      goto out;
+                               }
+                               copied++;
+                       }
+@@ -1240,15 +1225,32 @@ int drm_mode_getconnector(struct drm_dev
+                       if (copy_to_user(mode_ptr + copied,
+                                        &u_mode, sizeof(u_mode))) {
+                               ret = -EFAULT;
++                              mutex_unlock(&dev->mode_config.mutex);
++
+                               goto out;
+                       }
+                       copied++;
+               }
+       }
+       out_resp->count_modes = mode_count;
+-out:
+       mutex_unlock(&dev->mode_config.mutex);
+-out_unref:
++
++      drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
++      encoder = drm_connector_get_encoder(connector);
++      if (encoder)
++              out_resp->encoder_id = encoder->base.id;
++      else
++              out_resp->encoder_id = 0;
++
++      /* Only grab properties after probing, to make sure EDID and other
++       * properties reflect the latest status. */
++      ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic,
++                      (uint32_t __user *)(unsigned long)(out_resp->props_ptr),
++                      (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr),
++                      &out_resp->count_props);
++      drm_modeset_unlock(&dev->mode_config.connection_mutex);
++
++out:
+       drm_connector_unreference(connector);
+       return ret;
index cd6d0e6139c3cf165b6edeee952b313bde637a4f..96ae65293df30f921cb2214a9f81e7f14a699011 100644 (file)
@@ -49,3 +49,4 @@ drm-amdgpu-add-polaris12-did.patch
 acpi-scan-apply-default-enumeration-to-devices-with-acpi-drivers.patch
 acpi-scan-fix-enumeration-for-special-spi-and-i2c-devices.patch
 rxrpc-fix-several-cases-where-a-padded-len-isn-t-checked-in-ticket-decode.patch
+drm-fix-getconnector-regression.patch