lib/idxd: add some flag overrides when doing PMEM writes

Per upcoming specification changes.

Fixes: 2486

Signed-off-by: paul luse <paul.e.luse@intel.com>
Change-Id: Ic2534148a87b3dec7512f7b01384f484fee4c30f
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13572
Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: <wayne.gao@intel.com>
This commit is contained in:
paul luse 2022-07-06 15:01:15 -07:00 committed by Ben Walker
parent 61631dadb3
commit c746637df8
2 changed files with 18 additions and 4 deletions

View File

@ -34,6 +34,7 @@ extern "C" {
#define IDXD_FLAG_COMPLETION_ADDR_VALID (1 << 2) #define IDXD_FLAG_COMPLETION_ADDR_VALID (1 << 2)
#define IDXD_FLAG_REQUEST_COMPLETION (1 << 3) #define IDXD_FLAG_REQUEST_COMPLETION (1 << 3)
#define IDXD_FLAG_CACHE_CONTROL (1 << 8) #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_DEST_STEERING_TAG (1 << 15)
#define IDXD_FLAG_CRC_READ_CRC_SEED (1 << 16) #define IDXD_FLAG_CRC_READ_CRC_SEED (1 << 16)

View File

@ -601,6 +601,19 @@ _idxd_flush_batch(struct spdk_idxd_io_channel *chan)
return 0; 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 int
spdk_idxd_submit_copy(struct spdk_idxd_io_channel *chan, spdk_idxd_submit_copy(struct spdk_idxd_io_channel *chan,
struct iovec *diov, uint32_t diovcnt, 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->src_addr = src_addr;
desc->dst_addr = dst_addr; desc->dst_addr = dst_addr;
desc->xfer_size = seg_len; desc->xfer_size = seg_len;
desc->flags ^= IDXD_FLAG_CACHE_CONTROL; _update_write_flags(chan, desc);
len -= seg_len; 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->dst_addr = dst1_addr;
desc->dest2 = dst2_addr; desc->dest2 = dst2_addr;
desc->xfer_size = len; desc->xfer_size = len;
desc->flags ^= IDXD_FLAG_CACHE_CONTROL; _update_write_flags(chan, desc);
dst1_addr += len; dst1_addr += len;
outer_seg_len -= len; outer_seg_len -= len;
@ -913,7 +926,7 @@ spdk_idxd_submit_fill(struct spdk_idxd_io_channel *chan,
desc->pattern = fill_pattern; desc->pattern = fill_pattern;
desc->dst_addr = dst_addr; desc->dst_addr = dst_addr;
desc->xfer_size = seg_len; desc->xfer_size = seg_len;
desc->flags ^= IDXD_FLAG_CACHE_CONTROL; _update_write_flags(chan, desc);
len -= seg_len; len -= seg_len;
dst += 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->opcode = IDXD_OPCODE_COPY_CRC;
desc->dst_addr = dst_addr; desc->dst_addr = dst_addr;
desc->src_addr = src_addr; desc->src_addr = src_addr;
desc->flags ^= IDXD_FLAG_CACHE_CONTROL; _update_write_flags(chan, desc);
if (op == first_op) { if (op == first_op) {
desc->crc32c.seed = seed; desc->crc32c.seed = seed;
} else { } else {