From a03e4b62a79b3857d8097d8e95a44e7a0ae3f4f5 Mon Sep 17 00:00:00 2001 From: Konstantin Ananyev Date: Fri, 16 Jul 2021 14:50:27 +0100 Subject: [PATCH] raw/ioat: fix termination descriptor for batch When batch_size == 1, idxd has to add a dummy termination descriptor to satisfy HW requirements. Right now it uses NOP descriptor with FENCE flag. This is excessive and fencing can slowdown things quite significantly. The patch removes FENCE flag from termination dummy descriptor. That helps to improve performance for no-burst scenarios. Fixes: 245efe544d8e ("raw/ioat: report status of completed jobs") Signed-off-by: Konstantin Ananyev Acked-by: Bruce Richardson --- drivers/raw/ioat/rte_idxd_rawdev_fns.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/raw/ioat/rte_idxd_rawdev_fns.h b/drivers/raw/ioat/rte_idxd_rawdev_fns.h index 57548609e3..3ea25f6ca9 100644 --- a/drivers/raw/ioat/rte_idxd_rawdev_fns.h +++ b/drivers/raw/ioat/rte_idxd_rawdev_fns.h @@ -231,6 +231,14 @@ __idxd_enqueue_copy(int dev_id, rte_iova_t src, rte_iova_t dst, src, dst, length, &hdl); } +static __rte_always_inline int +__idxd_enqueue_nop(int dev_id) +{ + /* only op field needs filling - zero src, dst and length */ + return __idxd_write_desc(dev_id, idxd_op_nop << IDXD_CMD_OP_SHIFT, + 0, 0, 0, NULL); +} + static __rte_always_inline int __idxd_fence(int dev_id) { @@ -260,8 +268,8 @@ __idxd_perform_ops(int dev_id) return 0; if (idxd->batch_size == 1) - /* use a fence as a null descriptor, so batch_size >= 2 */ - if (__idxd_fence(dev_id) != 1) + /* use a NOP as a null descriptor, so batch_size >= 2 */ + if (__idxd_enqueue_nop(dev_id) != 1) return -1; /* write completion beyond last desc in the batch */ -- 2.20.1