Skip to content

Commit eb8fe01

Browse files
Putin Leerkhuangtao
authored andcommitted
video/rockchip: rga: Fixup some situation will cause memory leak
Change-Id: I2ec424e09149c5b4c1d6a2f141e0359e197abe35 Signed-off-by: Putin Lee <putin.li@rock-chips.com>
1 parent 50713be commit eb8fe01

1 file changed

Lines changed: 26 additions & 165 deletions

File tree

drivers/video/rockchip/rga/rga_drv.c

Lines changed: 26 additions & 165 deletions
Original file line numberDiff line numberDiff line change
@@ -520,85 +520,6 @@ static struct rga_reg * rga_reg_init(rga_session *session, struct rga_req *req)
520520
return reg;
521521
}
522522

523-
static struct rga_reg * rga_reg_init_2(rga_session *session, struct rga_req *req0, struct rga_req *req1)
524-
{
525-
int32_t ret;
526-
527-
struct rga_reg *reg0, *reg1;
528-
529-
reg0 = NULL;
530-
reg1 = NULL;
531-
532-
do
533-
{
534-
reg0 = kzalloc(sizeof(struct rga_reg), GFP_KERNEL);
535-
if (NULL == reg0) {
536-
pr_err("%s [%d] kmalloc fail in rga_reg_init\n", __FUNCTION__, __LINE__);
537-
break;
538-
}
539-
540-
reg1 = kzalloc(sizeof(struct rga_reg), GFP_KERNEL);
541-
if (NULL == reg1) {
542-
pr_err("%s [%d] kmalloc fail in rga_reg_init\n", __FUNCTION__, __LINE__);
543-
break;
544-
}
545-
546-
reg0->session = session;
547-
INIT_LIST_HEAD(&reg0->session_link);
548-
INIT_LIST_HEAD(&reg0->status_link);
549-
550-
reg1->session = session;
551-
INIT_LIST_HEAD(&reg1->session_link);
552-
INIT_LIST_HEAD(&reg1->status_link);
553-
554-
req0->mmu_info.mmu_flag &= (~(1 << 10));
555-
556-
if(req0->mmu_info.mmu_en)
557-
{
558-
ret = rga_set_mmu_info(reg0, req0);
559-
if(ret < 0) {
560-
printk("%s, [%d] set mmu info error \n", __FUNCTION__, __LINE__);
561-
break;
562-
}
563-
}
564-
565-
RGA_gen_reg_info(req0, (uint8_t *)reg0->cmd_reg);
566-
567-
req1->mmu_info.mmu_flag &= (~(1 << 8));
568-
569-
if(req1->mmu_info.mmu_en)
570-
{
571-
ret = rga_set_mmu_info(reg1, req1);
572-
if(ret < 0) {
573-
printk("%s, [%d] set mmu info error \n", __FUNCTION__, __LINE__);
574-
break;
575-
}
576-
}
577-
578-
RGA_gen_reg_info(req1, (uint8_t *)reg1->cmd_reg);
579-
580-
mutex_lock(&rga_service.lock);
581-
list_add_tail(&reg0->status_link, &rga_service.waiting);
582-
list_add_tail(&reg0->session_link, &session->waiting);
583-
list_add_tail(&reg1->status_link, &rga_service.waiting);
584-
list_add_tail(&reg1->session_link, &session->waiting);
585-
mutex_unlock(&rga_service.lock);
586-
587-
return reg1;
588-
}
589-
while(0);
590-
591-
if(reg0 != NULL) {
592-
kfree(reg0);
593-
}
594-
595-
if(reg1 != NULL) {
596-
kfree(reg1);
597-
}
598-
599-
return NULL;
600-
}
601-
602523
/* Caller must hold rga_service.lock */
603524
static void rga_reg_deinit(struct rga_reg *reg)
604525
{
@@ -824,42 +745,6 @@ static void rga_del_running_list_timeout(void)
824745
}
825746
}
826747

