libwd/0007-uadk-hisi_comp-free-sgl-when-send-request-error.patch
2023-09-28 09:15:32 +08:00

115 lines
3.3 KiB
Diff

From b8c2f96b0bbf8411bf44a9fd4eb7b5c0184bd116 Mon Sep 17 00:00:00 2001
From: Yang Shen <shenyang39@huawei.com>
Date: Fri, 7 Jul 2023 16:19:30 +0800
Subject: [PATCH 07/26] uadk/hisi_comp - free sgl when send request error
Free hardware sgl in error branch to avoid memory leakage.
Signed-off-by: Yang Shen <shenyang39@huawei.com>
---
drv/hisi_comp.c | 60 +++++++++++++++++++++++++------------------------
1 file changed, 31 insertions(+), 29 deletions(-)
diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c
index b6f4d19..e17197d 100644
--- a/drv/hisi_comp.c
+++ b/drv/hisi_comp.c
@@ -843,6 +843,10 @@ static int fill_zip_comp_sqe(struct hisi_qp *qp, struct wd_comp_msg *msg,
return -WD_EINVAL;
}
+ ret = ops[alg_type].fill_comp_level(sqe, msg->comp_lv);
+ if (unlikely(ret))
+ return ret;
+
ret = ops[alg_type].fill_buf[msg->req.data_fmt]((handle_t)qp, sqe, msg);
if (unlikely(ret))
return ret;
@@ -853,10 +857,6 @@ static int fill_zip_comp_sqe(struct hisi_qp *qp, struct wd_comp_msg *msg,
ops[alg_type].fill_tag(sqe, msg->tag);
- ret = ops[alg_type].fill_comp_level(sqe, msg->comp_lv);
- if (unlikely(ret))
- return ret;
-
state = (msg->stream_mode == WD_COMP_STATEFUL) ? HZ_STATEFUL :
HZ_STATELESS;
stream_pos = (msg->stream_pos == WD_COMP_STREAM_NEW) ? HZ_STREAM_NEW :
@@ -878,6 +878,31 @@ static int fill_zip_comp_sqe(struct hisi_qp *qp, struct wd_comp_msg *msg,
return 0;
}
+static void free_hw_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe,
+ enum wd_comp_alg_type alg_type)
+{
+ void *hw_sgl_in, *hw_sgl_out;
+ handle_t h_sgl_pool;
+
+ h_sgl_pool = hisi_qm_get_sglpool(h_qp);
+ if (unlikely(!h_sgl_pool)) {
+ WD_ERR("failed to get sglpool to free hw sgl!\n");
+ return;
+ }
+
+ hw_sgl_in = VA_ADDR(sqe->source_addr_h, sqe->source_addr_l);
+ hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_in);
+
+ hw_sgl_out = VA_ADDR(sqe->dest_addr_h, sqe->dest_addr_l);
+ hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_out);
+
+ if (alg_type == WD_LZ77_ZSTD) {
+ hw_sgl_out = VA_ADDR(sqe->literals_addr_h,
+ sqe->literals_addr_l);
+ hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_out);
+ }
+}
+
static int hisi_zip_comp_send(handle_t ctx, void *comp_msg)
{
struct hisi_qp *qp = wd_ctx_get_priv(ctx);
@@ -895,6 +920,8 @@ static int hisi_zip_comp_send(handle_t ctx, void *comp_msg)
}
ret = hisi_qm_send(h_qp, &sqe, 1, &count);
if (unlikely(ret < 0)) {
+ if (msg->req.data_fmt == WD_SGL_BUF)
+ free_hw_sgl(h_qp, &sqe, msg->alg_type);
if (ret != -WD_EBUSY)
WD_ERR("failed to send to hardware, ret = %d!\n", ret);
@@ -929,31 +956,6 @@ static int get_alg_type(__u32 type)
return alg_type;
}
-static void free_hw_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe,
- enum wd_comp_alg_type alg_type)
-{
- void *hw_sgl_in, *hw_sgl_out;
- handle_t h_sgl_pool;
-
- h_sgl_pool = hisi_qm_get_sglpool(h_qp);
- if (unlikely(!h_sgl_pool)) {
- WD_ERR("failed to get sglpool to free hw sgl!\n");
- return;
- }
-
- hw_sgl_in = VA_ADDR(sqe->source_addr_h, sqe->source_addr_l);
- hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_in);
-
- hw_sgl_out = VA_ADDR(sqe->dest_addr_h, sqe->dest_addr_l);
- hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_out);
-
- if (alg_type == WD_LZ77_ZSTD) {
- hw_sgl_out = VA_ADDR(sqe->literals_addr_h,
- sqe->literals_addr_l);
- hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_out);
- }
-}
-
static void get_ctx_buf(struct hisi_zip_sqe *sqe,
struct wd_comp_msg *recv_msg)
{
--
2.25.1