[PORT FROM R2] atomisp: hmm: hmm_bo cannot use mutex anymore
authorDavid Cohen <david.a.cohen@intel.com>
Mon, 12 Dec 2011 19:41:20 +0000 (21:41 +0200)
committerbuildbot <buildbot@intel.com>
Mon, 19 Dec 2011 13:38:49 +0000 (05:38 -0800)
BZ: 17272

hmm_bo interface can now be called from interrupt context. This patch
replaces mutex by spinlock to avoid issues in atomic context.

Change-Id: I20cecd2c6c5cb61179ae8757bea37b97f204ff8b
Orig-Change-Id: I0edc7d054af8c2b96c5c9b67a4edccab49af489f
Signed-off-by: David Cohen <david.a.cohen@intel.com>
Reviewed-on: http://android.intel.com:8080/27075
Reviewed-by: Wang, Wen W <wen.w.wang@intel.com>
Reviewed-by: Koskinen, Ilkka <ilkka.koskinen@intel.com>
Reviewed-by: Kruger, Jozef <jozef.kruger@intel.com>
Reviewed-by: Le Thenaff, Erwan <erwan.le.thenaff@intel.com>
Tested-by: Koski, Anttu <anttu.koski@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
Reviewed-on: http://android.intel.com:8080/28057
Reviewed-by: Tuominen, TeemuX <teemux.tuominen@intel.com>
Reviewed-by: Koski, Anttu <anttu.koski@intel.com>
drivers/media/video/atomisp/hmm/hmm_bo.c
drivers/media/video/atomisp/hmm/hmm_bo_dev.c
drivers/media/video/atomisp/include/hmm/hmm_bo_dev.h

