Hi Fenghua, On Tue, 2023-07-11 at 10:49 -0700, Fenghua Yu wrote: > Hi, Tom, > > On 7/10/23 12:06, Tom Zanussi wrote: > > From: Dave Jiang <dave.jiang@xxxxxxxxx> > > > > 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@xxxxxxxxx> > > Signed-off-by: Tom Zanussi <tom.zanussi@xxxxxxxxxxxxxxx> > > --- > > .../ABI/stable/sysfs-driver-dma-idxd | 6 ++++ > > drivers/dma/idxd/cdev.c | 7 +++++ > > drivers/dma/idxd/dma.c | 6 ++++ > > drivers/dma/idxd/idxd.h | 9 ++++++ > > drivers/dma/idxd/sysfs.c | 28 +++++++++++++++++++ > > include/uapi/linux/idxd.h | 1 + > > 6 files changed, 57 insertions(+) > > > > diff --git a/Documentation/ABI/stable/sysfs-driver-dma-idxd b/Documentation/ABI/stable/sysfs-driver-dma-idxd > > index 534b7a3d59fc..0e577209bee2 100644 > > --- a/Documentation/ABI/stable/sysfs-driver-dma-idxd > > +++ b/Documentation/ABI/stable/sysfs-driver-dma-idxd > > @@ -270,6 +270,12 @@ Description: Shows the operation capability bits displayed in bitmap format > > correlates to the operations allowed. It's visible only > > on platforms that support the capability. > > > > +What: /sys/bus/dsa/devices/wq<m>.<n>/driver_name > > +Date: Mar 27, 2023 > > +KernelVersion: 6.6.0 > > +Contact: dmaengine@xxxxxxxxxxxxxxx > > +Description: Name of driver to be bounded to the wq. > > + > > What: /sys/bus/dsa/devices/engine<m>.<n>/group_id > > Date: Oct 25, 2019 > > KernelVersion: 5.6.0 > > diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c > > index ecbf67c2ad2b..b1ecfb71d95e 100644 > > --- a/drivers/dma/idxd/cdev.c > > +++ b/drivers/dma/idxd/cdev.c > > @@ -510,6 +510,7 @@ void idxd_wq_del_cdev(struct idxd_wq *wq) > > > > 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_device *idxd = wq->idxd; > > int rc; > > @@ -537,6 +538,12 @@ static int idxd_user_drv_probe(struct idxd_dev *idxd_dev) > > > > 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))); > > if (!wq->wq) { > > rc = -ENOMEM; > > diff --git a/drivers/dma/idxd/dma.c b/drivers/dma/idxd/dma.c > > index eb35ca313684..8bb7e7ff8d6a 100644 > > --- a/drivers/dma/idxd/dma.c > > +++ b/drivers/dma/idxd/dma.c > > @@ -305,6 +305,12 @@ static int idxd_dmaengine_drv_probe(struct idxd_dev *idxd_dev) > > return -ENXIO; > > > > 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; > > > > rc = drv_enable_wq(wq); > > diff --git a/drivers/dma/idxd/idxd.h b/drivers/dma/idxd/idxd.h > > index 5428a2e1b1ec..c62c78e1c9fa 100644 > > --- a/drivers/dma/idxd/idxd.h > > +++ b/drivers/dma/idxd/idxd.h > > @@ -159,6 +159,8 @@ struct idxd_cdev { > > int minor; > > }; > > > > +#define DRIVER_NAME_SIZE 128 > > + > > #define IDXD_ALLOCATED_BATCH_SIZE 128U > > #define WQ_NAME_SIZE 1024 > > #define WQ_TYPE_SIZE 10 > > @@ -227,6 +229,8 @@ struct idxd_wq { > > /* Lock to protect upasid_xa access. */ > > struct mutex uc_lock; > > struct xarray upasid_xa; > > + > > + char driver_name[DRIVER_NAME_SIZE + 1]; > > }; > > > > struct idxd_engine { > > @@ -637,6 +641,11 @@ static inline void idxd_wqcfg_set_max_batch_shift(int idxd_type, union wqcfg *wq > > 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, > > struct module *module, const char *mod_name); > > #define idxd_driver_register(driver) \ > > diff --git a/drivers/dma/idxd/sysfs.c b/drivers/dma/idxd/sysfs.c > > index 293739ac5596..6caad044f506 100644 > > --- a/drivers/dma/idxd/sysfs.c > > +++ b/drivers/dma/idxd/sysfs.c > > @@ -1266,6 +1266,33 @@ static ssize_t wq_op_config_store(struct device *dev, struct device_attribute *a > > static struct device_attribute dev_attr_wq_op_config = > > __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); > > + > > + if (wq->state != IDXD_WQ_DISABLED) > > + return -EPERM; > > + > > + if (strlen(buf) > DRIVER_NAME_SIZE || strlen(buf) == 0) > > + return -EINVAL; > > + > > + memset(wq->driver_name, 0, DRIVER_NAME_SIZE + 1); > > + strncpy(wq->driver_name, buf, DRIVER_NAME_SIZE); > > + strreplace(wq->name, '\n', '\0'); > > If user inputs "dmaengine " (with the trailing white spaces), the > trailing white spaces will be copied to wq->driver_name. Later driver > name match will always fail. > > A better way is using strim() to remove the trailing white spaces before > copying the buffer to wq->driver_name. So wq->driver_name is "dmaengine" > (without the trailing white spaces). > Yes, good point, I'll add that. Thanks for pointing that out! Tom > Thanks. > > -Fenghua