Commit 33e5598b authored by Jie Lei's avatar Jie Lei Committed by JangShui Yang
Browse files

hns3 udma: addressing stage adaptation

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


CVE: NA

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

The size of the required continuous memory block is
adapted based on the seg size.

Fixes: 5918be3e ("hns3 udma: feature of record doorbell")
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 15d3f726
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -19,18 +19,19 @@
#include "hns3_udma_device.h"
#include "hns3_udma_db.h"

int udma_db_map_user(struct udma_dev *udma_dev, uint64_t virt,
int udma_db_map_user(struct udma_ucontext *udma_ctx, uint64_t virt,
		     struct udma_db *db)
{
	struct udma_dev *udma_dev = to_udma_dev(udma_ctx->uctx.ub_dev);
	uint64_t page_addr = virt & PAGE_MASK;
	union ubcore_umem_flag access = {};
	struct udma_user_db_page *db_page;
	uint32_t offset;
	int ret = 0;

	mutex_lock(&udma_dev->pgdir_mutex);
	mutex_lock(&udma_ctx->pgdir_mutex);

	list_for_each_entry(db_page, &udma_dev->pgdir_list, list) {
	list_for_each_entry(db_page, &udma_ctx->pgdir_list, list) {
		if (db_page->user_virt == page_addr)
			goto found;
	}
@@ -53,7 +54,7 @@ int udma_db_map_user(struct udma_dev *udma_dev, uint64_t virt,
		goto out;
	}

	list_add(&db_page->list, &udma_dev->pgdir_list);
	list_add(&db_page->list, &udma_ctx->pgdir_list);

found:
	offset = virt - page_addr;
@@ -63,14 +64,14 @@ int udma_db_map_user(struct udma_dev *udma_dev, uint64_t virt,
	refcount_inc(&db_page->refcount);

out:
	mutex_unlock(&udma_dev->pgdir_mutex);
	mutex_unlock(&udma_ctx->pgdir_mutex);

	return ret;
}

void udma_db_unmap_user(struct udma_dev *udma_dev, struct udma_db *db)
void udma_db_unmap_user(struct udma_ucontext *udma_ctx, struct udma_db *db)
{
	mutex_lock(&udma_dev->pgdir_mutex);
	mutex_lock(&udma_ctx->pgdir_mutex);

	refcount_dec(&db->user_page->refcount);
	if (refcount_dec_if_one(&db->user_page->refcount)) {
@@ -79,5 +80,5 @@ void udma_db_unmap_user(struct udma_dev *udma_dev, struct udma_db *db)
		kfree(db->user_page);
	}

	mutex_unlock(&udma_dev->pgdir_mutex);
	mutex_unlock(&udma_ctx->pgdir_mutex);
}
+2 −2
Original line number Diff line number Diff line
@@ -18,9 +18,9 @@

#include "hns3_udma_device.h"

int udma_db_map_user(struct udma_dev *udma_dev, uint64_t virt,
int udma_db_map_user(struct udma_ucontext *udma_ctx, uint64_t virt,
		     struct udma_db *db);

void udma_db_unmap_user(struct udma_dev *udma_dev, struct udma_db *db);
void udma_db_unmap_user(struct udma_ucontext *udma_ctx, struct udma_db *db);

#endif /* _UDMA_DB_H */
+1 −1
Original line number Diff line number Diff line
@@ -604,7 +604,7 @@ int udma_register_udca(struct udma_dev *udma_dev,
	int ret;

	ret = copy_from_user(&ucmd, (void *)udrv_data->in_addr,
			     min(udrv_data->in_len, (uint32_t)sizeof(ucmd)));
			     min_t(uint32_t, udrv_data->in_len, (uint32_t)sizeof(ucmd)));
	if (ret) {
		dev_err(udma_dev->dev, "Failed to copy udata, ret = %d.\n",
			ret);
+3 −2
Original line number Diff line number Diff line
@@ -441,6 +441,8 @@ struct udma_ucontext {
	struct udma_dca_ctx		dca_ctx;
	void				*dca_dbgfs;
	uint32_t			eid_index;
	struct list_head		pgdir_list;
	struct mutex			pgdir_mutex;
};

struct udma_cmd_context {
@@ -822,8 +824,6 @@ struct udma_dev {
	uint64_t			reset_cnt;
	struct udma_netdev		uboe;

	struct list_head		pgdir_list;
	struct mutex			pgdir_mutex;
	uint8_t __iomem			*reg_base;
	struct udma_caps		caps;

@@ -844,6 +844,7 @@ struct udma_dev {
	uint16_t			func_id;
	uint32_t			func_num;
	uint32_t			cong_algo_tmpl_id;

	struct udma_ida			uar_ida;
	struct udma_jfs_table		jfs_table;
	struct udma_jfr_table		jfr_table;
+1 −1
Original line number Diff line number Diff line
@@ -2001,7 +2001,7 @@ int udma_mtr_find(struct udma_dev *udma_device, struct udma_mtr *mtr,
		if (!mtts || !mtt_count)
			goto out;

		npage = min(mtt_count, left);
		npage = min_t(int, mtt_count, left);
		left -= npage;
		for (mtt_count = 0; (uint32_t)mtt_count < npage; mtt_count++)
			mtt_buf[total++] = le64_to_cpu(mtts[mtt_count]);
Loading