Instead of generating a new usermode every time we need to copy a mode
back to userspace, just use the cached one we already have.

Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 drivers/gpu/drm/drm_crtc.c  | 15 +++++----------
 drivers/gpu/drm/drm_modes.c |  4 ++--
 include/drm/drm_modes.h     |  2 --
 3 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 6a7f07f..af9628b 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -1936,8 +1936,8 @@ int drm_mode_getcrtc(struct drm_device *dev,
                crtc_resp->x = crtc->primary->state->src_x >> 16;
                crtc_resp->y = crtc->primary->state->src_y >> 16;
                if (crtc->state->enable) {
-                       WARN_ON(!crtc->state->mode);
-                       drm_mode_convert_to_umode(&crtc_resp->mode, 
crtc->state->mode);
+                       memcpy(&crtc_resp->mode, &crtc->mode->umode,
+                              sizeof(crtc_resp->mode));
                        crtc_resp->mode_valid = 1;

                } else {
@@ -1947,9 +1947,8 @@ int drm_mode_getcrtc(struct drm_device *dev,
                crtc_resp->x = crtc->x;
                crtc_resp->y = crtc->y;
                if (crtc->enabled) {
-                       WARN_ON(!crtc->mode);
-                       drm_mode_convert_to_umode(&crtc_resp->mode,
-                                                 crtc->mode);
+                       memcpy(&crtc_resp->mode, &crtc->mode->umode,
+                              sizeof(crtc_resp->mode));
                        crtc_resp->mode_valid = 1;

                } else {
@@ -2046,15 +2045,12 @@ int drm_mode_getconnector(struct drm_device *dev, void 
*data,
        int ret = 0;
        int copied = 0;
        int i;
-       struct drm_mode_modeinfo u_mode;
        struct drm_mode_modeinfo __user *mode_ptr;
        uint32_t __user *encoder_ptr;

        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return -EINVAL;

-       memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo));
-
        DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id);

        mutex_lock(&dev->mode_config.mutex);
@@ -2106,9 +2102,8 @@ int drm_mode_getconnector(struct drm_device *dev, void 
*data,
                        if (!drm_mode_expose_to_userspace(mode, file_priv))
                                continue;

-                       drm_mode_convert_to_umode(&u_mode, mode);
                        if (copy_to_user(mode_ptr + copied,
-                                        &u_mode, sizeof(u_mode))) {
+                                        &mode->umode, sizeof(mode->umode))) {
                                ret = -EFAULT;
                                goto out;
                        }
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 803e00a..0883f64 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -899,8 +899,8 @@ EXPORT_SYMBOL(drm_mode_duplicate);
  * Convert a drm_display_mode into a drm_mode_modeinfo structure to return to
  * the user.
  */
-void drm_mode_convert_to_umode(struct drm_mode_modeinfo *out,
-                              const struct drm_display_mode *in)
+static void drm_mode_convert_to_umode(struct drm_mode_modeinfo *out,
+                                     const struct drm_display_mode *in)
 {
        WARN(in->hdisplay > USHRT_MAX || in->hsync_start > USHRT_MAX ||
             in->hsync_end > USHRT_MAX || in->htotal > USHRT_MAX ||
diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h
index e7eb727..46ed207 100644
--- a/include/drm/drm_modes.h
+++ b/include/drm/drm_modes.h
@@ -219,8 +219,6 @@ struct drm_display_mode *drm_mode_duplicate(struct 
drm_device *dev,
                                            const struct drm_display_mode 
*mode);
 struct drm_display_mode *drm_mode_new_from_umode(struct drm_device *dev,
                                  const struct drm_mode_modeinfo *in);
-void drm_mode_convert_to_umode(struct drm_mode_modeinfo *out,
-                              const struct drm_display_mode *in);
 bool drm_mode_equal(const struct drm_display_mode *mode1,
                    const struct drm_display_mode *mode2);
 bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
-- 
2.3.2

Reply via email to