From 1c055e55a242a33e574e48be530e06770a210dcd Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 19 Feb 2024 03:26:26 +0000
Subject: [PATCH] add r8169 read mac form eeprom

---
 kernel/drivers/dma-buf/dma-buf-cache.c |  102 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 63 insertions(+), 39 deletions(-)

diff --git a/kernel/drivers/dma-buf/dma-buf-cache.c b/kernel/drivers/dma-buf/dma-buf-cache.c
index 7bfa6a5..5ec8896 100644
--- a/kernel/drivers/dma-buf/dma-buf-cache.c
+++ b/kernel/drivers/dma-buf/dma-buf-cache.c
@@ -8,9 +8,10 @@
 #undef CONFIG_DMABUF_CACHE
 #include <linux/dma-buf-cache.h>
 
+/* NOTE: dma-buf-cache APIs are not irq safe, please DO NOT run in irq context !! */
+
 struct dma_buf_cache_list {
 	struct list_head head;
-	struct mutex lock;
 };
 
 struct dma_buf_cache {
@@ -25,9 +26,10 @@
 	struct dma_buf_cache_list *data;
 	struct dma_buf_cache *cache, *tmp;
 
+	mutex_lock(&dmabuf->cache_lock);
+
 	data = dmabuf->dtor_data;
 
-	mutex_lock(&data->lock);
 	list_for_each_entry_safe(cache, tmp, &data->head, list) {
 		if (!IS_ERR_OR_NULL(cache->sg_table))
 			dma_buf_unmap_attachment(cache->attach,
@@ -37,9 +39,9 @@
 		dma_buf_detach(dmabuf, cache->attach);
 		list_del(&cache->list);
 		kfree(cache);
-
 	}
-	mutex_unlock(&data->lock);
+
+	mutex_unlock(&dmabuf->cache_lock);
 
 	kfree(data);
 	return 0;
@@ -57,14 +59,10 @@
 
 	data = dmabuf->dtor_data;
 
-	mutex_lock(&data->lock);
 	list_for_each_entry(cache, &data->head, list) {
-		if (cache->attach == attach) {
-			mutex_unlock(&data->lock);
+		if (cache->attach == attach)
 			return cache;
-		}
 	}
-	mutex_unlock(&data->lock);
 
 	return NULL;
 }
@@ -74,9 +72,13 @@
 {
 	struct dma_buf_cache *cache;
 
+	mutex_lock(&dmabuf->cache_lock);
+
 	cache = dma_buf_cache_get_cache(attach);
 	if (!cache)
 		dma_buf_detach(dmabuf, attach);
+
+	mutex_unlock(&dmabuf->cache_lock);
 }
 EXPORT_SYMBOL(dma_buf_cache_detach);
 
@@ -87,49 +89,58 @@
 	struct dma_buf_cache_list *data;
 	struct dma_buf_cache *cache;
 
+	mutex_lock(&dmabuf->cache_lock);
+
 	if (!dmabuf->dtor) {
 		data = kzalloc(sizeof(*data), GFP_KERNEL);
-		if (!data)
-			return ERR_PTR(-ENOMEM);
-
-		mutex_init(&data->lock);
+		if (!data) {
+			attach = ERR_PTR(-ENOMEM);
+			goto err_data;
+		}
 		INIT_LIST_HEAD(&data->head);
-
 		dma_buf_set_destructor(dmabuf, dma_buf_cache_destructor, data);
 	}
 
-	if (dmabuf->dtor && dmabuf->dtor != dma_buf_cache_destructor)
-		return dma_buf_attach(dmabuf, dev);
+	if (dmabuf->dtor && dmabuf->dtor != dma_buf_cache_destructor) {
+		attach = dma_buf_attach(dmabuf, dev);
+		goto attach_done;
+	}
 
 	data = dmabuf->dtor_data;
 
-	mutex_lock(&data->lock);
 	list_for_each_entry(cache, &data->head, list) {
 		if (cache->attach->dev == dev) {
 			/* Already attached */
-			mutex_unlock(&data->lock);
-			return cache->attach;
+			attach = cache->attach;
+			goto attach_done;
 		}
 	}
-	mutex_unlock(&data->lock);
 
 	cache = kzalloc(sizeof(*cache), GFP_KERNEL);
-	if (!cache)
-		return ERR_PTR(-ENOMEM);
-
+	if (!cache) {
+		attach = ERR_PTR(-ENOMEM);
+		goto err_cache;
+	}
 	/* Cache attachment */
 	attach = dma_buf_attach(dmabuf, dev);
-	if (IS_ERR_OR_NULL(attach)) {
-		kfree(cache);
-		return attach;
-	}
+	if (IS_ERR_OR_NULL(attach))
+		goto err_attach;
 
 	cache->attach = attach;
-	mutex_lock(&data->lock);
 	list_add(&cache->list, &data->head);
-	mutex_unlock(&data->lock);
 
-	return cache->attach;
+attach_done:
+	mutex_unlock(&dmabuf->cache_lock);
+	return attach;
+
+err_attach:
+	kfree(cache);
+err_cache:
+	kfree(data);
+	dma_buf_set_destructor(dmabuf, NULL, NULL);
+err_data:
+	mutex_unlock(&dmabuf->cache_lock);
+	return attach;
 }
 EXPORT_SYMBOL(dma_buf_cache_attach);
 
@@ -137,38 +148,51 @@
 				    struct sg_table *sg_table,
 				    enum dma_data_direction direction)
 {
+	struct dma_buf *dmabuf = attach->dmabuf;
 	struct dma_buf_cache *cache;
+
+	mutex_lock(&dmabuf->cache_lock);
 
 	cache = dma_buf_cache_get_cache(attach);
 	if (!cache)
 		dma_buf_unmap_attachment(attach, sg_table, direction);
+
+	mutex_unlock(&dmabuf->cache_lock);
 }
 EXPORT_SYMBOL(dma_buf_cache_unmap_attachment);
 
 struct sg_table *dma_buf_cache_map_attachment(struct dma_buf_attachment *attach,
 					      enum dma_data_direction direction)
 {
+	struct dma_buf *dmabuf = attach->dmabuf;
 	struct dma_buf_cache *cache;
+	struct sg_table *sg_table;
+
+	mutex_lock(&dmabuf->cache_lock);
 
 	cache = dma_buf_cache_get_cache(attach);
-	if (!cache)
-		return dma_buf_map_attachment(attach, direction);
-
+	if (!cache) {
+		sg_table = dma_buf_map_attachment(attach, direction);
+		goto map_done;
+	}
 	if (cache->sg_table) {
 		/* Already mapped */
-		if (cache->direction == direction)
-			return cache->sg_table;
-
+		if (cache->direction == direction) {
+			sg_table = cache->sg_table;
+			goto map_done;
+		}
 		/* Different directions */
 		dma_buf_unmap_attachment(attach, cache->sg_table,
 					 cache->direction);
-
 	}
 
 	/* Cache map */
-	cache->sg_table = dma_buf_map_attachment(attach, direction);
+	sg_table = dma_buf_map_attachment(attach, direction);
+	cache->sg_table = sg_table;
 	cache->direction = direction;
 
-	return cache->sg_table;
+map_done:
+	mutex_unlock(&dmabuf->cache_lock);
+	return sg_table;
 }
 EXPORT_SYMBOL(dma_buf_cache_map_attachment);

--
Gitblit v1.6.2