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: Jun Zeng <jun1.zeng@intel.com>
Change-Id: Ie9700fa395327da4e847c6213167284c148a64e3
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14424
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Jun Zeng 2022-09-08 17:29:15 +08:00 committed by Tomasz Zawadzki
parent dda78a882f
commit 86431df168
5 changed files with 28 additions and 4 deletions

View File

@ -62,6 +62,7 @@ struct spdk_env_opts {
/** Opaque context for use of the env implementation. */
void *env_context;
const char *vf_token;
};
/**

View File

@ -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

View File

@ -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)

View File

@ -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;

View File

@ -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;