Skip to contentSkip to conversation

i40iw: use shared code for port mapper

DISCUSSION Dan Carpenter 2 participants 2 messages Mar 23, 2016 InfiniBand

lore
Share & tools
lore
#0 lore raw

Hello Faisal Latif,

The patch 8d8cd0bf6798: "i40iw: use shared code for port mapper" from Feb 26, 2016, leads to the following static checker warnings:

drivers/infiniband/hw/i40iw/i40iw_hw.c:484 i40iw_manage_arp_cache()
error: wrong number of bits for 'cpu_to_le32' (16 vs 32) left= 'info->arp_index' info->arp_index = ((arp_index))

drivers/infiniband/hw/i40iw/i40iw_hw.c:556 i40iw_manage_qhash()
error: wrong number of bits for 'cpu_to_le16' (32 vs 16) left= 'info->dest_port' info->dest_port = ((cminfo->loc_port))

drivers/infiniband/hw/i40iw/i40iw_hw.c:562 i40iw_manage_qhash()
error: wrong number of bits for 'cpu_to_le16' (32 vs 16) left= 'info->src_port' info->src_port = ((cminfo->rem_port))

drivers/infiniband/hw/i40iw/i40iw_cm.c:3273 i40iw_init_tcp_ctx()
error: wrong number of bits for 'cpu_to_le32' (16 vs 32)
left= 'tcp_info->arp_idx' tcp_info->arp_idx = ((i40iw_arp_table(iwqp->iwdev, &tcp_info->dest_ip_addr3, 1, (0), 3)))

drivers/infiniband/hw/i40iw/i40iw_cm.c:3289 i40iw_init_tcp_ctx()
error: wrong number of bits for 'cpu_to_le32' (16 vs 32)
left= 'tcp_info->arp_idx' tcp_info->arp_idx = ((i40iw_arp_table(iwqp->iwdev, &tcp_info->dest_ip_addr0, 0, (0), 3)))

drivers/infiniband/hw/i40iw/i40iw_verbs.c:1772 i40iw_dereg_mr()
error: wrong number of bits for 'cpu_to_le32' (16 vs 32) left= 'info->pd_id' info->pd_id = ((iwpd->sc_pd.pd_id & 32767))

drivers/infiniband/hw/i40iw/i40iw_hw.c

   553          info->ipv4_valid = cminfo->ipv4;
   554          ether_addr_copy(info->mac_addr, iwdev->netdev->dev_addr);
   555          info->qp_num = cpu_to_le32(dev->ilq->qp_id);
   556          info->dest_port = cpu_to_le16(cminfo->loc_port);
                ^^^^^^^^^^^^^^^

This is a u32 but we're storing a le16 in it which is problematic. The Sparse version of this check is more strict but has more false positives. Anyway, give it a whirl: https://lwn.net/Articles/205624/

   557          info->dest_ip[0] = cpu_to_le32(cminfo->loc_addr[0]);
   558          info->dest_ip[1] = cpu_to_le32(cminfo->loc_addr[1]);
   559          info->dest_ip[2] = cpu_to_le32(cminfo->loc_addr[2]);
   560          info->dest_ip[3] = cpu_to_le32(cminfo->loc_addr[3]);
   561          if (etype == I40IW_QHASH_TYPE_TCP_ESTABLISHED) {
   562                  info->src_port = cpu_to_le16(cminfo->rem_port);
   563                  info->src_ip[0] = cpu_to_le32(cminfo->rem_addr[0]);
   564                  info->src_ip[1] = cpu_to_le32(cminfo->rem_addr[1]);
   565                  info->src_ip[2] = cpu_to_le32(cminfo->rem_addr[2]);
   566                  info->src_ip[3] = cpu_to_le32(cminfo->rem_addr[3]);

567 }

regards,
dan carpenter
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#1 lore raw

Thanks Dan for pointing it out. Will be sending out patch to fix it and also will run sparse with the CHECK_ENDIAN parameter in future patches.

Faisal

