summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPraneeth Paladugu <ppaladug@codeaurora.org>2016-05-12 11:20:01 -0700
committerKyle Yan <kyan@codeaurora.org>2016-06-29 11:00:34 -0700
commit716216089b95b68b5a3a048359109d82651f4b38 (patch)
tree0f5107804d5261375beae70ca6117f5f06215397
parent4ff0e8648b5212189bc82d35c6c55f691c003eb7 (diff)
msm: vidc: Destroy mutexes used by vidc driver
Currently vidc driver is not destroying the mutexes that it used. This can cause mutex resources leak. This changes fixes the same. Change-Id: I293ad3c4c5ed46c692ae066e7188efe41e5dc482 Signed-off-by: Praneeth Paladugu <ppaladug@codeaurora.org>
-rw-r--r--drivers/media/platform/msm/vidc/msm_v4l2_vidc.c2
-rw-r--r--drivers/media/platform/msm/vidc/msm_vidc.c24
-rw-r--r--drivers/media/platform/msm/vidc/msm_vidc_internal.h5
-rw-r--r--drivers/media/platform/msm/vidc/venus_hfi.c1
4 files changed, 32 insertions, 0 deletions
diff --git a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
index 9d82d590174d..0d6a0caa86c8 100644
--- a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
@@ -682,6 +682,7 @@ static int msm_vidc_remove(struct platform_device *pdev)
msm_vidc_free_platform_resources(&core->resources);
sysfs_remove_group(&pdev->dev.kobj, &msm_vidc_core_attr_group);
dev_set_drvdata(&pdev->dev, NULL);
+ mutex_destroy(&core->lock);
kfree(core);
return rc;
}
@@ -773,6 +774,7 @@ static void __exit msm_vidc_exit(void)
{
platform_driver_unregister(&msm_vidc_driver);
debugfs_remove_recursive(vidc_driver->debugfs_root);
+ mutex_destroy(&vidc_driver->lock);
kfree(vidc_driver);
vidc_driver = NULL;
}
diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c
index 8224cbc0bb00..51be8df7ff35 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc.c
@@ -1254,6 +1254,18 @@ fail_bufq_capture:
msm_comm_ctrl_deinit(inst);
msm_smem_delete_client(inst->mem_client);
fail_mem_client:
+ mutex_destroy(&inst->sync_lock);
+ mutex_destroy(&inst->bufq[CAPTURE_PORT].lock);
+ mutex_destroy(&inst->bufq[OUTPUT_PORT].lock);
+ mutex_destroy(&inst->lock);
+
+ DEINIT_MSM_VIDC_LIST(&inst->pendingq);
+ DEINIT_MSM_VIDC_LIST(&inst->scratchbufs);
+ DEINIT_MSM_VIDC_LIST(&inst->persistbufs);
+ DEINIT_MSM_VIDC_LIST(&inst->pending_getpropq);
+ DEINIT_MSM_VIDC_LIST(&inst->outputbufs);
+ DEINIT_MSM_VIDC_LIST(&inst->registeredbufs);
+
kfree(inst);
inst = NULL;
err_invalid_core:
@@ -1317,6 +1329,18 @@ int msm_vidc_destroy(struct msm_vidc_inst *inst)
msm_comm_ctrl_deinit(inst);
+ mutex_destroy(&inst->sync_lock);
+ mutex_destroy(&inst->bufq[CAPTURE_PORT].lock);
+ mutex_destroy(&inst->bufq[OUTPUT_PORT].lock);
+ mutex_destroy(&inst->lock);
+
+ DEINIT_MSM_VIDC_LIST(&inst->pendingq);
+ DEINIT_MSM_VIDC_LIST(&inst->scratchbufs);
+ DEINIT_MSM_VIDC_LIST(&inst->persistbufs);
+ DEINIT_MSM_VIDC_LIST(&inst->pending_getpropq);
+ DEINIT_MSM_VIDC_LIST(&inst->outputbufs);
+ DEINIT_MSM_VIDC_LIST(&inst->registeredbufs);
+
v4l2_fh_del(&inst->event_handler);
v4l2_fh_exit(&inst->event_handler);
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_internal.h b/drivers/media/platform/msm/vidc/msm_vidc_internal.h
index 428b6eda8da7..c127a17b6157 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_internal.h
+++ b/drivers/media/platform/msm/vidc/msm_vidc_internal.h
@@ -120,6 +120,11 @@ static inline void INIT_MSM_VIDC_LIST(struct msm_vidc_list *mlist)
INIT_LIST_HEAD(&mlist->list);
}
+static inline void DEINIT_MSM_VIDC_LIST(struct msm_vidc_list *mlist)
+{
+ mutex_destroy(&mlist->lock);
+}
+
enum buffer_owner {
DRIVER,
FIRMWARE,
diff --git a/drivers/media/platform/msm/vidc/venus_hfi.c b/drivers/media/platform/msm/vidc/venus_hfi.c
index ee4e7aef2fa3..fada1490dcfe 100644
--- a/drivers/media/platform/msm/vidc/venus_hfi.c
+++ b/drivers/media/platform/msm/vidc/venus_hfi.c
@@ -4556,6 +4556,7 @@ void venus_hfi_delete_device(void *device)
if (close->hal_data->irq == dev->hal_data->irq) {
hal_ctxt.dev_count--;
list_del(&close->list);
+ mutex_destroy(&close->lock);
destroy_workqueue(close->vidc_workq);
destroy_workqueue(close->venus_pm_workq);
free_irq(dev->hal_data->irq, close);