dmaengine: idxd: set defaults for wq configs
authorDave Jiang <dave.jiang@intel.com>
Tue, 26 Oct 2021 21:45:34 +0000 (14:45 -0700)
committerVinod Koul <vkoul@kernel.org>
Fri, 17 Dec 2021 16:09:28 +0000 (21:39 +0530)
Add default values for wq size, max_xfer_size and max_batch_size. These
values should provide a general guidance for the wq configuration when
the user does not specify any specific values.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/163528473483.3926048.7950067926287180976.stgit@djiang5-desk3.ch.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/idxd/device.c
drivers/dma/idxd/idxd.h
drivers/dma/idxd/init.c

index 1dc5245107dfd36d543b7520251eb4e019969e0f..36e213a8108dd4c1bf0ab769c0ecc45d83c7a2b8 100644 (file)
@@ -390,6 +390,8 @@ static void idxd_wq_disable_cleanup(struct idxd_wq *wq)
        clear_bit(WQ_FLAG_DEDICATED, &wq->flags);
        clear_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags);
        memset(wq->name, 0, WQ_NAME_SIZE);
+       wq->max_xfer_bytes = WQ_DEFAULT_MAX_XFER;
+       wq->max_batch_size = WQ_DEFAULT_MAX_BATCH;
 }
 
 static void idxd_wq_ref_release(struct percpu_ref *ref)
@@ -839,15 +841,12 @@ static int idxd_wq_config_write(struct idxd_wq *wq)
                wq->wqcfg->bits[i] = ioread32(idxd->reg_base + wq_offset);
        }
 
+       if (wq->size == 0 && wq->type != IDXD_WQT_NONE)
+               wq->size = WQ_DEFAULT_QUEUE_DEPTH;
+
        /* byte 0-3 */
        wq->wqcfg->wq_size = wq->size;
 
-       if (wq->size == 0) {
-               idxd->cmd_status = IDXD_SCMD_WQ_NO_SIZE;
-               dev_warn(dev, "Incorrect work queue size: 0\n");
-               return -EINVAL;
-       }
-
        /* bytes 4-7 */
        wq->wqcfg->wq_thresh = wq->threshold;
 
@@ -993,8 +992,6 @@ static int idxd_wqs_setup(struct idxd_device *idxd)
 
                if (!wq->group)
                        continue;
-               if (!wq->size)
-                       continue;
 
                if (wq_shared(wq) && !device_swq_supported(idxd)) {
                        idxd->cmd_status = IDXD_SCMD_WQ_NO_SWQ_SUPPORT;
index 51e79201636cbb1011fe2db233cbc780f5d245bd..89e98d69115ba2e273cd3e17d8f790ca17235abf 100644 (file)
@@ -150,6 +150,10 @@ struct idxd_cdev {
 #define WQ_NAME_SIZE   1024
 #define WQ_TYPE_SIZE   10
 
+#define WQ_DEFAULT_QUEUE_DEPTH         16
+#define WQ_DEFAULT_MAX_XFER            SZ_2M
+#define WQ_DEFAULT_MAX_BATCH           32
+
 enum idxd_op_type {
        IDXD_OP_BLOCK = 0,
        IDXD_OP_NONBLOCK = 1,
index 912839bf0be3d81a127942fad9d39be9fef51f9c..94ecd4bf0f0ed0cf5597db2ad3d9b25f0f52725f 100644 (file)
@@ -246,8 +246,8 @@ static int idxd_setup_wqs(struct idxd_device *idxd)
                init_waitqueue_head(&wq->err_queue);
                init_completion(&wq->wq_dead);
                init_completion(&wq->wq_resurrect);
-               wq->max_xfer_bytes = idxd->max_xfer_bytes;
-               wq->max_batch_size = idxd->max_batch_size;
+               wq->max_xfer_bytes = WQ_DEFAULT_MAX_XFER;
+               wq->max_batch_size = WQ_DEFAULT_MAX_BATCH;
                wq->wqcfg = kzalloc_node(idxd->wqcfg_size, GFP_KERNEL, dev_to_node(dev));
                if (!wq->wqcfg) {
                        put_device(conf_dev);