Quoted 59 lines

-----Original Message-----
From: Dan Carpenter [mailto:[email protected]]
Sent: Wednesday, March 23, 2016 3:55 PM
To: Latif, Faisal <[email protected]>
Cc: [email protected]
Subject: re: i40iw: use shared code for port mapper

Hello Faisal Latif,

The patch 8d8cd0bf6798: "i40iw: use shared code for port mapper" from Feb 26, 2016, leads to the following static checker warnings:

drivers/infiniband/hw/i40iw/i40iw_hw.c:484 i40iw_manage_arp_cache()
error: wrong number of bits for 'cpu_to_le32' (16 vs 32) left= 'info->arp_index' info->arp_index = ((arp_index))

drivers/infiniband/hw/i40iw/i40iw_hw.c:556 i40iw_manage_qhash()
error: wrong number of bits for 'cpu_to_le16' (32 vs 16) left= 'info->dest_port' info->dest_port = ((cminfo->loc_port))

drivers/infiniband/hw/i40iw/i40iw_hw.c:562 i40iw_manage_qhash()
error: wrong number of bits for 'cpu_to_le16' (32 vs 16) left= 'info->src_port' info->src_port = ((cminfo->rem_port))

drivers/infiniband/hw/i40iw/i40iw_cm.c:3273 i40iw_init_tcp_ctx()
error: wrong number of bits for 'cpu_to_le32' (16 vs 32) left= 'tcp_info-

Quoted 2 lines

arp_idx' tcp_info->arp_idx = ((i40iw_arp_table(iwqp->iwdev, &tcp_info- dest_ip_addr3, 1, (0), 3)))

drivers/infiniband/hw/i40iw/i40iw_cm.c:3289 i40iw_init_tcp_ctx()
error: wrong number of bits for 'cpu_to_le32' (16 vs 32) left= 'tcp_info-

Quoted 2 lines

arp_idx' tcp_info->arp_idx = ((i40iw_arp_table(iwqp->iwdev, &tcp_info- dest_ip_addr0, 0, (0), 3)))

drivers/infiniband/hw/i40iw/i40iw_verbs.c:1772 i40iw_dereg_mr()
error: wrong number of bits for 'cpu_to_le32' (16 vs 32) left= 'info->pd_id' info-

Quoted 1 line

pd_id = ((iwpd->sc_pd.pd_id & 32767))

drivers/infiniband/hw/i40iw/i40iw_hw.c

  553          info->ipv4_valid = cminfo->ipv4;
  554          ether_addr_copy(info->mac_addr, iwdev->netdev->dev_addr);
  555          info->qp_num = cpu_to_le32(dev->ilq->qp_id);
  556          info->dest_port = cpu_to_le16(cminfo->loc_port);
               ^^^^^^^^^^^^^^^

This is a u32 but we're storing a le16 in it which is problematic. The Sparse version of this check is more strict but has more false positives. Anyway, give it a whirl: https://lwn.net/Articles/205624/

  557          info->dest_ip[0] = cpu_to_le32(cminfo->loc_addr[0]);
  558          info->dest_ip[1] = cpu_to_le32(cminfo->loc_addr[1]);
  559          info->dest_ip[2] = cpu_to_le32(cminfo->loc_addr[2]);
  560          info->dest_ip[3] = cpu_to_le32(cminfo->loc_addr[3]);
  561          if (etype == I40IW_QHASH_TYPE_TCP_ESTABLISHED) {
  562                  info->src_port = cpu_to_le16(cminfo->rem_port);
  563                  info->src_ip[0] = cpu_to_le32(cminfo->rem_addr[0]);
  564                  info->src_ip[1] = cpu_to_le32(cminfo->rem_addr[1]);
  565                  info->src_ip[2] = cpu_to_le32(cminfo->rem_addr[2]);
  566                  info->src_ip[3] = cpu_to_le32(cminfo->rem_addr[3]);
Quoted 4 lines

567 }

regards,
dan carpenter

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html