Commit 7116ad82 authored by Jie Lei's avatar Jie Lei Committed by JangShui Yang
Browse files

hns3 udma: resolve the problem when resources are reclaimed.

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8V1IQ


CVE: NA

--------------------------------------------------------

This patch adapt to fix the bug that occurs when the applied
resources are rolled back when the JFC fails to be created.

Fixes: 33e5598b ("hns3 udma: addressing stage adaptation")
Signed-off-by: default avatarYe Zhang <zhangye94@huawei.com>
Signed-off-by: default avatarJie Lei <leijie31@huawei.com>
Signed-off-by: default avatarWeibo Zhao <zhaoweibo3@huawei.com>
parent 77bbbfe8
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -1181,11 +1181,6 @@ int udma_dca_attach(struct udma_dev *dev, struct udma_dca_attach_attr *attr,
	resp->dcan = cfg->dcan;
	update_dca_buf_status(ctx, cfg->dcan, true);

	if (refcount_dec_and_test(&qp->refcount))
		complete(&qp->free);

	return ret;

refcount_dec:
	if (refcount_dec_and_test(&qp->refcount))
		complete(&qp->free);
+2 −3
Original line number Diff line number Diff line
@@ -238,6 +238,7 @@ static int alloc_jfc_buf(struct udma_dev *udma_dev, struct udma_jfc *udma_jfc,

	refcount_set(&udma_jfc->refcount, 1);
	init_completion(&udma_jfc->free);
	udma_jfc->udma_uctx = udma_uctx;
	return ret;

err_copy:
@@ -501,15 +502,13 @@ static void free_jfc_cqc(struct udma_dev *udma_dev, struct udma_jfc *udma_jfc)

static void free_jfc_buf(struct udma_dev *udma_dev, struct udma_jfc *udma_jfc)
{
	struct udma_ucontext *udma_uctx = to_udma_ucontext(udma_jfc->ubcore_jfc.uctx);

	/* wait for all interrupt processed */
	if (refcount_dec_and_test(&udma_jfc->refcount))
		complete(&udma_jfc->free);
	wait_for_completion(&udma_jfc->free);

	if (udma_dev->caps.flags & UDMA_CAP_FLAG_CQ_RECORD_DB)
		udma_db_unmap_user(udma_uctx, &udma_jfc->db);
		udma_db_unmap_user(udma_jfc->udma_uctx, &udma_jfc->db);
	udma_mtr_destroy(udma_dev, &udma_jfc->mtr);
}

+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ struct udma_jfc {
	struct completion	free;
	struct list_head	sq_list;
	struct list_head	rq_list;
	struct udma_ucontext	*udma_uctx;
	struct hns3_udma_jfc_attr_ex	jfc_attr_ex;
};

+2 −3
Original line number Diff line number Diff line
@@ -226,6 +226,7 @@ static int alloc_jfr_buf(struct udma_dev *dev, struct udma_jfr *jfr,

	refcount_set(&jfr->refcount, 1);
	init_completion(&jfr->free);
	jfr->udma_uctx = udma_uctx;
	return 0;

err_db:
@@ -527,8 +528,6 @@ static void free_jfrc(struct udma_dev *dev, struct udma_jfr *jfr)

static void free_jfr_buf(struct udma_dev *dev, struct udma_jfr *jfr)
{
	struct udma_ucontext *udma_uctx = to_udma_ucontext(jfr->ubcore_jfr.uctx);

	if (refcount_dec_and_test(&jfr->refcount))
		complete(&jfr->free);

@@ -536,7 +535,7 @@ static void free_jfr_buf(struct udma_dev *dev, struct udma_jfr *jfr)

	if (dev->caps.flags & UDMA_CAP_FLAG_SRQ_RECORD_DB ||
	    jfr->jfr_caps & HNS3_UDMA_JFR_CAP_RECORD_DB)
		udma_db_unmap_user(udma_uctx, &jfr->db);
		udma_db_unmap_user(jfr->udma_uctx, &jfr->db);

	free_jfr_wqe_buf(dev, jfr);
	free_jfr_idx(dev, jfr);
+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ struct udma_jfr {
	uint32_t		qpn;
	enum ubcore_transport_mode tp_mode;
	bool			share_jfr;
	struct udma_ucontext	*udma_uctx;
};

struct udma_jfr_context {