From: David Cohen Date: Mon, 12 Dec 2011 19:41:20 +0000 (+0200) Subject: [PORT FROM R2] atomisp: hmm: hmm_bo cannot use mutex anymore X-Git-Tag: 2.1b_release~1729 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b318087ffc6ef144ad8453652ed4cd056e13ccf9;p=kernel%2Fkernel-mfld-blackbay.git [PORT FROM R2] atomisp: hmm: hmm_bo cannot use mutex anymore 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 Reviewed-on: http://android.intel.com:8080/27075 Reviewed-by: Wang, Wen W Reviewed-by: Koskinen, Ilkka Reviewed-by: Kruger, Jozef Reviewed-by: Le Thenaff, Erwan Tested-by: Koski, Anttu Reviewed-by: buildbot Tested-by: buildbot Reviewed-on: http://android.intel.com:8080/28057 Reviewed-by: Tuominen, TeemuX Reviewed-by: Koski, Anttu --- diff --git a/drivers/media/video/atomisp/hmm/hmm_bo.c b/drivers/media/video/atomisp/hmm/hmm_bo.c index bf539cb..e153b87 100644 --- a/drivers/media/video/atomisp/hmm/hmm_bo.c +++ b/drivers/media/video/atomisp/hmm/hmm_bo.c @@ -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; diff --git a/drivers/media/video/atomisp/hmm/hmm_bo_dev.c b/drivers/media/video/atomisp/hmm/hmm_bo_dev.c index d3e5ddf..9d50825 100644 --- a/drivers/media/video/atomisp/hmm/hmm_bo_dev.c +++ b/drivers/media/video/atomisp/hmm/hmm_bo_dev.c @@ -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; } diff --git a/drivers/media/video/atomisp/include/hmm/hmm_bo_dev.h b/drivers/media/video/atomisp/include/hmm/hmm_bo_dev.h index 0020d09..fbf2d2d 100644 --- a/drivers/media/video/atomisp/include/hmm/hmm_bo_dev.h +++ b/drivers/media/video/atomisp/include/hmm/hmm_bo_dev.h @@ -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; };