index bf539cb..e153b87 100644 (file)
@@ -116,6 +116,8 @@ int hmm_bo_init(struct hmm_bo_device *bdev,
                struct hmm_buffer_object *bo,
                unsigned int pgnr, void (*release) (struct hmm_buffer_object *))
 {
+       unsigned long flags;
+
        if (bdev == NULL) {
                v4l2_warn(&atomisp_dev,
                            "NULL hmm_bo_device.\n");
@@ -155,10 +157,10 @@ int hmm_bo_init(struct hmm_bo_device *bdev,
        /*
         * add to active_bo_list
         */
-       mutex_lock(&bdev->ablist_mutex);
+       spin_lock_irqsave(&bdev->ablist_lock, flags);
        list_add_tail(&bo->list, &bdev->active_bo_list);
        bo->status |= HMM_BO_ACTIVE;
-       mutex_unlock(&bdev->ablist_mutex);
+       spin_unlock_irqrestore(&bdev->ablist_lock, flags);
 
        return 0;
 }
@@ -166,6 +168,7 @@ int hmm_bo_init(struct hmm_bo_device *bdev,
 static void hmm_bo_release(struct hmm_buffer_object *bo)
 {
        struct hmm_bo_device *bdev;
+       unsigned long flags;
 
        check_bo_null_return(bo, (void)0);
 
@@ -207,13 +210,13 @@ static void hmm_bo_release(struct hmm_buffer_object *bo)
         * remove it from buffer device's buffer object list.
         */
        if (hmm_bo_activated(bo)) {
-               mutex_lock(&bdev->ablist_mutex);
+               spin_lock_irqsave(&bdev->ablist_lock, flags);
                list_del(&bo->list);
-               mutex_unlock(&bdev->ablist_mutex);
+               spin_unlock_irqrestore(&bdev->ablist_lock, flags);
        } else {
-               mutex_lock(&bdev->fblist_mutex);
+               spin_lock_irqsave(&bdev->fblist_lock, flags);
                list_del(&bo->list);
-               mutex_unlock(&bdev->fblist_mutex);
+               spin_unlock_irqrestore(&bdev->fblist_lock, flags);
        }
 
        if (bo->release)
@@ -232,6 +235,7 @@ int hmm_bo_activated(struct hmm_buffer_object *bo)
 void hmm_bo_unactivate(struct hmm_buffer_object *bo)
 {
        struct hmm_bo_device *bdev;
+       unsigned long flags;
 
        check_bo_null_return(bo, (void)0);
 
@@ -239,14 +243,14 @@ void hmm_bo_unactivate(struct hmm_buffer_object *bo)
 
        bdev = bo->bdev;
 
-       mutex_lock(&bdev->ablist_mutex);
+       spin_lock_irqsave(&bdev->ablist_lock, flags);
        list_del(&bo->list);
-       mutex_unlock(&bdev->ablist_mutex);
+       spin_unlock_irqrestore(&bdev->ablist_lock, flags);
 
-       mutex_lock(&bdev->fblist_mutex);
+       spin_lock_irqsave(&bdev->fblist_lock, flags);
        list_add_tail(&bo->list, &bdev->free_bo_list);
        bo->status &= (~HMM_BO_ACTIVE);
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
 
        return;
 
index d3e5ddf..9d50825 100644 (file)
@@ -64,8 +64,8 @@ int hmm_bo_device_init(struct hmm_bo_device *bdev,
        INIT_LIST_HEAD(&bdev->free_bo_list);
        INIT_LIST_HEAD(&bdev->active_bo_list);
 
-       mutex_init(&bdev->fblist_mutex);
-       mutex_init(&bdev->ablist_mutex);
+       spin_lock_init(&bdev->fblist_lock);
+       spin_lock_init(&bdev->ablist_lock);
 
        bdev->flag = HMM_BO_DEVICE_INITED;
 
@@ -120,10 +120,11 @@ struct hmm_buffer_object *hmm_bo_device_search_start(struct hmm_bo_device *bdev,
 {
        struct list_head *pos;
        struct hmm_buffer_object *bo;
+       unsigned long flags;
 
        check_bodev_null_return(bdev, NULL);
 
-       mutex_lock(&bdev->ablist_mutex);
+       spin_lock_irqsave(&bdev->ablist_lock, flags);
        list_for_each(pos, &bdev->active_bo_list) {
                bo = list_to_hmm_bo(pos);
                /* pass bo which has no vm_node allocated */
@@ -132,10 +133,10 @@ struct hmm_buffer_object *hmm_bo_device_search_start(struct hmm_bo_device *bdev,
                if (bo->vm_node->start == vaddr)
                        goto found;
        }
-       mutex_unlock(&bdev->ablist_mutex);
+       spin_unlock_irqrestore(&bdev->ablist_lock, flags);
        return NULL;
 found:
-       mutex_unlock(&bdev->ablist_mutex);
+       spin_unlock_irqrestore(&bdev->ablist_lock, flags);
        return bo;
 }
 
@@ -150,10 +151,11 @@ struct hmm_buffer_object *hmm_bo_device_search_in_range(struct hmm_bo_device
 {
        struct list_head *pos;
        struct hmm_buffer_object *bo;
+       unsigned long flags;
 
        check_bodev_null_return(bdev, NULL);
 
-       mutex_lock(&bdev->fblist_mutex);
+       spin_lock_irqsave(&bdev->fblist_lock, flags);
        list_for_each(pos, &bdev->active_bo_list) {
                bo = list_to_hmm_bo(pos);
                /* pass bo which has no vm_node allocated */
@@ -162,10 +164,10 @@ struct hmm_buffer_object *hmm_bo_device_search_in_range(struct hmm_bo_device
                if (in_range(bo->vm_node->start, bo->vm_node->size, vaddr))
                        goto found;
        }
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
        return NULL;
 found:
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
        return bo;
 }
 
@@ -181,24 +183,25 @@ struct hmm_buffer_object *hmm_bo_device_get_bo(struct hmm_bo_device *bdev,
 {
        struct list_head *pos;
        struct hmm_buffer_object *bo;
+       unsigned long flags;
 
        check_bodev_null_return(bdev, NULL);
 
-       mutex_lock(&bdev->fblist_mutex);
+       spin_lock_irqsave(&bdev->fblist_lock, flags);
        list_for_each(pos, &bdev->free_bo_list) {
                bo = list_to_hmm_bo(pos);
                if (bo->pgnr == pgnr)
                        goto found;
        }
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
        return NULL;
 found:
        list_del(&bo->list);
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
 
-       mutex_lock(&bdev->ablist_mutex);
+       spin_lock_irqsave(&bdev->ablist_lock, flags);
        list_add(&bo->list, &bdev->active_bo_list);
-       mutex_unlock(&bdev->ablist_mutex);
+       spin_unlock_irqrestore(&bdev->ablist_lock, flags);
 
        return bo;
 }
@@ -209,10 +212,11 @@ found:
 void hmm_bo_device_destroy_free_bo_list(struct hmm_bo_device *bdev)
 {
        struct hmm_buffer_object *bo;
+       unsigned long flags;
 
        check_bodev_null_return(bdev, (void)0);
 
-       mutex_lock(&bdev->fblist_mutex);
+       spin_lock_irqsave(&bdev->fblist_lock, flags);
        while (!list_empty(&bdev->free_bo_list)) {
                bo = list_first_entry(&bdev->free_bo_list,
                                      struct hmm_buffer_object, list);
@@ -220,7 +224,7 @@ void hmm_bo_device_destroy_free_bo_list(struct hmm_bo_device *bdev)
                list_del(&bo->list);
                hmm_bo_unref(bo);
        }
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
 }
 
 /*
@@ -231,10 +235,11 @@ void hmm_bo_device_destroy_free_bo_addr(struct hmm_bo_device *bdev,
 {
        struct list_head *pos;
        struct hmm_buffer_object *bo;
+       unsigned long flags;
 
        check_bodev_null_return(bdev, (void)0);
 
-       mutex_lock(&bdev->fblist_mutex);
+       spin_lock_irqsave(&bdev->fblist_lock, flags);
        list_for_each(pos, &bdev->free_bo_list) {
                bo = list_to_hmm_bo(pos);
                /* pass bo which has no vm_node allocated */
@@ -243,11 +248,11 @@ void hmm_bo_device_destroy_free_bo_addr(struct hmm_bo_device *bdev,
                if (bo->vm_node->start == vaddr)
                        goto found;
        }
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
        return;
 found:
        list_del(&bo->list);
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
        hmm_bo_unref(bo);
 }
 
@@ -259,21 +264,22 @@ void hmm_bo_device_destroy_free_bo_size(struct hmm_bo_device *bdev,
 {
        struct list_head *pos;
        struct hmm_buffer_object *bo;
+       unsigned long flags;
 
        check_bodev_null_return(bdev, (void)0);
 
 retry:
-       mutex_lock(&bdev->fblist_mutex);
+       spin_lock_irqsave(&bdev->fblist_lock, flags);
        list_for_each(pos, &bdev->free_bo_list) {
                bo = list_to_hmm_bo(pos);
                if (bo->pgnr == pgnr)
                        goto found;
        }
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
        return;
 found:
        list_del(&bo->list);
-       mutex_unlock(&bdev->fblist_mutex);
+       spin_unlock_irqrestore(&bdev->fblist_lock, flags);
        hmm_bo_unref(bo);
        goto retry;
 }
index 0020d09..fbf2d2d 100644 (file)
@@ -49,9 +49,9 @@ struct hmm_bo_device {
        struct hmm_vm           vaddr_space;
 
        struct list_head        free_bo_list;
-       struct mutex            fblist_mutex;
+       struct spinlock         fblist_lock;
        struct list_head        active_bo_list;
-       struct mutex            ablist_mutex;
+       struct spinlock         ablist_lock;
 
        int                     flag;
 };