author | Rico Yang <wei.yang@amlogic.com> | 2020-08-31 03:31:51 (GMT) |
---|---|---|
committer | Tellen Yu <tellen.yu@amlogic.com> | 2020-08-31 12:22:48 (GMT) |
commit | 7ffa5fea516d59be571233349d59376d37194a19 (patch) | |
tree | a2e69b8ca7008eda6df42520bd5637ef2ca92f4b | |
parent | d80673057d47efe8c16f0de5f5c62e0a7dabfe75 (diff) | |
download | media_modules-7ffa5fea516d59be571233349d59376d37194a19.zip media_modules-7ffa5fea516d59be571233349d59376d37194a19.tar.gz media_modules-7ffa5fea516d59be571233349d59376d37194a19.tar.bz2 |
media_module:h265 encoder: protect driver from multiple release [2/2]
PD#SWPL-29483
Problem:
hevc driver cannot be opened after closing driver for multiple times
Solution:
add protection against multiple closing
Verify:
verified on askey deadpool s905y2
Change-Id: Ie223da97a87afddc97c3668f5052967d42039123
-rw-r--r-- | drivers/frame_sink/encoder/h265/vpu.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/drivers/frame_sink/encoder/h265/vpu.c b/drivers/frame_sink/encoder/h265/vpu.c index 70598b3..c741b39 100644 --- a/drivers/frame_sink/encoder/h265/vpu.c +++ b/drivers/frame_sink/encoder/h265/vpu.c @@ -88,6 +88,7 @@ } while (0) static s32 print_level = LOG_DEBUG; +static s32 force_release = 0; static s32 clock_level = 4; static s32 wave_clocka; @@ -419,13 +420,17 @@ static s32 vpu_open(struct inode *inode, struct file *filp) bool alloc_buffer = false; s32 r = 0; - enc_pr(LOG_DEBUG, "[+] %s\n", __func__); + enc_pr(LOG_DEBUG, "[+] %s, open_count=%d\n", __func__, + s_vpu_drv_context.open_count); + enc_pr(LOG_DEBUG, "vpu_open, calling process: %d:%s\n", current->pid, current->comm); spin_lock(&s_vpu_lock); s_vpu_drv_context.open_count++; if (s_vpu_drv_context.open_count == 1) { alloc_buffer = true; } else { r = -EBUSY; + enc_pr(LOG_DEBUG, "vpu_open, device is busy, s_vpu_drv_context.open_count=%d\n", + s_vpu_drv_context.open_count); s_vpu_drv_context.open_count--; spin_unlock(&s_vpu_lock); goto Err; @@ -563,8 +568,11 @@ static s32 vpu_open(struct inode *inode, struct file *filp) dma_cfg[1].fd = -1; dma_cfg[2].fd = -1; Err: - if (r != 0) + if (r != 0) { + enc_pr(LOG_DEBUG, "vpu_open, error handling, r=%d, s_vpu_drv_context.open_count\n", + r, s_vpu_drv_context.open_count); s_vpu_drv_context.open_count--; + } enc_pr(LOG_DEBUG, "[-] %s, ret: %d\n", __func__, r); return r; } @@ -1507,14 +1515,27 @@ static s32 vpu_release(struct inode *inode, struct file *filp) s32 ret = 0; ulong flags; - enc_pr(LOG_DEBUG, "vpu_release\n"); + enc_pr(LOG_DEBUG, "vpu_release, calling process: %d:%s\n", current->pid, current->comm); ret = down_interruptible(&s_vpu_sem); + enc_pr(LOG_DEBUG, "vpu_release, ret = %d\n", ret); + + if (s_vpu_drv_context.open_count <= 0) { + enc_pr(LOG_DEBUG, "vpu_release, open_count=%d, already released or even not inited\n", + s_vpu_drv_context.open_count); + s_vpu_drv_context.open_count = 0; + goto exit_release; + } + if (ret == 0) { vpu_free_buffers(filp); vpu_free_instances(filp); + + enc_pr(LOG_DEBUG, "vpu_release, decrease open_count from %d\n", + s_vpu_drv_context.open_count); + s_vpu_drv_context.open_count--; if (s_vpu_drv_context.open_count == 0) { - enc_pr(LOG_INFO, + enc_pr(LOG_DEBUG, "vpu_release: s_interrupt_flag(%d), reason(0x%08lx)\n", s_interrupt_flag, s_vpu_drv_context.interrupt_reason); s_vpu_drv_context.interrupt_reason = 0; @@ -1581,6 +1602,7 @@ static s32 vpu_release(struct inode *inode, struct file *filp) amports_switch_gate("vdec", 0); } } +exit_release: up(&s_vpu_sem); return 0; } @@ -2458,6 +2480,9 @@ static s32 __init hevc_mem_setup(struct reserved_mem *rmem) module_param(print_level, uint, 0664); MODULE_PARM_DESC(print_level, "\n print_level\n"); +module_param(force_release, uint, 0664); +MODULE_PARM_DESC(force_release, "\n print_level\n"); + module_param(clock_level, uint, 0664); MODULE_PARM_DESC(clock_level, "\n clock_level\n"); |