Commit b9103ff6 authored by Yizhen Fan's avatar Yizhen Fan Committed by fanyizhen1995
Browse files

ub: uburma add cmd import/unimport segment implementation.



driver inclusion
category: feature
bugzilla: NA
CVE: NA

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

Uburma add implementations of handling import/unimport segment cmd from
user layer.

This will make kernel possible to handle urma_import_seg and
urma_unimport_seg api in user-layer urma.

Import_seg will finally call ubcore_import_seg. The created target segment
will be related to a uobj.
Unimport seg will delete the tseg-related uobj. In uobj destroy function,
it will call ubcore_unimport_seg.

Signed-off-by: default avatarGuoxin Qian <qianguoxin@huawei.com>
Signed-off-by: default avatarYizhen Fan <fanyizhen@huawei.com>
parent f69956f7
Loading
Loading
Loading
Loading
+76 −0
Original line number Diff line number Diff line
@@ -472,6 +472,80 @@ static int uburma_cmd_delete_jfs(struct ubcore_device *ubc_dev, struct uburma_fi
				   sizeof(struct uburma_cmd_delete_jfs));
}

static int uburma_cmd_import_seg(struct ubcore_device *ubc_dev, struct uburma_file *file,
				 struct uburma_cmd_hdr *hdr)
{
	struct uburma_cmd_import_seg arg;
	struct ubcore_target_seg_cfg cfg = { 0 };
	struct ubcore_udata udata;
	struct ubcore_target_seg *tseg;
	struct uburma_uobj *uobj;
	int ret;

	ret = uburma_copy_from_user(&arg, (void __user *)(uintptr_t)hdr->args_addr,
				    sizeof(struct uburma_cmd_import_seg));
	if (ret != 0)
		return ret;

	uobj = uobj_alloc(UOBJ_CLASS_TARGET_SEG, file);
	if (IS_ERR(uobj)) {
		uburma_log_err("UOBJ_CLASS_TARGET_JFR alloc fail!\n");
		return -ENOMEM;
	}

	(void)memcpy(cfg.seg.ubva.eid.raw, arg.in.eid, UBCORE_EID_SIZE);
	cfg.seg.ubva.uasid = arg.in.uasid;
	cfg.seg.ubva.va = arg.in.va;
	cfg.seg.len = arg.in.len;
	cfg.seg.attr.value = arg.in.flag;
	cfg.seg.key_id = arg.in.key_id;
	fill_udata(&udata, file->ucontext, &arg.udata);

	tseg = ubcore_import_seg(ubc_dev, &cfg, &udata);
	if (IS_ERR_OR_NULL(tseg)) {
		uburma_log_err("import seg failed.\n");
		uobj_alloc_abort(uobj);
		return -EPERM;
	}

	uobj->object = tseg;
	arg.out.handle = uobj->id;

	ret = uburma_copy_to_user((void __user *)(uintptr_t)hdr->args_addr, &arg,
				  sizeof(struct uburma_cmd_import_seg));
	if (ret != 0) {
		(void)ubcore_unimport_seg(tseg);
		uobj_alloc_abort(uobj);
		return ret;
	}
	uobj_alloc_commit(uobj);
	return ret;
}

static int uburma_cmd_unimport_seg(struct ubcore_device *ubc_dev, struct uburma_file *file,
				   struct uburma_cmd_hdr *hdr)
{
	struct uburma_cmd_unimport_seg arg;
	struct uburma_uobj *uobj;
	int ret;

	ret = uburma_copy_from_user(&arg, (void __user *)(uintptr_t)hdr->args_addr,
				    sizeof(struct uburma_cmd_unimport_seg));
	if (ret != 0)
		return ret;

	uobj = uobj_get_del(UOBJ_CLASS_TARGET_SEG, arg.in.handle, file);
	if (IS_ERR(uobj)) {
		uburma_log_err("failed to find imported target seg.\n");
		return -EINVAL;
	}
	ret = uobj_remove_commit(uobj);
	if (ret != 0)
		uburma_log_err("unimport seg failed.\n");

	return ret;
}

