]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
qxl: don't create too large primary surface
authorMarc-André Lureau <marcandre.lureau@gmail.com>
Thu, 16 Oct 2014 09:39:44 +0000 (11:39 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Nov 2014 18:10:29 +0000 (10:10 -0800)
commit c572aaf46f71f63ae5914d4e194a955e0ba1b519 upstream.

Limit primary to qemu vgamem size, to avoid reaching
qemu guest bug "requested primary larger than framebuffer"
on resizing screen too large to fit.

Remove unneeded and misleading variables.

Related to:
https://bugzilla.redhat.com/show_bug.cgi?id=1127552

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/qxl/qxl_display.c

index b8ced08b62916b643436375aa853a82c2560a947..bac1fd43e15aba5e3e611dfa01df9c4b37f11f28 100644 (file)
@@ -523,7 +523,6 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
        struct qxl_framebuffer *qfb;
        struct qxl_bo *bo, *old_bo = NULL;
        struct qxl_crtc *qcrtc = to_qxl_crtc(crtc);
-       uint32_t width, height, base_offset;
        bool recreate_primary = false;
        int ret;
        int surf_id;
@@ -553,9 +552,10 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
        if (qcrtc->index == 0)
                recreate_primary = true;
 
-       width = mode->hdisplay;
-       height = mode->vdisplay;
-       base_offset = 0;
+       if (bo->surf.stride * bo->surf.height > qdev->vram_size) {
+               DRM_ERROR("Mode doesn't fit in vram size (vgamem)");
+               return -EINVAL;
+        }
 
        ret = qxl_bo_reserve(bo, false);
        if (ret != 0)
@@ -569,10 +569,10 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
        if (recreate_primary) {
                qxl_io_destroy_primary(qdev);
                qxl_io_log(qdev,
-                          "recreate primary: %dx%d (was %dx%d,%d,%d)\n",
-                          width, height, bo->surf.width,
-                          bo->surf.height, bo->surf.stride, bo->surf.format);
-               qxl_io_create_primary(qdev, base_offset, bo);
+                          "recreate primary: %dx%d,%d,%d\n",
+                          bo->surf.width, bo->surf.height,
+                          bo->surf.stride, bo->surf.format);
+               qxl_io_create_primary(qdev, 0, bo);
                bo->is_primary = true;
        }