IB: Change CQE "csum_ok" field to a bit flag
authorOr Gerlitz <ogerlitz@mellanox.com>
Wed, 11 Jan 2012 17:03:51 +0000 (19:03 +0200)
committerRoland Dreier <roland@purestorage.com>
Thu, 8 Mar 2012 20:34:27 +0000 (12:34 -0800)
Use a bit in wc_flags rather then a whole integer to hold the
"checksum OK" flag.  By itself, this change doesn't reduce the size of
struct ib_wc on 64bit machines -- it stays on 56 bytes because of
padding.  However, it will allow to add more fields in the future
without enlarging the struct.  Also, it will let us have a unified
approach with future libibverbs checksum offload reporting, because a
bit flag doesn't break the library ABI.

This patch was suggested during conversation with Liran Liss
<liranl@mellanox.com>.

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Reviewed-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/mlx4/cq.c
drivers/infiniband/hw/mthca/mthca_cq.c
drivers/infiniband/hw/qib/qib_rc.c
drivers/infiniband/hw/qib/qib_uc.c
drivers/infiniband/ulp/ipoib/ipoib_ib.c
include/rdma/ib_verbs.h

index 5ecf38d..09eb1d1 100644 (file)
@@ -720,7 +720,8 @@ repoll:
                wc->dlid_path_bits = (g_mlpath_rqpn >> 24) & 0x7f;
                wc->wc_flags      |= g_mlpath_rqpn & 0x80000000 ? IB_WC_GRH : 0;
                wc->pkey_index     = be32_to_cpu(cqe->immed_rss_invalid) & 0x7f;
-               wc->csum_ok        = mlx4_ib_ipoib_csum_ok(cqe->status, cqe->checksum);
+               wc->wc_flags      |= mlx4_ib_ipoib_csum_ok(cqe->status,
+                                       cqe->checksum) ? IB_WC_IP_CSUM_OK : 0;
                if (rdma_port_get_link_layer(wc->qp->device,
                                (*cur_qp)->port) == IB_LINK_LAYER_ETHERNET)
                        wc->sl  = be16_to_cpu(cqe->sl_vid) >> 13;
index 53157b8..40ba833 100644 (file)
@@ -643,7 +643,8 @@ static inline int mthca_poll_one(struct mthca_dev *dev,
                entry->wc_flags   |= cqe->g_mlpath & 0x80 ? IB_WC_GRH : 0;
                checksum = (be32_to_cpu(cqe->rqpn) >> 24) |
                                ((be32_to_cpu(cqe->my_ee) >> 16) & 0xff00);
-               entry->csum_ok = (cqe->sl_ipok & 1 && checksum == 0xffff);
+               entry->wc_flags   |=  (cqe->sl_ipok & 1 && checksum == 0xffff) ?
+                                                       IB_WC_IP_CSUM_OK : 0;
        }
 
        entry->status = IB_WC_SUCCESS;
index 894afac..765b4cb 100644 (file)
@@ -2048,7 +2048,6 @@ send_last:
                wc.pkey_index = 0;
                wc.dlid_path_bits = 0;
                wc.port_num = 0;
-               wc.csum_ok = 0;
                /* Signal completion event if the solicited bit is set. */
                qib_cq_enter(to_icq(qp->ibqp.recv_cq), &wc,
                             (ohdr->bth[0] &
index 847e7af..7ce2ac2 100644 (file)
@@ -422,7 +422,6 @@ last_imm:
                wc.pkey_index = 0;
                wc.dlid_path_bits = 0;
                wc.port_num = 0;
-               wc.csum_ok = 0;
                /* Signal completion event if the solicited bit is set. */
                qib_cq_enter(to_icq(qp->ibqp.recv_cq), &wc,
                             (ohdr->bth[0] &
index 4115be5..5c1bc99 100644 (file)
@@ -296,7 +296,8 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
        dev->stats.rx_bytes += skb->len;
 
        skb->dev = dev;
-       if ((dev->features & NETIF_F_RXCSUM) && likely(wc->csum_ok))
+       if ((dev->features & NETIF_F_RXCSUM) &&
+                       likely(wc->wc_flags & IB_WC_IP_CSUM_OK))
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
        napi_gro_receive(&priv->napi, skb);
index ff22a73..c3cca5a 100644 (file)
@@ -518,6 +518,7 @@ enum ib_wc_flags {
        IB_WC_GRH               = 1,
        IB_WC_WITH_IMM          = (1<<1),
        IB_WC_WITH_INVALIDATE   = (1<<2),
+       IB_WC_IP_CSUM_OK        = (1<<3),
 };
 
 struct ib_wc {
@@ -538,7 +539,6 @@ struct ib_wc {
        u8                      sl;
        u8                      dlid_path_bits;
        u8                      port_num;       /* valid only for DR SMPs on switches */
-       int                     csum_ok;
 };
 
 enum ib_cq_notify_flags {