From e7a6f4a62ae625200be0b3350bf0e40d3a830a93 Mon Sep 17 00:00:00 2001 From: Ilkka Koskinen Date: Wed, 4 Jan 2012 16:36:11 +0200 Subject: [PATCH] atomisp: hmm: Release the spin lock before unref'ing a block object BZ: 19462 hmm_bo_device_destroy_free_bo_list held a spin lock when unreferencing a block object. Moreover, hmm_bo_release tries to acquire the same spin lock. In addition, reduce the time interrupts are disabled by changing list handling. Change-Id: I7bbb5559f8caa8d6c696040e8ec04205e30b7c90 Signed-off-by: Ilkka Koskinen Reviewed-on: http://android.intel.com:8080/30889 Reviewed-by: Cohen, David A Reviewed-by: Kruger, Jozef Reviewed-by: Toivonen, Tuukka Reviewed-by: Yang, Fei Reviewed-by: Wang, Wen W Reviewed-by: Gross, Mark Tested-by: Lampila, KalleX Reviewed-by: buildbot Tested-by: buildbot --- drivers/media/video/atomisp/hmm/hmm_bo_dev.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/media/video/atomisp/hmm/hmm_bo_dev.c b/drivers/media/video/atomisp/hmm/hmm_bo_dev.c index e3b55e5..b8959e3 100644 --- a/drivers/media/video/atomisp/hmm/hmm_bo_dev.c +++ b/drivers/media/video/atomisp/hmm/hmm_bo_dev.c @@ -207,20 +207,20 @@ found: */ void hmm_bo_device_destroy_free_bo_list(struct hmm_bo_device *bdev) { - struct hmm_buffer_object *bo; + struct hmm_buffer_object *bo, *tmp; unsigned long flags; + struct list_head new_head; check_bodev_null_return(bdev, (void)0); spin_lock_irqsave(&bdev->list_lock, flags); - while (!list_empty(&bdev->free_bo_list)) { - bo = list_first_entry(&bdev->free_bo_list, - struct hmm_buffer_object, list); + list_replace_init(&bdev->free_bo_list, &new_head); + spin_unlock_irqrestore(&bdev->list_lock, flags); + list_for_each_entry_safe(bo, tmp, &new_head, list) { list_del(&bo->list); hmm_bo_unref(bo); } - spin_unlock_irqrestore(&bdev->list_lock, flags); } /* -- 2.7.4