Lines Matching +full:cache +full:-

1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/dma-buf.h>
9 #include <linux/dma-buf-cache.h>
11 /* NOTE: dma-buf-cache APIs are not irq safe, please DO NOT run in irq context !! */
27 struct dma_buf_cache *cache, *tmp; in dma_buf_cache_destructor() local
29 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_destructor()
31 data = dmabuf->dtor_data; in dma_buf_cache_destructor()
33 list_for_each_entry_safe(cache, tmp, &data->head, list) { in dma_buf_cache_destructor()
34 if (!IS_ERR_OR_NULL(cache->sg_table)) in dma_buf_cache_destructor()
35 dma_buf_unmap_attachment(cache->attach, in dma_buf_cache_destructor()
36 cache->sg_table, in dma_buf_cache_destructor()
37 cache->direction); in dma_buf_cache_destructor()
39 dma_buf_detach(dmabuf, cache->attach); in dma_buf_cache_destructor()
40 list_del(&cache->list); in dma_buf_cache_destructor()
41 kfree(cache); in dma_buf_cache_destructor()
44 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_destructor()
54 struct dma_buf_cache *cache; in dma_buf_cache_get_cache() local
55 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_cache_get_cache()
57 if (dmabuf->dtor != dma_buf_cache_destructor) in dma_buf_cache_get_cache()
60 data = dmabuf->dtor_data; in dma_buf_cache_get_cache()
62 list_for_each_entry(cache, &data->head, list) { in dma_buf_cache_get_cache()
63 if (cache->attach == attach) in dma_buf_cache_get_cache()
64 return cache; in dma_buf_cache_get_cache()
73 struct dma_buf_cache *cache; in dma_buf_cache_detach() local
75 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_detach()
77 cache = dma_buf_cache_get_cache(attach); in dma_buf_cache_detach()
78 if (!cache) in dma_buf_cache_detach()
81 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_detach()
90 struct dma_buf_cache *cache; in dma_buf_cache_attach() local
92 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_attach()
94 if (!dmabuf->dtor) { in dma_buf_cache_attach()
97 attach = ERR_PTR(-ENOMEM); in dma_buf_cache_attach()
100 INIT_LIST_HEAD(&data->head); in dma_buf_cache_attach()
104 if (dmabuf->dtor && dmabuf->dtor != dma_buf_cache_destructor) { in dma_buf_cache_attach()
109 data = dmabuf->dtor_data; in dma_buf_cache_attach()
111 list_for_each_entry(cache, &data->head, list) { in dma_buf_cache_attach()
112 if (cache->attach->dev == dev) { in dma_buf_cache_attach()
114 attach = cache->attach; in dma_buf_cache_attach()
119 cache = kzalloc(sizeof(*cache), GFP_KERNEL); in dma_buf_cache_attach()
120 if (!cache) { in dma_buf_cache_attach()
121 attach = ERR_PTR(-ENOMEM); in dma_buf_cache_attach()
124 /* Cache attachment */ in dma_buf_cache_attach()
129 cache->attach = attach; in dma_buf_cache_attach()
130 list_add(&cache->list, &data->head); in dma_buf_cache_attach()
133 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_attach()
137 kfree(cache); in dma_buf_cache_attach()
142 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_attach()
151 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_cache_unmap_attachment()
152 struct dma_buf_cache *cache; in dma_buf_cache_unmap_attachment() local
154 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_unmap_attachment()
156 cache = dma_buf_cache_get_cache(attach); in dma_buf_cache_unmap_attachment()
157 if (!cache) in dma_buf_cache_unmap_attachment()
160 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_unmap_attachment()
167 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_cache_map_attachment()
168 struct dma_buf_cache *cache; in dma_buf_cache_map_attachment() local
171 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_map_attachment()
173 cache = dma_buf_cache_get_cache(attach); in dma_buf_cache_map_attachment()
174 if (!cache) { in dma_buf_cache_map_attachment()
178 if (cache->sg_table) { in dma_buf_cache_map_attachment()
180 if (cache->direction == direction) { in dma_buf_cache_map_attachment()
181 sg_table = cache->sg_table; in dma_buf_cache_map_attachment()
185 dma_buf_unmap_attachment(attach, cache->sg_table, in dma_buf_cache_map_attachment()
186 cache->direction); in dma_buf_cache_map_attachment()
189 /* Cache map */ in dma_buf_cache_map_attachment()
191 cache->sg_table = sg_table; in dma_buf_cache_map_attachment()
192 cache->direction = direction; in dma_buf_cache_map_attachment()
195 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_map_attachment()