dmaengine: idxd: add wq driver name support for accel-config user tool

[ Upstream commit 7af1e0aceeb321cbc90fcf6fa0bec8870290377f ]

With the possibility of multiple wq drivers that can be bound to the wq,
the user config tool accel-config needs a way to know which wq driver to
bind to the wq. Introduce per wq driver_name sysfs attribute where the user
can indicate the driver to be bound to the wq. This allows accel-config to
just bind to the driver using wq->driver_name.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Reviewed-by: Fenghua Yu <fenghua.yu@intel.com>
Acked-by: Vinod Koul <vkoul@kernel.org>
Link: https://lore.kernel.org/r/20230908201045.4115614-1-fenghua.yu@intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Stable-dep-of: 8dfa57aabff6 ("dmaengine: idxd: Fix allowing write() from different address spaces")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Dave Jiang
2023-09-08 13:10:45 -07:00
committed by Greg Kroah-Hartman
parent b58a295d10
commit 05298c30b7
6 changed files with 63 additions and 0 deletions

View File

@@ -270,6 +270,12 @@ Description: Shows the operation capability bits displayed in bitmap format
correlates to the operations allowed. It's visible only correlates to the operations allowed. It's visible only
on platforms that support the capability. on platforms that support the capability.
What: /sys/bus/dsa/devices/wq<m>.<n>/driver_name
Date: Sept 8, 2023
KernelVersion: 6.7.0
Contact: dmaengine@vger.kernel.org
Description: Name of driver to be bounded to the wq.
What: /sys/bus/dsa/devices/engine<m>.<n>/group_id What: /sys/bus/dsa/devices/engine<m>.<n>/group_id
Date: Oct 25, 2019 Date: Oct 25, 2019
KernelVersion: 5.6.0 KernelVersion: 5.6.0

View File

