Commit 86431df1 authored by Jun Zeng's avatar Jun Zeng Committed by Tomasz Zawadzki
Browse files

lib/env_dpdk: Add support for vfio-vf-token parameter



The kernel vfio_pci driver module introduced vf_token checking
mechanism since kernel version 5.7, and has been supported by
DPDK. So add support for it to deal with the scenario of VF.

Signed-off-by: default avatarJun Zeng <jun1.zeng@intel.com>
Change-Id: Ie9700fa395327da4e847c6213167284c148a64e3
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14424


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent dda78a88
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ struct spdk_env_opts {

	/** Opaque context for use of the env implementation. */
	void			*env_context;
	const char		*vf_token;
};

/**
+7 −1
Original line number Diff line number Diff line
@@ -157,8 +157,14 @@ struct spdk_app_opts {
	 *  If non-NULL, a string array of allowed RPC methods.
	 */
	const char **rpc_allowlist;

	/**
	 * Used to pass vf_token to vfio_pci driver through DPDK.
	 * The vf_token is an UUID that shared between SR-IOV PF and VF.
	 */
	const char		*vf_token;
} __attribute__((packed));
SPDK_STATIC_ASSERT(sizeof(struct spdk_app_opts) == 208, "Incorrect size");
SPDK_STATIC_ASSERT(sizeof(struct spdk_app_opts) == 216, "Incorrect size");

/**
 * Initialize the default value of opts
+1 −1
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

SO_VER := 10
SO_VER := 11
SO_MINOR := 0

CFLAGS += $(ENV_CFLAGS)
+9 −0
Original line number Diff line number Diff line
@@ -459,6 +459,15 @@ build_eal_cmdline(const struct spdk_env_opts *opts)
			return -1;
		}
	}

	/* --vfio-vf-token used for VF initialized by vfio_pci driver. */
	if (opts->vf_token) {
		args = push_arg(args, &argcount, _sprintf_alloc("--vfio-vf-token=%s",
				opts->vf_token));
		if (args == NULL) {
			return -1;
		}
	}
#endif

	g_eal_cmdline = args;
+10 −2
Original line number Diff line number Diff line
@@ -125,7 +125,9 @@ static const struct option g_cmdline_options[] = {
#define DISABLE_CPUMASK_LOCKS_OPT_IDX	267
	{"disable-cpumask-locks",	no_argument,		NULL, DISABLE_CPUMASK_LOCKS_OPT_IDX},
#define RPCS_ALLOWED_OPT_IDX	268
	{"rpcs-allowed",		required_argument,	NULL, RPCS_ALLOWED_OPT_IDX}
	{"rpcs-allowed",		required_argument,	NULL, RPCS_ALLOWED_OPT_IDX},
#define ENV_VF_TOKEN_OPT_IDX 269
	{"vfio-vf-token",		required_argument,	NULL, ENV_VF_TOKEN_OPT_IDX},
};

static void
@@ -337,6 +339,7 @@ app_setup_env(struct spdk_app_opts *opts)
	env_opts.base_virtaddr = opts->base_virtaddr;
	env_opts.env_context = opts->env_context;
	env_opts.iova_mode = opts->iova_mode;
	env_opts.vf_token = opts->vf_token;

	rc = spdk_env_init(&env_opts);
	free(env_opts.pci_blocked);
@@ -516,10 +519,11 @@ app_copy_opts(struct spdk_app_opts *opts, struct spdk_app_opts *opts_user, size_
	SET_FIELD(disable_signal_handlers);
	SET_FIELD(msg_mempool_size);
	SET_FIELD(rpc_allowlist);
	SET_FIELD(vf_token);

	/* You should not remove this statement, but need to update the assert statement
	 * if you add a new field, and also add a corresponding SET_FIELD statement */
	SPDK_STATIC_ASSERT(sizeof(struct spdk_app_opts) == 208, "Incorrect size");
	SPDK_STATIC_ASSERT(sizeof(struct spdk_app_opts) == 216, "Incorrect size");

#undef SET_FIELD
}
@@ -872,6 +876,7 @@ usage(void (*app_usage)(void))
	       SPDK_APP_DEFAULT_NUM_TRACE_ENTRIES);
	printf("     --rpcs-allowed	   comma-separated list of permitted RPCS\n");
	printf("     --env-context         Opaque context for use of the env implementation\n");
	printf("     --vfio-vf-token       VF token (UUID) shared between SR-IOV PF and VFs for vfio_pci driver\n");
	spdk_log_usage(stdout, "-L");
	spdk_trace_mask_usage(stdout, "-e");
	if (app_usage) {
@@ -1129,6 +1134,9 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
				goto out;
			}
			break;
		case ENV_VF_TOKEN_OPT_IDX:
			opts->vf_token = optarg;
			break;
		case VERSION_OPT_IDX:
			printf(SPDK_VERSION_STRING"\n");
			retval = SPDK_APP_PARSE_ARGS_HELP;