[dpdk-dev] [PATCH v2 01/18] raw/ioat: add a flag to control copying handle parameters
Bruce Richardson
bruce.richardson at intel.com
Fri Aug 21 18:29:27 CEST 2020
From: Cheng Jiang <Cheng1.jiang at intel.com>
Add a flag which controls whether rte_ioat_enqueue_copy and
rte_ioat_completed_copies function should process handle parameters. Not
doing so can improve the performance when handle parameters are not
necessary.
Signed-off-by: Cheng Jiang <Cheng1.jiang at intel.com>
Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
---
drivers/raw/ioat/ioat_rawdev.c | 2 ++
drivers/raw/ioat/rte_ioat_rawdev.h | 45 ++++++++++++++++++++++--------
2 files changed, 36 insertions(+), 11 deletions(-)
diff --git a/drivers/raw/ioat/ioat_rawdev.c b/drivers/raw/ioat/ioat_rawdev.c
index 7f1a154360..856b55cb6e 100644
--- a/drivers/raw/ioat/ioat_rawdev.c
+++ b/drivers/raw/ioat/ioat_rawdev.c
@@ -58,6 +58,7 @@ ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
return -EINVAL;
ioat->ring_size = params->ring_size;
+ ioat->hdls_disable = params->hdls_disable;
if (ioat->desc_ring != NULL) {
rte_memzone_free(ioat->desc_mz);
ioat->desc_ring = NULL;
@@ -122,6 +123,7 @@ ioat_dev_info_get(struct rte_rawdev *dev, rte_rawdev_obj_t dev_info,
return -EINVAL;
cfg->ring_size = ioat->ring_size;
+ cfg->hdls_disable = ioat->hdls_disable;
return 0;
}
diff --git a/drivers/raw/ioat/rte_ioat_rawdev.h b/drivers/raw/ioat/rte_ioat_rawdev.h
index f765a65571..4bc6491d91 100644
--- a/drivers/raw/ioat/rte_ioat_rawdev.h
+++ b/drivers/raw/ioat/rte_ioat_rawdev.h
@@ -34,7 +34,8 @@
* an ioat rawdev instance.
*/
struct rte_ioat_rawdev_config {
- unsigned short ring_size;
+ unsigned short ring_size; /**< size of job submission descriptor ring */
+ bool hdls_disable; /**< if set, ignore user-supplied handle params */
};
/**
@@ -52,6 +53,7 @@ struct rte_ioat_rawdev {
unsigned short ring_size;
struct rte_ioat_generic_hw_desc *desc_ring;
+ bool hdls_disable;
__m128i *hdls; /* completion handles for returning to user */
@@ -84,10 +86,14 @@ struct rte_ioat_rawdev {
* The length of the data to be copied
* @param src_hdl
* An opaque handle for the source data, to be returned when this operation
- * has been completed and the user polls for the completion details
+ * has been completed and the user polls for the completion details.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored.
* @param dst_hdl
* An opaque handle for the destination data, to be returned when this
- * operation has been completed and the user polls for the completion details
+ * operation has been completed and the user polls for the completion details.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored.
* @param fence
* A flag parameter indicating that hardware should not begin to perform any
* subsequently enqueued copy operations until after this operation has
@@ -121,8 +127,10 @@ rte_ioat_enqueue_copy(int dev_id, phys_addr_t src, phys_addr_t dst,
desc->u.control_raw = (uint32_t)((!!fence << 4) | (!(write & 0xF)) << 3);
desc->src_addr = src;
desc->dest_addr = dst;
+ if (!ioat->hdls_disable)
+ ioat->hdls[write] = _mm_set_epi64x((int64_t)dst_hdl,
+ (int64_t)src_hdl);
- ioat->hdls[write] = _mm_set_epi64x((int64_t)dst_hdl, (int64_t)src_hdl);
rte_prefetch0(&ioat->desc_ring[ioat->next_write & mask]);
ioat->enqueued++;
@@ -168,19 +176,29 @@ rte_ioat_get_last_completed(struct rte_ioat_rawdev *ioat, int *error)
/**
* Returns details of copy operations that have been completed
*
- * Returns to the caller the user-provided "handles" for the copy operations
- * which have been completed by the hardware, and not already returned by
- * a previous call to this API.
+ * If the hdls_disable option was not set when the device was configured,
+ * the function will return to the caller the user-provided "handles" for
+ * the copy operations which have been completed by the hardware, and not
+ * already returned by a previous call to this API.
+ * If the hdls_disable option for the device was set on configure, the
+ * max_copies, src_hdls and dst_hdls parameters will be ignored, and the
+ * function returns the number of newly-completed operations.
*
* @param dev_id
* The rawdev device id of the ioat instance
* @param max_copies
* The number of entries which can fit in the src_hdls and dst_hdls
- * arrays, i.e. max number of completed operations to report
+ * arrays, i.e. max number of completed operations to report.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored.
* @param src_hdls
- * Array to hold the source handle parameters of the completed copies
+ * Array to hold the source handle parameters of the completed copies.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored.
* @param dst_hdls
- * Array to hold the destination handle parameters of the completed copies
+ * Array to hold the destination handle parameters of the completed copies.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored.
* @return
* -1 on error, with rte_errno set appropriately.
* Otherwise number of completed operations i.e. number of entries written
@@ -205,6 +223,11 @@ rte_ioat_completed_copies(int dev_id, uint8_t max_copies,
return -1;
}
+ if (ioat->hdls_disable) {
+ read += count;
+ goto end;
+ }
+
if (count > max_copies)
count = max_copies;
@@ -222,7 +245,7 @@ rte_ioat_completed_copies(int dev_id, uint8_t max_copies,
src_hdls[i] = hdls[0];
dst_hdls[i] = hdls[1];
}
-
+end:
ioat->next_read = read;
ioat->completed += count;
return count;
--
2.25.1
More information about the dev
mailing list