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 <zzyiwei@chromium.org>
Tested-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Chia-I Wu <olv@google.com>
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 @@
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 @@
}
}
- 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 @@
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 @@
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 @@
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;