mlx5_core: Simplify signature handover wqe for interleaved buffers
authorSagi Grimberg <sagig@mellanox.com>
Sun, 18 May 2014 15:32:39 +0000 (18:32 +0300)
committerRoland Dreier <roland@purestorage.com>
Tue, 27 May 2014 18:52:58 +0000 (11:52 -0700)
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: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/mlx5/qp.c

index 74ee4a474e68b87ecf24675a14756e5d53f1fede..00b5563acab70f8059d2ff767310b2c16de98423 100644 (file)
@@ -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);
+               prot_sentry->va = cpu_to_be64(prot_va);
+               prot_sentry->stride = cpu_to_be16(prot_size);
 
-               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);
        }