827-
828-
static void rga_mem_addr_sel(struct rga_req *req)
829-
{
830-
switch(req->src.format)
831-
{
832-
case RK_FORMAT_YCbCr_422_SP:
833-
break;
834-
case RK_FORMAT_YCbCr_422_P :
835-
break;
836-
case RK_FORMAT_YCbCr_420_SP :
837-
if((req->src.yrgb_addr > 0xc0000000) && (req->src.uv_addr > 0xc0000000)
838-
&& (req->dst.yrgb_addr > 0xc0000000))
839-
{
840-
req->src.yrgb_addr = req->src.yrgb_addr - 0x60000000;
841-
req->src.uv_addr = req->src.uv_addr - 0x60000000;
842-
req->dst.yrgb_addr = req->dst.yrgb_addr - 0x60000000;
843-
req->mmu_info.mmu_en = 0;
844-
req->mmu_info.mmu_flag &= 0xfffe;
845-
}
846-
break;
847-
case RK_FORMAT_YCbCr_420_P :
848-
break;
849-
case RK_FORMAT_YCrCb_422_SP :
850-
break;
851-
case RK_FORMAT_YCrCb_422_P :
852-
break;
853-
case RK_FORMAT_YCrCb_420_SP :
854-
break;
855-
case RK_FORMAT_YCrCb_420_P :
856-
break;
857-
default :
858-
break;
859-
}
860-
861-
}
862-
863748
/*
864749
static int rga_convert_dma_buf(struct rga_req *req)
865750
{
@@ -1052,14 +937,13 @@ static int rga_blit(rga_session *session, struct rga_req *req)
1052937
int ret = -1;
1053938
int num = 0;
1054939
struct rga_reg *reg;
1055-
struct rga_req req2;
1056940

1057-
uint32_t saw, sah, daw, dah;
941+
uint32_t saw, sah, daw, dah;
1058942

1059-
saw = req->src.act_w;
1060-
sah = req->src.act_h;
1061-
daw = req->dst.act_w;
1062-
dah = req->dst.act_h;
943+
saw = req->src.act_w;
944+
sah = req->src.act_h;
945+
daw = req->dst.act_w;
946+
dah = req->dst.act_h;
1063947

1064948
#if RGA_TEST
1065949
print_info(req);
@@ -1070,67 +954,44 @@ static int rga_blit(rga_session *session, struct rga_req *req)
1070954
}
1071955
req->render_mode &= (~RGA_BUF_GEM_TYPE_MASK);
1072956
do {
1073-
if((req->render_mode == bitblt_mode) && (((saw>>1) >= daw) || ((sah>>1) >= dah))) {
1074-
/* generate 2 cmd for pre scale */
1075-
1076-
ret = rga_check_param(req);
1077-
if(ret == -EINVAL) {
1078-
printk("req 0 argument is inval\n");
1079-
break;
1080-
}
1081-
1082-
ret = RGA_gen_two_pro(req, &req2);
1083-
if(ret == -EINVAL) {
1084-
break;
1085-
}
1086-
1087-
ret = rga_check_param(req);
1088-
if(ret == -EINVAL) {
1089-
printk("req 1 argument is inval\n");
1090-
break;
1091-
}
957+
if (((saw >> 1) >= daw) || ((sah >> 1) >= dah)) {
958+
pr_err("unsupported to scaling less than 1/2 \n");
959+
goto err_put_dma_buf;
960+
}
1092961

1093-
ret = rga_check_param(&req2);
1094-
if(ret == -EINVAL) {
1095-
printk("req 2 argument is inval\n");
1096-
break;
1097-
}
962+
if (((daw >> 3) >= saw) || ((dah >> 3) >= daw)) {
963+
pr_err("unsupported to scaling more than 8 \n");
964+
goto err_put_dma_buf;
965+
}
1098966

1099-
reg = rga_reg_init_2(session, req, &req2);
1100-
if(reg == NULL) {
1101-
break;
1102-
}
1103-
num = 2;
1104967

1105-
}
1106-
else {
1107968
/* check value if legal */
1108969
ret = rga_check_param(req);
1109970
if(ret == -EINVAL) {
1110971
printk("req argument is inval\n");
1111-
break;
972+
goto err_put_dma_buf;
1112973
}
1113974

1114-
if(req->render_mode == bitblt_mode)
1115-
rga_mem_addr_sel(req);
1116-
1117975
reg = rga_reg_init(session, req);
1118976
if(reg == NULL) {
1119-
pr_err("init reg fail\n");
1120-
break;
977+
pr_err("init reg fail\n");
978+
goto err_put_dma_buf;
1121979
}
980+
1122981
num = 1;
1123-
}
1124982

1125-
mutex_lock(&rga_service.lock);
1126-
atomic_add(num, &rga_service.total_running);
1127-
rga_try_set_reg();
1128-
mutex_unlock(&rga_service.lock);
983+
mutex_lock(&rga_service.lock);
984+
atomic_add(num, &rga_service.total_running);
985+
rga_try_set_reg();
986+
mutex_unlock(&rga_service.lock);
1129987

1130-
return 0;
1131-
}
988+
return 0;
989+
}
1132990
while(0);
1133991

992+
err_put_dma_buf:
993+
rga_put_dma_buf(req, NULL);
994+
1134995
return -EFAULT;
1135996
}
1136997

0 commit comments

Comments
 (0)