static int uburma_cmd_create_jfr(struct ubcore_device *ubc_dev, struct uburma_file *file,
				 struct uburma_cmd_hdr *hdr)
{
@@ -1393,6 +1467,8 @@ static uburma_cmd_handler g_uburma_cmd_handlers[] = {
	[UBURMA_CMD_FREE_KEY_ID] = uburma_cmd_free_key_id,
	[UBURMA_CMD_REGISTER_SEG] = uburma_cmd_register_seg,
	[UBURMA_CMD_UNREGISTER_SEG] = uburma_cmd_unregister_seg,
	[UBURMA_CMD_IMPORT_SEG] = uburma_cmd_import_seg,
	[UBURMA_CMD_UNIMPORT_SEG] = uburma_cmd_unimport_seg,
	[UBURMA_CMD_CREATE_JFR] = uburma_cmd_create_jfr,
	[UBURMA_CMD_MODIFY_JFR] = uburma_cmd_modify_jfr,
	[UBURMA_CMD_DELETE_JFR] = uburma_cmd_delete_jfr,
+25 −0
Original line number Diff line number Diff line
@@ -44,6 +44,8 @@ enum uburma_cmd {
	UBURMA_CMD_FREE_KEY_ID,
	UBURMA_CMD_REGISTER_SEG,
	UBURMA_CMD_UNREGISTER_SEG,
	UBURMA_CMD_IMPORT_SEG,
	UBURMA_CMD_UNIMPORT_SEG,
	UBURMA_CMD_CREATE_JFS,
	UBURMA_CMD_DELETE_JFS,
	UBURMA_CMD_CREATE_JFR,
@@ -122,6 +124,29 @@ struct uburma_cmd_unregister_seg {
	} in;
};

struct uburma_cmd_import_seg {
	struct {
		uint8_t eid[UBCORE_EID_SIZE];
		uint32_t uasid;
		uint64_t va;
		uint64_t len;
		uint32_t flag;
		uint32_t key;
		uint32_t key_id;
		uint64_t mva;
	} in;
	struct {
		uint64_t handle; /* handle of the allocated tseg obj in kernel */
	} out;
	struct uburma_cmd_udrv_priv udata;
};

struct uburma_cmd_unimport_seg {
	struct {
		uint64_t handle; /* handle of the seg to be unimported */
	} in;
};

struct uburma_cmd_create_jfr {
	struct {
		uint32_t depth; /* in terms of WQEBB */
+7 −1
Original line number Diff line number Diff line
@@ -135,7 +135,6 @@ static void uobj_remove_idr(struct uburma_uobj *uobj)
	spin_unlock(&uobj->ufile->idr_lock);
}


static int uobj_try_lock(struct uburma_uobj *uobj, bool exclusive)
{
	/*
@@ -580,6 +579,11 @@ static int uburma_free_tjetty(struct uburma_uobj *uobj, enum uburma_remove_reaso
	return ubcore_unimport_jetty((struct ubcore_tjetty *)uobj->object);
}

static int uburma_free_tseg(struct uburma_uobj *uobj, enum uburma_remove_reason why)
{
	return ubcore_unimport_seg((struct ubcore_target_seg *)uobj->object);
}

void uburma_close_uobj_fd(struct file *f)
{
	struct uburma_uobj *uobj = f->private_data;
@@ -691,3 +695,5 @@ declare_uobj_class(UOBJ_CLASS_TARGET_JFR,
		   &uobj_type_alloc_idr(sizeof(struct uburma_uobj), 0, uburma_free_tjfr));
declare_uobj_class(UOBJ_CLASS_TARGET_JETTY,
		   &uobj_type_alloc_idr(sizeof(struct uburma_uobj), 0, uburma_free_tjetty));
declare_uobj_class(UOBJ_CLASS_TARGET_SEG,
		   &uobj_type_alloc_idr(sizeof(struct uburma_uobj), 0, uburma_free_tseg));
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ enum UOBJ_CLASS_ID {
	UOBJ_CLASS_ROOT, /* used by framework */
	UOBJ_CLASS_KEY,
	UOBJ_CLASS_SEG,
	UOBJ_CLASS_TARGET_SEG,
	UOBJ_CLASS_JFR,
	UOBJ_CLASS_JFS,
	UOBJ_CLASS_JFC,
@@ -223,6 +224,7 @@ extern const struct uobj_class_def uobj_class_UOBJ_CLASS_JFR;
extern const struct uobj_class_def uobj_class_UOBJ_CLASS_JFS;
extern const struct uobj_class_def uobj_class_UOBJ_CLASS_JETTY;
extern const struct uobj_class_def uobj_class_UOBJ_CLASS_TARGET_JFR;
extern const struct uobj_class_def uobj_class_UOBJ_CLASS_TARGET_SEG;
extern const struct uobj_class_def uobj_class_UOBJ_CLASS_TARGET_JETTY;

extern const struct file_operations uburma_jfce_fops;