From e12d3ae83d2bff8e80bfc8112b57b7b87b3faef5 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Mon, 27 Sep 2021 19:58:56 +0000 Subject: [PATCH] virtgpu_crosdomain: add metadata_cache_lock crosdomain specific metadata_cache should be protected by a backend specific lock to reduce lock contention. BUG=b:201110412 TEST=CQ Change-Id: Ic3cedd7ad7903e669f7fba2b5f45d88739fbdc97 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3188471 Commit-Queue: Yiwei Zhang Tested-by: Yiwei Zhang Reviewed-by: Chia-I Wu --- drv_priv.h | 1 - virtgpu_cross_domain.c | 17 ++++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/drv_priv.h b/drv_priv.h index b570c3b..72166d7 100644 --- a/drv_priv.h +++ b/drv_priv.h @@ -71,7 +71,6 @@ struct driver { * The driver_lock currently protects: * 1. buffer_table * 2. mappings - * 3. metadata_cache in virtgpu_cros_domain */ pthread_mutex_t driver_lock; bool compression; diff --git a/virtgpu_cross_domain.c b/virtgpu_cross_domain.c index c2e85af..c999a4f 100644 --- a/virtgpu_cross_domain.c +++ b/virtgpu_cross_domain.c @@ -36,6 +36,7 @@ struct cross_domain_private { uint32_t ring_handle; void *ring_addr; struct drv_array *metadata_cache; + pthread_mutex_t metadata_cache_lock; }; static void cross_domain_release_private(struct driver *drv) @@ -57,7 +58,11 @@ static void cross_domain_release_private(struct driver *drv) } } - drv_array_destroy(priv->metadata_cache); + if (priv->metadata_cache) + drv_array_destroy(priv->metadata_cache); + + pthread_mutex_destroy(&priv->metadata_cache_lock); + free(priv); } @@ -150,7 +155,7 @@ static int cross_domain_metadata_query(struct driver *drv, struct bo_metadata *m uint32_t plane, remaining_size; memset(&cmd_get_reqs, 0, sizeof(cmd_get_reqs)); - pthread_mutex_lock(&drv->driver_lock); + pthread_mutex_lock(&priv->metadata_cache_lock); for (uint32_t i = 0; i < drv_array_size(priv->metadata_cache); i++) { cached_data = (struct bo_metadata *)drv_array_at_idx(priv->metadata_cache, i); if (!metadata_equal(metadata, cached_data)) @@ -203,7 +208,7 @@ static int cross_domain_metadata_query(struct driver *drv, struct bo_metadata *m drv_array_append(priv->metadata_cache, metadata); out_unlock: - pthread_mutex_unlock(&drv->driver_lock); + pthread_mutex_unlock(&priv->metadata_cache_lock); return ret; } @@ -246,6 +251,12 @@ static int cross_domain_init(struct driver *drv) if (!priv) return -ENOMEM; + ret = pthread_mutex_init(&priv->metadata_cache_lock, NULL); + if (!ret) { + free(priv); + return ret; + } + priv->metadata_cache = drv_array_init(sizeof(struct bo_metadata)); if (!priv->metadata_cache) { ret = -ENOMEM;