]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: nvmap: replace mutex with spinlock
authorKirill Artamonov <kartamonov@nvidia.com>
Mon, 14 Feb 2011 23:07:20 +0000 (01:07 +0200)
committerDan Willemsen <dwillemsen@nvidia.com>
Sat, 14 Sep 2013 08:18:11 +0000 (01:18 -0700)
There are places where nvmap_free_handle_id is called
when interrupts are disabled and mutex cannot be used as
nvmap handle lock.

Original-Change-Id: Icc220fe627c08f21c677d936a54f70c818dc8e8c
Reviewed-on: http://git-master/r/19489
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Tested-by: Varun Colbert <vcolbert@nvidia.com>
Rebase-Id: Rb5a58e8226ad14340d1acae007d6b632960fae16

drivers/video/tegra/nvmap/nvmap.c
drivers/video/tegra/nvmap/nvmap.h
drivers/video/tegra/nvmap/nvmap_dev.c
drivers/video/tegra/nvmap/nvmap_handle.c
drivers/video/tegra/nvmap/nvmap_heap.c
drivers/video/tegra/nvmap/nvmap_ioctl.c

index ecc3b49bf60e4119403e54e2627aba63ae217793..f12eb0c02bf961478a6e052d57f3589c6fac2f1a 100644 (file)
@@ -578,9 +578,9 @@ unsigned long nvmap_handle_address(struct nvmap_client *c, unsigned long id)
        h = nvmap_get_handle_id(c, id);
        if (!h)
                return -EPERM;
-       mutex_lock(&h->lock);
+       spin_lock(&h->lock);
        phys = handle_phys(h);
-       mutex_unlock(&h->lock);
+       spin_unlock(&h->lock);
        nvmap_handle_put(h);
 
        return phys;
