diff options
| author | Praneeth Paladugu <ppaladug@codeaurora.org> | 2016-05-12 11:20:01 -0700 |
|---|---|---|
| committer | Kyle Yan <kyan@codeaurora.org> | 2016-06-29 11:00:34 -0700 |
| commit | 716216089b95b68b5a3a048359109d82651f4b38 (patch) | |
| tree | 0f5107804d5261375beae70ca6117f5f06215397 | |
| parent | 4ff0e8648b5212189bc82d35c6c55f691c003eb7 (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.c | 2 | ||||
| -rw-r--r-- | drivers/media/platform/msm/vidc/msm_vidc.c | 24 | ||||
| -rw-r--r-- | drivers/media/platform/msm/vidc/msm_vidc_internal.h | 5 | ||||
| -rw-r--r-- | drivers/media/platform/msm/vidc/venus_hfi.c | 1 |
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); |