@@ -584,6 +584,7 @@ void idxd_wq_del_cdev(struct idxd_wq *wq)
static int idxd_user_drv_probe(struct idxd_dev *idxd_dev) static int idxd_user_drv_probe(struct idxd_dev *idxd_dev)
{ {
struct device *dev = &idxd_dev->conf_dev;
struct idxd_wq *wq = idxd_dev_to_wq(idxd_dev); struct idxd_wq *wq = idxd_dev_to_wq(idxd_dev);
struct idxd_device *idxd = wq->idxd; struct idxd_device *idxd = wq->idxd;
int rc; int rc;
@@ -611,6 +612,12 @@ static int idxd_user_drv_probe(struct idxd_dev *idxd_dev)
mutex_lock(&wq->wq_lock); mutex_lock(&wq->wq_lock);
if (!idxd_wq_driver_name_match(wq, dev)) {
idxd->cmd_status = IDXD_SCMD_WQ_NO_DRV_NAME;
rc = -ENODEV;
goto wq_err;
}
wq->wq = create_workqueue(dev_name(wq_confdev(wq))); wq->wq = create_workqueue(dev_name(wq_confdev(wq)));
if (!wq->wq) { if (!wq->wq) {
rc = -ENOMEM; rc = -ENOMEM;

View File

@@ -306,6 +306,12 @@ static int idxd_dmaengine_drv_probe(struct idxd_dev *idxd_dev)
return -ENXIO; return -ENXIO;
mutex_lock(&wq->wq_lock); mutex_lock(&wq->wq_lock);
if (!idxd_wq_driver_name_match(wq, dev)) {
idxd->cmd_status = IDXD_SCMD_WQ_NO_DRV_NAME;
rc = -ENODEV;
goto err;
}
wq->type = IDXD_WQT_KERNEL; wq->type = IDXD_WQT_KERNEL;
rc = drv_enable_wq(wq); rc = drv_enable_wq(wq);

View File

@@ -159,6 +159,8 @@ struct idxd_cdev {
int minor; int minor;
}; };
#define DRIVER_NAME_SIZE 128
#define IDXD_ALLOCATED_BATCH_SIZE 128U #define IDXD_ALLOCATED_BATCH_SIZE 128U
#define WQ_NAME_SIZE 1024 #define WQ_NAME_SIZE 1024
#define WQ_TYPE_SIZE 10 #define WQ_TYPE_SIZE 10
@@ -227,6 +229,8 @@ struct idxd_wq {
/* Lock to protect upasid_xa access. */ /* Lock to protect upasid_xa access. */
struct mutex uc_lock; struct mutex uc_lock;
struct xarray upasid_xa; struct xarray upasid_xa;
char driver_name[DRIVER_NAME_SIZE + 1];
}; };
struct idxd_engine { struct idxd_engine {
@@ -648,6 +652,11 @@ static inline void idxd_wqcfg_set_max_batch_shift(int idxd_type, union wqcfg *wq
wqcfg->max_batch_shift = max_batch_shift; wqcfg->max_batch_shift = max_batch_shift;
} }
static inline int idxd_wq_driver_name_match(struct idxd_wq *wq, struct device *dev)
{
return (strncmp(wq->driver_name, dev->driver->name, strlen(dev->driver->name)) == 0);
}
int __must_check __idxd_driver_register(struct idxd_device_driver *idxd_drv, int __must_check __idxd_driver_register(struct idxd_device_driver *idxd_drv,
struct module *module, const char *mod_name); struct module *module, const char *mod_name);
#define idxd_driver_register(driver) \ #define idxd_driver_register(driver) \

View File

@@ -1282,6 +1282,39 @@ err:
static struct device_attribute dev_attr_wq_op_config = static struct device_attribute dev_attr_wq_op_config =
__ATTR(op_config, 0644, wq_op_config_show, wq_op_config_store); __ATTR(op_config, 0644, wq_op_config_show, wq_op_config_store);
static ssize_t wq_driver_name_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct idxd_wq *wq = confdev_to_wq(dev);
return sysfs_emit(buf, "%s\n", wq->driver_name);
}
static ssize_t wq_driver_name_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct idxd_wq *wq = confdev_to_wq(dev);
char *input, *pos;
if (wq->state != IDXD_WQ_DISABLED)
return -EPERM;
if (strlen(buf) > DRIVER_NAME_SIZE || strlen(buf) == 0)
return -EINVAL;
input = kstrndup(buf, count, GFP_KERNEL);
if (!input)
return -ENOMEM;
pos = strim(input);
memset(wq->driver_name, 0, DRIVER_NAME_SIZE + 1);
sprintf(wq->driver_name, "%s", pos);
kfree(input);
return count;
}
static struct device_attribute dev_attr_wq_driver_name =
__ATTR(driver_name, 0644, wq_driver_name_show, wq_driver_name_store);
static struct attribute *idxd_wq_attributes[] = { static struct attribute *idxd_wq_attributes[] = {
&dev_attr_wq_clients.attr, &dev_attr_wq_clients.attr,
&dev_attr_wq_state.attr, &dev_attr_wq_state.attr,
@@ -1301,6 +1334,7 @@ static struct attribute *idxd_wq_attributes[] = {
&dev_attr_wq_occupancy.attr, &dev_attr_wq_occupancy.attr,
&dev_attr_wq_enqcmds_retries.attr, &dev_attr_wq_enqcmds_retries.attr,
&dev_attr_wq_op_config.attr, &dev_attr_wq_op_config.attr,
&dev_attr_wq_driver_name.attr,
NULL, NULL,
}; };

View File

@@ -31,6 +31,7 @@ enum idxd_scmd_stat {
IDXD_SCMD_WQ_IRQ_ERR = 0x80100000, IDXD_SCMD_WQ_IRQ_ERR = 0x80100000,
IDXD_SCMD_WQ_USER_NO_IOMMU = 0x80110000, IDXD_SCMD_WQ_USER_NO_IOMMU = 0x80110000,
IDXD_SCMD_DEV_EVL_ERR = 0x80120000, IDXD_SCMD_DEV_EVL_ERR = 0x80120000,
IDXD_SCMD_WQ_NO_DRV_NAME = 0x80200000,
}; };
#define IDXD_SCMD_SOFTERR_MASK 0x80000000 #define IDXD_SCMD_SOFTERR_MASK 0x80000000