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;