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:
parent
61631dadb3
commit
c746637df8
@ -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)
|
||||
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user