[RFC][PATCH 4/5] libdrm: reduce number of reallocations in drmModeAtomicAddProperty

Alex Deucher alexdeucher at gmail.com
Mon Apr 22 15:06:12 UTC 2019


On Sat, Apr 20, 2019 at 12:25 AM John Stultz <john.stultz at linaro.org> wrote:
>
> From: Adrian Salido <salidoa at google.com>
>
> When calling drmModeAtomicAddProperty allocation of memory happens as
> needed in increments of 16 elements. This can be very slow if there are
> multiple properties to be updated in an Atomic Commit call.
>
> Increase this to as many as can fit in a memory PAGE to avoid having to
> reallocate memory too often.
>
> Cc: Emil Velikov <emil.velikov at collabora.com>
> Cc: Sean Paul <seanpaul at chromium.org>
> Cc: Alistair Strachan <astrachan at google.com>
> Cc: Marissa Wall <marissaw at google.com>
> Signed-off-by: John Stultz <john.stultz at linaro.org>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  xf86drmMode.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/xf86drmMode.c b/xf86drmMode.c
> index 8f8633e..c878d9e 100644
> --- a/xf86drmMode.c
> +++ b/xf86drmMode.c
> @@ -1259,7 +1259,7 @@ drm_public drmModeAtomicReqPtr drmModeAtomicDuplicate(drmModeAtomicReqPtr old)
>                         return NULL;
>                 }
>                 memcpy(new->items, old->items,
> -                      old->size_items * sizeof(*new->items));
> +                      old->cursor * sizeof(*new->items));
>         } else {
>                 new->items = NULL;
>         }
> @@ -1322,12 +1322,13 @@ drm_public int drmModeAtomicAddProperty(drmModeAtomicReqPtr req,
>                 return -EINVAL;
>
>         if (req->cursor >= req->size_items) {
> +               const uint32_t item_size_inc = getpagesize() / sizeof(*req->items);
>                 drmModeAtomicReqItemPtr new;
>
> -               req->size_items += 16;
> +               req->size_items += item_size_inc;
>                 new = realloc(req->items, req->size_items * sizeof(*req->items));
>                 if (!new) {
> -                       req->size_items -= 16;
> +                       req->size_items -= item_size_inc;
>                         return -ENOMEM;
>                 }
>                 req->items = new;
> --
> 2.7.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list