[kernel/f20] Re-add patch fixing spice resize (rhbz 1060327)
Josh Boyer
jwboyer at fedoraproject.org
Fri Jul 25 12:11:28 UTC 2014
commit 3f5d7e20fc87878cbcb1a45060501f0ed19052d0
Author: Josh Boyer <jwboyer at fedoraproject.org>
Date: Fri Jul 25 08:11:18 2014 -0400
Re-add patch fixing spice resize (rhbz 1060327)
...der-to-avoid-regression-when-merging-mode.patch | 214 ++++++++++++++++++++
kernel.spec | 8 +
2 files changed, 222 insertions(+), 0 deletions(-)
---
diff --git a/drm-try-harder-to-avoid-regression-when-merging-mode.patch b/drm-try-harder-to-avoid-regression-when-merging-mode.patch
new file mode 100644
index 0000000..c4518a9
--- /dev/null
+++ b/drm-try-harder-to-avoid-regression-when-merging-mode.patch
@@ -0,0 +1,214 @@
+Bugzilla: 1060327
+Upstream-status: 3.16
+
+From b87577b7c768683736eea28f70779e8c75b4df62 Mon Sep 17 00:00:00 2001
+From: Dave Airlie <airlied at redhat.com>
+Date: Thu, 1 May 2014 09:26:53 +1000
+Subject: [PATCH] drm: try harder to avoid regression when merging mode bits
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+For QXL hw we really want the bits to be replaced as we change
+the preferred mode on the fly, and the same goes for virgl when
+I get to it, however the original fix for this seems to have caused
+a wierd regression on Intel G33 that in a stunning display of failure
+at opposition to his normal self, Daniel failed to diagnose.
+
+So we are left doing this, ugly ugly ugly ugly, Daniel you fixed
+that G33 yet?, ugly, ugly.
+
+Tested-by: Marc-André Lureau <marcandre.lureau at redhat.com>
+Signed-off-by: Dave Airlie <airlied at redhat.com>
+---
+ drivers/gpu/drm/drm_modes.c | 9 ++++--
+ drivers/gpu/drm/drm_probe_helper.c | 64 +++++++++++++++++++++++++------------
+ drivers/gpu/drm/qxl/qxl_display.c | 2 +-
+ drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 2 +-
+ include/drm/drm_crtc_helper.h | 4 +++
+ include/drm/drm_modes.h | 2 +-
+ 6 files changed, 57 insertions(+), 26 deletions(-)
+
+diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
+index 8b410576fce4..bedf1894e17e 100644
+--- a/drivers/gpu/drm/drm_modes.c
++++ b/drivers/gpu/drm/drm_modes.c
+@@ -1013,6 +1013,7 @@ EXPORT_SYMBOL(drm_mode_sort);
+ /**
+ * drm_mode_connector_list_update - update the mode list for the connector
+ * @connector: the connector to update
++ * @merge_type_bits: whether to merge or overright type bits.
+ *
+ * This moves the modes from the @connector probed_modes list
+ * to the actual mode list. It compares the probed mode against the current
+@@ -1021,7 +1022,8 @@ EXPORT_SYMBOL(drm_mode_sort);
+ * This is just a helper functions doesn't validate any modes itself and also
+ * doesn't prune any invalid modes. Callers need to do that themselves.
+ */
+-void drm_mode_connector_list_update(struct drm_connector *connector)
++void drm_mode_connector_list_update(struct drm_connector *connector,
++ bool merge_type_bits)
+ {
+ struct drm_display_mode *mode;
+ struct drm_display_mode *pmode, *pt;
+@@ -1039,7 +1041,10 @@ void drm_mode_connector_list_update(struct drm_connector *connector)
+ /* if equal delete the probed mode */
+ mode->status = pmode->status;
+ /* Merge type bits together */
+- mode->type |= pmode->type;
++ if (merge_type_bits)
++ mode->type |= pmode->type;
++ else
++ mode->type = pmode->type;
+ list_del(&pmode->head);
+ drm_mode_destroy(connector->dev, pmode);
+ break;
+diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
+index e70f54d4a581..8afdd0998a8c 100644
+--- a/drivers/gpu/drm/drm_probe_helper.c
++++ b/drivers/gpu/drm/drm_probe_helper.c
+@@ -82,26 +82,8 @@ static void drm_mode_validate_flag(struct drm_connector *connector,
+ return;
+ }
+
+-/**
+- * drm_helper_probe_single_connector_modes - get complete set of display modes
+- * @connector: connector to probe
+- * @maxX: max width for modes
+- * @maxY: max height for modes
+- *
+- * Based on the helper callbacks implemented by @connector try to detect all
+- * valid modes. Modes will first be added to the connector's probed_modes list,
+- * then culled (based on validity and the @maxX, @maxY parameters) and put into
+- * the normal modes list.
+- *
+- * Intended to be use as a generic implementation of the ->fill_modes()
+- * @connector vfunc for drivers that use the crtc helpers for output mode
+- * filtering and detection.
+- *
+- * Returns:
+- * The number of modes found on @connector.
+- */
+-int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
+- uint32_t maxX, uint32_t maxY)
++static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connector *connector,
++ uint32_t maxX, uint32_t maxY, bool merge_type_bits)
+ {
+ struct drm_device *dev = connector->dev;
+ struct drm_display_mode *mode;
+@@ -155,7 +137,7 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
+ if (count == 0)
+ goto prune;
+
+- drm_mode_connector_list_update(connector);
++ drm_mode_connector_list_update(connector, merge_type_bits);
+
+ if (maxX && maxY)
+ drm_mode_validate_size(dev, &connector->modes, maxX, maxY);
+@@ -194,9 +176,49 @@ prune:
+
+ return count;
+ }
++
++/**
++ * drm_helper_probe_single_connector_modes - get complete set of display modes
++ * @connector: connector to probe
++ * @maxX: max width for modes
++ * @maxY: max height for modes
++ *
++ * Based on the helper callbacks implemented by @connector try to detect all
++ * valid modes. Modes will first be added to the connector's probed_modes list,
++ * then culled (based on validity and the @maxX, @maxY parameters) and put into
++ * the normal modes list.
++ *
++ * Intended to be use as a generic implementation of the ->fill_modes()
++ * @connector vfunc for drivers that use the crtc helpers for output mode
++ * filtering and detection.
++ *
++ * Returns:
++ * The number of modes found on @connector.
++ */
++int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
++ uint32_t maxX, uint32_t maxY)
++{
++ return drm_helper_probe_single_connector_modes_merge_bits(connector, maxX, maxY, true);
++}
+ EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
+
+ /**
++ * drm_helper_probe_single_connector_modes_nomerge - get complete set of display modes
++ * @connector: connector to probe
++ * @maxX: max width for modes
++ * @maxY: max height for modes
++ *
++ * This operates like drm_hehlper_probe_single_connector_modes except it
++ * replaces the mode bits instead of merging them for preferred modes.
++ */
++int drm_helper_probe_single_connector_modes_nomerge(struct drm_connector *connector,
++ uint32_t maxX, uint32_t maxY)
++{
++ return drm_helper_probe_single_connector_modes_merge_bits(connector, maxX, maxY, false);
++}
++EXPORT_SYMBOL(drm_helper_probe_single_connector_modes_nomerge);
++
++/**
+ * drm_kms_helper_hotplug_event - fire off KMS hotplug events
+ * @dev: drm_device whose connector state changed
+ *
+diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
+index 41bdd174657e..3ab9072d3623 100644
+--- a/drivers/gpu/drm/qxl/qxl_display.c
++++ b/drivers/gpu/drm/qxl/qxl_display.c
+@@ -841,7 +841,7 @@ static const struct drm_connector_funcs qxl_connector_funcs = {
+ .save = qxl_conn_save,
+ .restore = qxl_conn_restore,
+ .detect = qxl_conn_detect,
+- .fill_modes = drm_helper_probe_single_connector_modes,
++ .fill_modes = drm_helper_probe_single_connector_modes_nomerge,
+ .set_property = qxl_conn_set_property,
+ .destroy = qxl_conn_destroy,
+ };
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+index a2dde5ad8138..e7199b454ca0 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+@@ -2001,7 +2001,7 @@ int vmw_du_connector_fill_modes(struct drm_connector *connector,
+ if (du->pref_mode)
+ list_move(&du->pref_mode->head, &connector->probed_modes);
+
+- drm_mode_connector_list_update(connector);
++ drm_mode_connector_list_update(connector, true);
+
+ return 1;
+ }
+diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
+index 36a5febac2a6..f51c8393e9a8 100644
+--- a/include/drm/drm_crtc_helper.h
++++ b/include/drm/drm_crtc_helper.h
+@@ -165,6 +165,10 @@ extern void drm_helper_resume_force_mode(struct drm_device *dev);
+ extern int drm_helper_probe_single_connector_modes(struct drm_connector
+ *connector, uint32_t maxX,
+ uint32_t maxY);
++extern int drm_helper_probe_single_connector_modes_nomerge(struct drm_connector
++ *connector,
++ uint32_t maxX,
++ uint32_t maxY);
+ extern void drm_kms_helper_poll_init(struct drm_device *dev);
+ extern void drm_kms_helper_poll_fini(struct drm_device *dev);
+ extern bool drm_helper_hpd_irq_event(struct drm_device *dev);
+diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h
+index 2dbbf9976669..91d0582f924e 100644
+--- a/include/drm/drm_modes.h
++++ b/include/drm/drm_modes.h
+@@ -223,7 +223,7 @@ void drm_mode_validate_size(struct drm_device *dev,
+ void drm_mode_prune_invalid(struct drm_device *dev,
+ struct list_head *mode_list, bool verbose);
+ void drm_mode_sort(struct list_head *mode_list);
+-void drm_mode_connector_list_update(struct drm_connector *connector);
++void drm_mode_connector_list_update(struct drm_connector *connector, bool merge_type_bits);
+
+ /* parsing cmdline modes */
+ bool
+--
+1.9.3
+
diff --git a/kernel.spec b/kernel.spec
index 22b1619..c1cfdaf 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -764,6 +764,8 @@ Patch25120: shmem-fix-faulting-into-a-hole-while-it-s-punched.patch
Patch25121: shmem-fix-faulting-into-a-hole-not-taking-i_mutex.patch
Patch25122: shmem-fix-splicing-from-a-hole-while-it-s-punched.patch
+#rhbz 1060327
+Patch25123: drm-try-harder-to-avoid-regression-when-merging-mode.patch
# END OF PATCH DEFINITIONS
@@ -1488,6 +1490,9 @@ ApplyPatch shmem-fix-faulting-into-a-hole-while-it-s-punched.patch
ApplyPatch shmem-fix-faulting-into-a-hole-not-taking-i_mutex.patch
ApplyPatch shmem-fix-splicing-from-a-hole-while-it-s-punched.patch
+#rhbz 1060327
+ApplyPatch drm-try-harder-to-avoid-regression-when-merging-mode.patch
+
# END OF PATCH APPLICATIONS
%endif
@@ -2299,6 +2304,9 @@ fi
# ||----w |
# || ||
%changelog
+* Fri Jul 25 2014 Josh Boyer <jwboyer at fedoraproject.org>
+- Re-add patch fixing spice resize (rhbz 1060327)
+
* Thu Jul 24 2014 Josh Boyer <jwboyer at fedoraproject.org>
- CVE-2014-4171 shmem: denial of service (rhbz 1111180 1118247)
- CVE-2014-5045 vfs: refcount issues during lazy umount on symlink (rhbz 1122471 1122482)
More information about the scm-commits
mailing list