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

ub: ubcore add advise and unadvise jfr api.



driver inclusion
category: feature
bugzilla: NA
CVE: NA

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

Ubcore add advise and unadvise jfr api.
Advise jfr: construct the transport channel for jfs and remote jfr.
Unadvise jfr: Tear down the transport channel from jfs to remote jfr.

Signed-off-by: default avatarGuoxin Qian <qianguoxin@huawei.com>
Signed-off-by: default avatarYizhen Fan <fanyizhen@huawei.com>
parent 99d491f3
Loading
Loading
Loading
Loading
+73 −0
Original line number Diff line number Diff line
@@ -651,6 +651,79 @@ int ubcore_unimport_jetty(struct ubcore_tjetty *tjetty)
}
EXPORT_SYMBOL(ubcore_unimport_jetty);

static int ubcore_advice_jfs_tjfr(struct ubcore_tp_advice *advice, struct ubcore_jfs *jfs,
				  struct ubcore_tjetty *tjfr)
{
	(void)memset(advice, 0, sizeof(struct ubcore_tp_advice));
	advice->meta.ht = ubcore_get_tptable(jfs->tptable);
	if (advice->meta.ht == NULL) {
		ubcore_log_err("tp table has already been destroyed");
		return -1;
	}

	advice->ta.type = UBCORE_TA_JFS_TJFR;
	advice->ta.jfs = jfs;
	advice->ta.tjetty_id = tjfr->cfg.id;

	ubcore_init_tp_key_jetty_id(&advice->meta.key, &tjfr->cfg.id);
	advice->meta.hash = ubcore_get_jetty_hash(&tjfr->cfg.id);
	return 0;
}

static inline void ubcore_put_advice(const struct ubcore_tp_advice *advice)
{
	ubcore_put_tptable(advice->meta.ht);
}

int ubcore_advise_jfr(struct ubcore_jfs *jfs, struct ubcore_tjetty *tjfr,
		      struct ubcore_udata *udata)
{
	struct ubcore_tp_advice advice;
	int ret;

	if (jfs == NULL || tjfr == NULL || !ubcore_have_tp_ops(jfs->ub_dev)) {
		ubcore_log_err("invalid parameter.\n");
		return -1;
	}
	if (!ubcore_jfs_tjfr_need_advise(jfs, tjfr)) {
		ubcore_log_err("The transport mode is not rm.\n");
		return -1;
	}

	ret = ubcore_advice_jfs_tjfr(&advice, jfs, tjfr);
	if (ret != 0)
		return ret;

	ret = ubcore_advise_tp(jfs->ub_dev, &tjfr->cfg.id.eid, &advice, udata);
	ubcore_put_advice(&advice);
	return ret;
}
EXPORT_SYMBOL(ubcore_advise_jfr);

int ubcore_unadvise_jfr(struct ubcore_jfs *jfs, struct ubcore_tjetty *tjfr)
{
	struct ubcore_tp_advice advice;
	int ret;

	if (jfs == NULL || tjfr == NULL || !ubcore_have_tp_ops(jfs->ub_dev)) {
		ubcore_log_err("invalid parameter.\n");
		return -1;
	}
	if (!ubcore_jfs_tjfr_need_advise(jfs, tjfr)) {
		ubcore_log_err("The transport mode is not rm.\n");
		return -1;
	}

	ret = ubcore_advice_jfs_tjfr(&advice, jfs, tjfr);
	if (ret != 0)
		return ret;

	ret = ubcore_unadvise_tp(jfs->ub_dev, &advice);
	ubcore_put_advice(&advice);
	return ret;
}
EXPORT_SYMBOL(ubcore_unadvise_jfr);

struct ubcore_jetty *ubcore_find_jetty(struct ubcore_device *dev, uint32_t jetty_id)
{
	return ubcore_hash_table_lookup(&dev->ht[UBCORE_HT_JETTY], jetty_id, &jetty_id);
+7 −0
Original line number Diff line number Diff line
@@ -53,4 +53,11 @@ static inline uint32_t ubcore_get_jetty_hash(const struct ubcore_jetty_id *jetty
	return jhash(jetty_id, sizeof(struct ubcore_jetty_id), 0);
}

static inline bool ubcore_jfs_tjfr_need_advise(const struct ubcore_jfs *jfs,
					       const struct ubcore_tjetty *tjfr)
{
	return jfs->ub_dev->transport_type == UBCORE_TRANSPORT_IB &&
	       jfs->jfs_cfg.trans_mode == UBCORE_TP_RM && tjfr->cfg.trans_mode == UBCORE_TP_RM;
}

#endif
+16 −0
Original line number Diff line number Diff line
@@ -327,6 +327,22 @@ struct ubcore_tjetty *ubcore_import_jetty(struct ubcore_device *dev,
 * @return: 0 on success, other value on error
 */
int ubcore_unimport_jetty(struct ubcore_tjetty *tjetty);
/**
 * Advise jfr: construct the transport channel for jfs and remote jfr.
 * @param[in] jfs: jfs to use to construct the transport channel;
 * @param[in] tjfr: target jfr to reach;
 * @param[in] udata (optional): ucontext and user space driver data
 * @return: 0 on success, other value on error
 */
int ubcore_advise_jfr(struct ubcore_jfs *jfs, struct ubcore_tjetty *tjfr,
		      struct ubcore_udata *udata);
/**
 * Unadvise jfr: Tear down the transport channel from jfs to remote jfr.
 * @param[in] jfs: jfs to use to destruct the transport channel;
 * @param[in] tjfr: target jfr advised before;
 * @return: 0 on success, other value on error
 */
int ubcore_unadvise_jfr(struct ubcore_jfs *jfs, struct ubcore_tjetty *tjfr);
/**
 * operation of user ioctl cmd.
 * @param[in] k_user_ctl: kdrv user control command pointer;