summaryrefslogtreecommitdiff
authorRico 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)
commit7ffa5fea516d59be571233349d59376d37194a19 (patch)
treea2e69b8ca7008eda6df42520bd5637ef2ca92f4b
parentd80673057d47efe8c16f0de5f5c62e0a7dabfe75 (diff)
downloadmedia_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
Diffstat
-rw-r--r--drivers/frame_sink/encoder/h265/vpu.c33
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");