Skip to content

Commit ccd0291

Browse files
author
Yu Qiaowei
committed
video/rockchip: rga2: Fix the memory leak in rga2 driver.
1. Fix that when fd is used in A+B->C mode, the fd of pat is not release. 2. Modify that the pat import from the application is only copy to pat or src1. Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com> Change-Id: I360459ba85fdaad5536a3317b5f415298be87d6b
1 parent 31f7829 commit ccd0291

3 files changed

Lines changed: 26 additions & 8 deletions

File tree

drivers/video/rockchip/rga2/rga2.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,10 +693,12 @@ struct rga2_reg {
693693
struct sg_table *sg_src0;
694694
struct sg_table *sg_src1;
695695
struct sg_table *sg_dst;
696+
struct sg_table *sg_els;
696697

697698
struct dma_buf_attachment *attach_src0;
698699
struct dma_buf_attachment *attach_src1;
699700
struct dma_buf_attachment *attach_dst;
701+
struct dma_buf_attachment *attach_els;
700702
};
701703

702704
struct rga2_service_info {

drivers/video/rockchip/rga2/rga2_drv.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -873,9 +873,11 @@ static struct rga2_reg * rga2_reg_init(rga2_session *session, struct rga2_req *r
873873
reg->sg_src0 = req->sg_src0;
874874
reg->sg_dst = req->sg_dst;
875875
reg->sg_src1 = req->sg_src1;
876+
reg->sg_els = req->sg_els;
876877
reg->attach_src0 = req->attach_src0;
877878
reg->attach_dst = req->attach_dst;
878879
reg->attach_src1 = req->attach_src1;
880+
reg->attach_els = req->attach_els;
879881
#endif
880882

881883
mutex_lock(&rga2_service.lock);
@@ -1004,8 +1006,8 @@ static int rga2_put_dma_buf(struct rga2_req *req, struct rga2_reg *reg)
10041006
if (!req && !reg)
10051007
return -EINVAL;
10061008

1007-
attach = (!reg) ? req->attach_src0 : reg->attach_src0;
1008-
sgt = (!reg) ? req->sg_src0 : reg->sg_src0;
1009+
attach = reg ? reg->attach_src0 : req->attach_src0;
1010+
sgt = reg ? reg->sg_src0 : req->sg_src0;
10091011
if (attach && sgt)
10101012
dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
10111013
if (attach) {
@@ -1014,8 +1016,8 @@ static int rga2_put_dma_buf(struct rga2_req *req, struct rga2_reg *reg)
10141016
dma_buf_put(dma_buf);
10151017
}
10161018

1017-
attach = (!reg) ? req->attach_dst : reg->attach_dst;
1018-
sgt = (!reg) ? req->sg_dst : reg->sg_dst;
1019+
attach = reg ? reg->attach_dst : req->attach_dst;
1020+
sgt = reg ? reg->sg_dst : req->sg_dst;
10191021
if (attach && sgt)
10201022
dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
10211023
if (attach) {
@@ -1024,8 +1026,18 @@ static int rga2_put_dma_buf(struct rga2_req *req, struct rga2_reg *reg)
10241026
dma_buf_put(dma_buf);
10251027
}
10261028

1027-
attach = (!reg) ? req->attach_src1 : reg->attach_src1;
1028-
sgt = (!reg) ? req->sg_src1 : reg->sg_src1;
1029+
attach = reg ? reg->attach_src1 : req->attach_src1;
1030+
sgt = reg ? reg->sg_src1 : req->sg_src1;
1031+
if (attach && sgt)
1032+
dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
1033+
if (attach) {
1034+
dma_buf = attach->dmabuf;
1035+
dma_buf_detach(dma_buf, attach);
1036+
dma_buf_put(dma_buf);
1037+
}
1038+
1039+
attach = reg ? reg->attach_els : req->attach_els;
1040+
sgt = reg ? reg->sg_els : req->sg_els;
10291041
if (attach && sgt)
10301042
dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
10311043
if (attach) {

drivers/video/rockchip/rga2/rga2_reg_info.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,8 +1091,12 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
10911091

10921092
memcpy(&req->src, &req_rga->src, sizeof(req_rga->src));
10931093
memcpy(&req->dst, &req_rga->dst, sizeof(req_rga->dst));
1094-
memcpy(&req->pat, &req_rga->pat, sizeof(req_rga->pat));
1095-
memcpy(&req->src1,&req_rga->pat, sizeof(req_rga->pat));
1094+
/* The application will only import pat or src1. */
1095+
if (req->render_mode == update_palette_table_mode) {
1096+
memcpy(&req->pat, &req_rga->pat, sizeof(req_rga->pat));
1097+
} else {
1098+
memcpy(&req->src1, &req_rga->pat, sizeof(req_rga->pat));
1099+
}
10961100

10971101
format_name_convert(&req->src.format, req_rga->src.format);
10981102
format_name_convert(&req->dst.format, req_rga->dst.format);

0 commit comments

Comments
 (0)