Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c273b16 authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Roland Dreier
Browse files

mlx5_core: Simplify signature handover wqe for interleaved buffers



No need for repetition format pattern in case the data and protection
are already interleaved in the memory domain since the pattern
already exists. A single key entry is sufficient and may save some
extra fetch ops.

Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 8524867b
Loading
Loading
Loading
Loading
+9 −15
Original line number Diff line number Diff line
@@ -2131,9 +2131,13 @@ static int set_sig_data_segment(struct ib_send_wr *wr, struct mlx5_ib_qp *qp,
	int ret;
	int wqe_size;

	if (!wr->wr.sig_handover.prot) {
	if (!wr->wr.sig_handover.prot ||
	    (data_key == wr->wr.sig_handover.prot->lkey &&
	     data_va == wr->wr.sig_handover.prot->addr &&
	     data_len == wr->wr.sig_handover.prot->length)) {
		/**
		 * Source domain doesn't contain signature information
		 * or data and protection are interleaved in memory.
		 * So need construct:
		 *                  ------------------
		 *                 |     data_klm     |
@@ -2187,23 +2191,13 @@ static int set_sig_data_segment(struct ib_send_wr *wr, struct mlx5_ib_qp *qp,
		data_sentry->bcount = cpu_to_be16(block_size);
		data_sentry->key = cpu_to_be32(data_key);
		data_sentry->va = cpu_to_be64(data_va);
		data_sentry->stride = cpu_to_be16(block_size);

		prot_sentry->bcount = cpu_to_be16(prot_size);
		prot_sentry->key = cpu_to_be32(prot_key);

		if (prot_key == data_key && prot_va == data_va) {
			/**
			 * The data and protection are interleaved
			 * in a single memory region
			 **/
			prot_sentry->va = cpu_to_be64(data_va + block_size);
			prot_sentry->stride = cpu_to_be16(block_size + prot_size);
			data_sentry->stride = prot_sentry->stride;
		} else {
			/* The data and protection are two different buffers */
		prot_sentry->va = cpu_to_be64(prot_va);
			data_sentry->stride = cpu_to_be16(block_size);
		prot_sentry->stride = cpu_to_be16(prot_size);
		}

		wqe_size = ALIGN(sizeof(*sblock_ctrl) + sizeof(*data_sentry) +
				 sizeof(*prot_sentry), 64);
	}