Re: [Accel-config] [PATCH 2/7] accel-config: Add config-user-default command
Fenghua Yu <[email protected]> Wed, 2 Aug 2023 07:58:22 -0700
| Newsgroups | dev.linux.lists.accel-config |
|---|---|
| Message-ID | <[email protected]> |
Hi, Dave, On 8/1/23 17:14, Dave Jiang wrote: > > > On 8/1/23 14:52, Fenghua Yu wrote: >> Although current accel-config provides thorough ways to configure >> IDXD devices and WQs, sometimes user needs an easier way to configure >> and enable them without many knowledges of IDXD. >> >> A new command "config-user-default" is added to configure and enable >> all available devices and WQs for user usage in the following default >> configurations: >> >> 1. Fixed configurations: >> "mode":"shared", >> "group_id":0, >> "priority":10, >> "block_on_fault":1, >> "name":"user_default_wq", >> "ats_disable":0, >> "prs_disable":1 >> "type": "user" >> "driver_name":"user", >> >> 2. Calculated configurations: >> "size": max WQ size / max WQs >> "threshold": WQ size >> >> 3. Default configurations that have been set by IDXD driver: >> "max_batch_size" >> "max_transfer_size" >> "op_config" >> >> Signed-off-by: Fenghua Yu <[email protected]> >> Reviewed-by: Ramesh Thomas <[email protected]> >> --- >> accfg/accel-config.c | 1 + >> accfg/config.c | 268 ++++++++++++++++++++++++++++++++++++++++ >> accfg/libaccel_config.h | 1 + >> builtin.h | 1 + >> 4 files changed, 271 insertions(+) >> >> diff --git a/accfg/accel-config.c b/accfg/accel-config.c >> index a897608..cf3882e 100644 >> --- a/accfg/accel-config.c >> +++ b/accfg/accel-config.c >> @@ -67,6 +67,7 @@ static struct cmd_struct commands[] = { >> {"config-group", cmd_config_group}, >> {"config-wq", cmd_config_wq}, >> {"config-engine", cmd_config_engine}, >> + {"config-user-default", cmd_config_default}, >> #ifdef ENABLE_TEST >> {"test", cmd_test}, >> #endif >> diff --git a/accfg/config.c b/accfg/config.c >> index 2631fd9..f3fa83f 100644 >> --- a/accfg/config.c >> +++ b/accfg/config.c >> @@ -119,6 +119,87 @@ static bool is_wq_threshold_writable(struct >> accfg_wq *wq, int val); >> static bool is_wq_prs_disable_writable(struct accfg_wq *wq, int val); >> static bool is_wq_ats_disable_writable(struct accfg_wq *wq, int val); >> +static int get_wq_size(struct accfg_device *dev) >> +{ >> + int max_wq_size, max_wqs; >> + >> + max_wq_size = accfg_device_get_max_work_queues_size(dev); >> + max_wqs = accfg_device_get_max_work_queues(dev); >> + >> + return max_wq_size / max_wqs; >> +} >> + >> +static int config_default_wq_set_prs_disable(struct accfg_wq *wq, int >> val) >> +{ >> + if (!is_wq_prs_disable_writable(wq, val)) >> + return -EPERM; >> + >> + return accfg_wq_set_prs_disable(wq, val); >> +} >> + >> +static int config_default_wq_set_ats_disable(struct accfg_wq *wq, int >> val) >> +{ >> + if (!is_wq_ats_disable_writable(wq, val)) >> + return -EPERM; >> + >> + return accfg_wq_set_ats_disable(wq, val); >> +} >> + >> +static int config_default_wq_set_threshold(struct accfg_wq *wq, int val) >> +{ >> + if (!is_wq_threshold_writable(wq, val)) >> + return -EPERM; threshold only be writable on shared group. >> + >> + return accfg_wq_set_threshold(wq, val); >> +} >> + >> +static struct conf_def_wq_param { >> + struct wq_parameters param; >> + bool configured; >> +} conf_def_wq_param[ACCFG_DEVICE_MAX]; >> + >> +/* Return WQ parameter for dev type. */ >> +static struct wq_parameters *get_conf_def_wq_param(enum >> accfg_device_type type) >> +{ >> + if (type == ACCFG_DEVICE_DSA) >> + return &conf_def_wq_param[ACCFG_DEVICE_DSA].param; >> + else if (type == ACCFG_DEVICE_IAX) >> + return &conf_def_wq_param[ACCFG_DEVICE_IAX].param; >> + >> + return NULL; >> +} >> + >> +/* Check if dev is configured. */ >> +static bool conf_def_dev_configured(struct accfg_device *dev) >> +{ >> + if (accfg_device_get_type(dev) == ACCFG_DEVICE_DSA) >> + return conf_def_wq_param[ACCFG_DEVICE_DSA].configured; >> + else if (accfg_device_get_type(dev) == ACCFG_DEVICE_IAX) >> + return conf_def_wq_param[ACCFG_DEVICE_IAX].configured; >> + >> + return false; >> +} >> + >> +/* Set WQ parameters based on device cap: size and threshold. */ >> +static int config_default_wq_set_on_dev(struct accfg_device *dev) >> +{ >> + enum accfg_device_type dev_type; >> + struct wq_parameters *p; >> + >> + dev_type = accfg_device_get_type(dev); >> + p = get_conf_def_wq_param(dev_type); >> + if (!p) >> + return -EINVAL; >> + >> + p->wq_size = get_wq_size(dev); >> + if (p->wq_size <= 0) >> + return -ENOSPC; >> + >> + p->threshold = p->wq_size; > > Should check if wq is shared before setting threshold. threshold has no > meaning for dwq. This is just writing an internal parameter. No need to check mode here, right? The mode check happens during writing threshold via sysfs. Please see this functions: >> +static int config_default_wq_set_threshold(struct accfg_wq *wq, int val) >> +{ >> + if (!is_wq_threshold_writable(wq, val)) >> + return -EPERM; Thanks. -Fenghua