index 54d9fc664591fe6a826a83134399946dc3ab4d91..0d1e1eec48b5564cbd9eebc877c980eb34e60aa7 100644 (file)
@@ -81,7 +81,7 @@ struct nvmap_handle {
        bool secure;            /* zap IOVMM area on unpin */
        bool heap_pgalloc;      /* handle is page allocated (sysmem / iovmm) */
        bool alloc;             /* handle has memory allocated */
-       struct mutex lock;
+       spinlock_t lock;
 };
 
 struct nvmap_share {
index c36491d78e3e9613fe4b0aa0ffd8a6b44359d8b6..301366925a1d49e363e24cf4f6918b7e65e67a26 100644 (file)
@@ -652,10 +652,10 @@ static void destroy_client(struct nvmap_client *client)
                smp_rmb();
                pins = atomic_read(&ref->pin);
 
-               mutex_lock(&ref->handle->lock);
+               spin_lock(&ref->handle->lock);
                if (ref->handle->owner == client)
                    ref->handle->owner = NULL;
-               mutex_unlock(&ref->handle->lock);
+               spin_unlock(&ref->handle->lock);
 
                while (pins--)
                        nvmap_unpin_handles(client, &ref->handle, 1);
index f01149dfabe4c9360a8ae892dda36a35e01584e7..c8a2c1fc9c79e645167909ee4912a98aa836ad20 100644 (file)
@@ -371,11 +371,11 @@ void nvmap_free_handle_id(struct nvmap_client *client, unsigned long id)
                atomic_sub(h->size, &client->iovm_commit);
 
        if (h->alloc && !h->heap_pgalloc) {
-               mutex_lock(&h->lock);
+               spin_lock(&h->lock);
                nvmap_carveout_commit_subtract(client,
                        nvmap_heap_to_arg(nvmap_block_to_heap(h->carveout)),
                        h->size);
-               mutex_unlock(&h->lock);
+               spin_unlock(&h->lock);
        }
 
        nvmap_ref_unlock(client);
@@ -387,10 +387,10 @@ void nvmap_free_handle_id(struct nvmap_client *client, unsigned long id)
        while (pins--)
                nvmap_unpin_handles(client, &ref->handle, 1);
 
-       mutex_lock(&h->lock);
+       spin_lock(&h->lock);
        if (h->owner == client)
                h->owner = NULL;
-       mutex_unlock(&h->lock);
+       spin_unlock(&h->lock);
 
        kfree(ref);
 
@@ -446,7 +446,7 @@ struct nvmap_handle_ref *nvmap_create_handle(struct nvmap_client *client,
        BUG_ON(!h->owner);
        h->size = h->orig_size = size;
        h->flags = NVMAP_HANDLE_WRITE_COMBINE;
-       mutex_init(&h->lock);
+       spin_lock_init(&h->lock);
 
        nvmap_handle_add(client->dev, h);
 
@@ -516,11 +516,11 @@ struct nvmap_handle_ref *nvmap_duplicate_handle_id(struct nvmap_client *client,
        }
 
        if (!h->heap_pgalloc) {
-               mutex_lock(&h->lock);
+               spin_lock(&h->lock);
                nvmap_carveout_commit_add(client,
                        nvmap_heap_to_arg(nvmap_block_to_heap(h->carveout)),
                        h->size);
-               mutex_unlock(&h->lock);
+               spin_unlock(&h->lock);
        }
 
        atomic_set(&ref->dupes, 1);
index 34166da22919da760cede56cd84f62f9344fd6f7..b7a9050938d3a44dfb93cb49fd829e968d693ad7 100644 (file)
@@ -703,10 +703,10 @@ static struct nvmap_heap_block *do_heap_relocate_listblock(
                return NULL;
        }
 
-       mutex_lock(&handle->lock);
+       spin_lock(&handle->lock);
 
        if (!handle->owner) {
-               mutex_unlock(&handle->lock);
+               spin_unlock(&handle->lock);
                return NULL;
        }
 
@@ -757,7 +757,7 @@ static struct nvmap_heap_block *do_heap_relocate_listblock(
 
 fail:
        mutex_unlock(&handle->owner->share->pin_lock);
-       mutex_unlock(&handle->lock);
+       spin_unlock(&handle->lock);
        return heap_block_new;
 }
 
@@ -830,9 +830,9 @@ static void nvmap_heap_compact(struct nvmap_heap *heap,
 void nvmap_usecount_inc(struct nvmap_handle *h)
 {
        if (h->alloc && !h->heap_pgalloc) {
-               mutex_lock(&h->lock);
+               spin_lock(&h->lock);
                h->usecount++;
-               mutex_unlock(&h->lock);
+               spin_unlock(&h->lock);
        } else {
                h->usecount++;
        }
index 91d0a148202bc2800891040daa5044f06076e955..52cb5439f9ce403e1e77d77f57efd07d456d51e3 100644 (file)
@@ -311,7 +311,7 @@ int nvmap_ioctl_get_param(struct file *filp, void __user* arg)
                op.result = h->orig_size;
                break;
        case NVMAP_HANDLE_PARAM_ALIGNMENT:
-               mutex_lock(&h->lock);
+               spin_lock(&h->lock);
                if (!h->alloc)
                        op.result = 0;
                else if (h->heap_pgalloc)
@@ -320,15 +320,15 @@ int nvmap_ioctl_get_param(struct file *filp, void __user* arg)
                        op.result = (h->carveout->base & -h->carveout->base);
                else
                        op.result = SZ_4M;
-               mutex_unlock(&h->lock);
+               spin_unlock(&h->lock);
                break;
        case NVMAP_HANDLE_PARAM_BASE:
                if (WARN_ON(!h->alloc || !atomic_add_return(0, &h->pin)))
                        op.result = -1ul;
                else if (!h->heap_pgalloc) {
-                       mutex_lock(&h->lock);
+                       spin_lock(&h->lock);
                        op.result = h->carveout->base;
-                       mutex_unlock(&h->lock);
+                       spin_unlock(&h->lock);
                }
                else if (h->pgalloc.contig)
                        op.result = page_to_phys(h->pgalloc.pages[0]);
@@ -341,9 +341,9 @@ int nvmap_ioctl_get_param(struct file *filp, void __user* arg)
                if (!h->alloc)
                        op.result = 0;
                else if (!h->heap_pgalloc) {
-                       mutex_lock(&h->lock);
+                       spin_lock(&h->lock);
                        op.result = nvmap_carveout_usage(client, h->carveout);
-                       mutex_unlock(&h->lock);
+                       spin_unlock(&h->lock);
                }
                else if (h->pgalloc.contig)
                        op.result = NVMAP_HEAP_SYSMEM;