diff mbox

[qxl] qxl: don't create too large primary surface

Message ID 1413452384-20223-1-git-send-email-marcandre.lureau@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Marc-André Lureau Oct. 16, 2014, 9:39 a.m. UTC
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>
---
 drivers/gpu/drm/qxl/qxl_display.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

Comments

Marc-André Lureau Oct. 27, 2014, 1:35 p.m. UTC | #1
ping

On Thu, Oct 16, 2014 at 11:39 AM, Marc-André Lureau <
marcandre.lureau@gmail.com> wrote:

> 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>
> ---
>  drivers/gpu/drm/qxl/qxl_display.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/qxl/qxl_display.c
> b/drivers/gpu/drm/qxl/qxl_display.c
> index 5d7ea24..98a344c 100644
> --- a/drivers/gpu/drm/qxl/qxl_display.c
> +++ b/drivers/gpu/drm/qxl/qxl_display.c
> @@ -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;
>         }
>
> --
> 1.9.3
>
>
Dave Airlie Oct. 28, 2014, 12:01 a.m. UTC | #2
It's been in Linus tree for a few days now .

c572aaf46f71f63ae5914d4e194a955e0ba1b519

Dave.

On 27 October 2014 23:35, Marc-André Lureau <marcandre.lureau@gmail.com> wrote:
> ping
>
> On Thu, Oct 16, 2014 at 11:39 AM, Marc-André Lureau
> <marcandre.lureau@gmail.com> wrote:
>>
>> 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>
>> ---
>>  drivers/gpu/drm/qxl/qxl_display.c | 16 ++++++++--------
>>  1 file changed, 8 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/qxl/qxl_display.c
>> b/drivers/gpu/drm/qxl/qxl_display.c
>> index 5d7ea24..98a344c 100644
>> --- a/drivers/gpu/drm/qxl/qxl_display.c
>> +++ b/drivers/gpu/drm/qxl/qxl_display.c
>> @@ -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;
>>         }
>>
>> --
>> 1.9.3
>>
>
>
>
> --
> Marc-André Lureau
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
index 5d7ea24..98a344c 100644
--- a/drivers/gpu/drm/qxl/qxl_display.c
+++ b/drivers/gpu/drm/qxl/qxl_display.c
@@ -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;
 	}