[Spice-devel] [PATCH] Simplify memory management for the primary screen.
Alon Levy
alevy at redhat.com
Thu Sep 13 08:06:08 PDT 2012
> Passing NULL for pbits into fbScreenInit is a treacherous
> thing to do. It works, because we rapidly resize
> the screen, and because the normal path never uses
> the screen pixmap.
>
> However, having NULL for pbits has side effects that derive
> from the fact that NULL prevents ModifyPixmapHeader
> from doing anything, which leaves the internal Screen Pixmap
> pointer pointing to the end of an allocation, where
> careless use can corrupt memory willy nilly.
>
> We didn't really have a compelling reason to do this;
> the qxl->fb memory can be dedicated to just screen use,
> and the host_image can manage it's own memory.
> ---
> src/qxl_driver.c | 2 +-
> src/qxl_surface.c | 8 +-------
> 2 files changed, 2 insertions(+), 8 deletions(-)
>
> diff --git a/src/qxl_driver.c b/src/qxl_driver.c
> index dbb8ceb..dbb66b3 100644
> --- a/src/qxl_driver.c
> +++ b/src/qxl_driver.c
> @@ -1717,7 +1717,7 @@ qxl_fb_init (qxl_screen_t *qxl, ScreenPtr
> pScreen)
> ErrorF ("allocated %d x %d %p\n", pScrn->virtualX,
> pScrn->virtualY, qxl->fb);
> #endif
>
> - if (!fbScreenInit (pScreen, NULL,
> + if (!fbScreenInit (pScreen, qxl->fb,
> pScrn->virtualX, pScrn->virtualY,
> pScrn->xDpi, pScrn->yDpi,
> pScrn->displayWidth,
> pScrn->bitsPerPixel))
> diff --git a/src/qxl_surface.c b/src/qxl_surface.c
> index e88675f..76ec7d1 100644
> --- a/src/qxl_surface.c
> +++ b/src/qxl_surface.c
> @@ -404,15 +404,9 @@ qxl_surface_cache_create_primary
> (surface_cache_t *cache,
> dev_image = pixman_image_create_bits (format, mode->x_res,
> mode->y_res,
> (uint32_t *)dev_addr, -mode->stride);
>
> - if (qxl->fb != NULL)
> - free(qxl->fb);
> - qxl->fb = calloc (qxl->virtual_x * qxl->virtual_y, 4);
> - if (!qxl->fb)
> - return NULL;
> -
> host_image = pixman_image_create_bits (format,
> qxl->virtual_x, qxl->virtual_y,
> - qxl->fb, mode->stride);
> + NULL, mode->stride);
So we allocate another framebuffer here. Hmm, it is just another 1-16 MB of memory ;)
Do you have an example how to produce corruption?
Can you reuse the same buffer and still pass non NULL? I think it might not be trivial though, so in that case I'm ok with this since I don't see any other option.
> #if 0
> xf86DrvMsg(cache->qxl->pScrn->scrnIndex, X_ERROR,
> "testing dev_image memory (%d x %d)\n",
> --
> 1.7.10.4
>
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list