From c746637df8fe89af5775439b9f580d7298c48c9c Mon Sep 17 00:00:00 2001 From: paul luse Date: Wed, 6 Jul 2022 15:01:15 -0700 Subject: [PATCH] lib/idxd: add some flag overrides when doing PMEM writes Per upcoming specification changes. Fixes: 2486 Signed-off-by: paul luse Change-Id: Ic2534148a87b3dec7512f7b01384f484fee4c30f Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13572 Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: --- include/spdk/idxd_spec.h | 1 + lib/idxd/idxd.c | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/spdk/idxd_spec.h b/include/spdk/idxd_spec.h index 5ee213c50..ca5c0ee4d 100644 --- a/include/spdk/idxd_spec.h +++ b/include/spdk/idxd_spec.h @@ -34,6 +34,7 @@ extern "C" { #define IDXD_FLAG_COMPLETION_ADDR_VALID (1 << 2) #define IDXD_FLAG_REQUEST_COMPLETION (1 << 3) #define IDXD_FLAG_CACHE_CONTROL (1 << 8) +#define IDXD_FLAG_DEST_READBACK (1 << 14) #define IDXD_FLAG_DEST_STEERING_TAG (1 << 15) #define IDXD_FLAG_CRC_READ_CRC_SEED (1 << 16) diff --git a/lib/idxd/idxd.c b/lib/idxd/idxd.c index 9db2d9723..2e3f2396a 100644 --- a/lib/idxd/idxd.c +++ b/lib/idxd/idxd.c @@ -601,6 +601,19 @@ _idxd_flush_batch(struct spdk_idxd_io_channel *chan) return 0; } +static inline void +_update_write_flags(struct spdk_idxd_io_channel *chan, struct idxd_hw_desc *desc) +{ + if (desc->flags & SPDK_IDXD_FLAG_PERSISTENT) { + /* recent spec changes require a different set of flags for PMEM writes */ + desc->flags &= ~IDXD_FLAG_DEST_STEERING_TAG; + desc->flags &= ~IDXD_FLAG_CACHE_CONTROL; + desc->flags |= IDXD_FLAG_DEST_READBACK; + } else { + desc->flags ^= IDXD_FLAG_CACHE_CONTROL; + } +} + int spdk_idxd_submit_copy(struct spdk_idxd_io_channel *chan, struct iovec *diov, uint32_t diovcnt, @@ -665,7 +678,7 @@ spdk_idxd_submit_copy(struct spdk_idxd_io_channel *chan, desc->src_addr = src_addr; desc->dst_addr = dst_addr; desc->xfer_size = seg_len; - desc->flags ^= IDXD_FLAG_CACHE_CONTROL; + _update_write_flags(chan, desc); len -= seg_len; } @@ -760,7 +773,7 @@ spdk_idxd_submit_dualcast(struct spdk_idxd_io_channel *chan, void *dst1, void *d desc->dst_addr = dst1_addr; desc->dest2 = dst2_addr; desc->xfer_size = len; - desc->flags ^= IDXD_FLAG_CACHE_CONTROL; + _update_write_flags(chan, desc); dst1_addr += len; outer_seg_len -= len; @@ -913,7 +926,7 @@ spdk_idxd_submit_fill(struct spdk_idxd_io_channel *chan, desc->pattern = fill_pattern; desc->dst_addr = dst_addr; desc->xfer_size = seg_len; - desc->flags ^= IDXD_FLAG_CACHE_CONTROL; + _update_write_flags(chan, desc); len -= seg_len; dst += seg_len; @@ -1083,7 +1096,7 @@ spdk_idxd_submit_copy_crc32c(struct spdk_idxd_io_channel *chan, desc->opcode = IDXD_OPCODE_COPY_CRC; desc->dst_addr = dst_addr; desc->src_addr = src_addr; - desc->flags ^= IDXD_FLAG_CACHE_CONTROL; + _update_write_flags(chan, desc); if (op == first_op) { desc->crc32c.seed = seed; } else {