[Intel-wired-lan] [bug report] ice: Add support for VSI allocation and deallocation

Venkataramanan, Anirudh anirudh.venkataramanan at intel.com
Tue Apr 17 16:06:02 UTC 2018


On Fri, 2018-04-13 at 15:38 +0300, Dan Carpenter wrote:
> [ These are unpublished Smatch warnings because they're often false
>   positives.  I'm reviewing these and I'm like 80% some are false
>   positivies, but then I get to others and it feels 80% like they
> look
>   buggy.  And in the end I don't know the code very well so I'm just
>   going to forward all of them.  -- dan ]
> 
> Hello Anirudh Venkataramanan,
> 
> The patch 3a858ba392c3: "ice: Add support for VSI allocation and
> deallocation" from Mar 20, 2018, leads to the following static
> checker warning:
> 
>     drivers/net/ethernet/intel/ice/ice_main.c:1360
> ice_set_dflt_vsi_ctx() warn: odd binop '0x0 & 0x18'
> 
> drivers/net/ethernet/intel/ice/ice_main.c
>   1344  static void ice_set_dflt_vsi_ctx(struct ice_vsi_ctx *ctxt)
>   1345  {
>   1346          u32 table = 0;
>   1347  
>   1348          memset(&ctxt->info, 0, sizeof(ctxt->info));
>   1349          /* VSI's should be allocated from shared pool */
>   1350          ctxt->alloc_from_pool = true;
>   1351          /* Src pruning enabled by default */
>   1352          ctxt->info.sw_flags = ICE_AQ_VSI_SW_FLAG_SRC_PRUNE;
>   1353          /* Traffic from VSI can be sent to LAN */
>   1354          ctxt->info.sw_flags2 = ICE_AQ_VSI_SW_FLAG_LAN_ENA;
>   1355          /* Allow all packets untagged/tagged */
>   1356          ctxt->info.port_vlan_flags =
> ((ICE_AQ_VSI_PVLAN_MODE_ALL &
>  
> 1357                                         ICE_AQ_VSI_PVLAN_MODE_M)
> >>
>  
> 1358                                        ICE_AQ_VSI_PVLAN_MODE_S);
>   1359          /* Show VLAN/UP from packets in Rx descriptors */
>   1360          ctxt->info.port_vlan_flags |=
> ((ICE_AQ_VSI_PVLAN_EMOD_STR_BOTH &
>  
> 1361                                          ICE_AQ_VSI_PVLAN_EMOD_M
> ) >>
> 
> This probably should be | instead of &.
> 
>  
> 1362                                         ICE_AQ_VSI_PVLAN_EMOD_S)
> ;
>   1363          /* Have 1:1 UP mapping for both ingress/egress tables
> */
>   1364          table |= ICE_UP_TABLE_TRANSLATE(0, 0);
>   1365          table |= ICE_UP_TABLE_TRANSLATE(1, 1);
>   1366          table |= ICE_UP_TABLE_TRANSLATE(2, 2);
>   1367          table |= ICE_UP_TABLE_TRANSLATE(3, 3);
>   1368          table |= ICE_UP_TABLE_TRANSLATE(4, 4);
>   1369          table |= ICE_UP_TABLE_TRANSLATE(5, 5);
>   1370          table |= ICE_UP_TABLE_TRANSLATE(6, 6);
>   1371          table |= ICE_UP_TABLE_TRANSLATE(7, 7);
>   1372          ctxt->info.ingress_table = cpu_to_le32(table);
>   1373          ctxt->info.egress_table = cpu_to_le32(table);
>   1374          /* Have 1:1 UP mapping for outer to inner UP table */
>   1375          ctxt->info.outer_up_table = cpu_to_le32(table);
>   1376          /* No Outer tag support outer_tag_flags remains to
> zero */
>   1377  }
> 
>     drivers/net/ethernet/intel/ice/ice_main.c:2066
> ice_req_irq_msix_misc() warn: odd binop '0x0 & 0x1800'
>     drivers/net/ethernet/intel/ice/ice_main.c:2072
> ice_req_irq_msix_misc() warn: odd binop '0x0 & 0x1800'
> 
> drivers/net/ethernet/intel/ice/ice_main.c
>   2058                  ice_free_res(pf->irq_tracker, 1,
> ICE_RES_MISC_VEC_ID);
>   2059                  return err;
>   2060          }
>   2061  
>   2062  skip_req_irq:
>   2063          ice_ena_misc_vector(pf);
>   2064  
>   2065          val = (pf->oicr_idx & PFINT_OICR_CTL_MSIX_INDX_M) |
>   2066                (ICE_RX_ITR & PFINT_OICR_CTL_ITR_INDX_M) |
>                        ^^^^^^^^^^
> This is 0.  I had no idea what was intended here.  Possibly this is
> fine?
> 
>   2067                PFINT_OICR_CTL_CAUSE_ENA_M;
>   2068          wr32(hw, PFINT_OICR_CTL, val);
>   2069  
>   2070          /* This enables Admin queue Interrupt causes */
>   2071          val = (pf->oicr_idx & PFINT_FW_CTL_MSIX_INDX_M) |
>   2072                (ICE_RX_ITR & PFINT_FW_CTL_ITR_INDX_M) |
>                        ^^^^^^^^^^
> Same.
> 
>   2073                PFINT_FW_CTL_CAUSE_ENA_M;
>   2074          wr32(hw, PFINT_FW_CTL, val);
>   2075  
>   2076          itr_gran = hw->itr_gran_200;
>   2077  
>   2078          wr32(hw, GLINT_ITR(ICE_RX_ITR, pf->oicr_idx),
>   2079               ITR_TO_REG(ICE_ITR_8K, itr_gran));
>   2080  
>   2081          ice_flush(hw);
>   2082          ice_irq_dynamic_ena(hw, NULL, NULL);
>   2083  
>   2084          return 0;
>   2085  }
> 
> drivers/net/ethernet/intel/ice/ice_common.c:1612
> __ice_aq_get_set_rss_lut() warn: odd binop '0x0 & 0xc'
> 
> drivers/net/ethernet/intel/ice/ice_common.c
>   1608  
>   1609          /* LUT size is only valid for Global and PF table
> types */
>   1610          if (lut_size == ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_128)
> {
>   1611                  flags |=
> (ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_128_FLAG <<
>                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> ^^^^^
> This is zero.  I'm going to say it looks intentional.   (Feel free to
> ignore these false positives.  Never change the code just to please
> the
> static checker).
> 
>   1612                            ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_S)
> &
>   1613                           ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_M;
>   1614          } else if (lut_size ==
> ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_512) {
>   1615                  flags |=
> (ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_512_FLAG <<
>   1616                            ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_S)
> &
>   1617                           ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_M;
>   1618          } else if ((lut_size ==
> ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_2K) &&
>   1619                     (lut_type ==
> ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF)) {
>   1620                  flags |=
> (ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_2K_FLAG <<
>   1621                            ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_S)
> &
>   1622                           ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_M;
>   1623          } else {
>   1624                  status = ICE_ERR_PARAM;
>   1625                  goto ice_aq_get_set_rss_lut_exit;
>   1626          }
>   1627  
> 
> drivers/net/ethernet/intel/ice/ice_switch.c:648 ice_add_marker_act()
> warn: odd binop '0x380000 & 0x7fff8'
> drivers/net/ethernet/intel/ice/ice_switch.c:655 ice_add_marker_act()
> warn: odd binop '0x0 & 0x7fff8'
> 
> drivers/net/ethernet/intel/ice/ice_switch.c
>    635          act = ICE_LG_ACT_VSI_FORWARDING |
> ICE_LG_ACT_VALID_BIT;
>    636          act |= (vsi_info << ICE_LG_ACT_VSI_LIST_ID_S) &
>    637                  ICE_LG_ACT_VSI_LIST_ID_M;
>    638          if (m_ent->vsi_count > 1)
>    639                  act |= ICE_LG_ACT_VSI_LIST;
>    640          lg_act->pdata.lg_act.act[0] = cpu_to_le32(act);
>    641  
>    642          /* Second action descriptor type */
>    643          act = ICE_LG_ACT_GENERIC;
>    644  
>    645          act |= (1 << ICE_LG_ACT_GENERIC_VALUE_S) &
> ICE_LG_ACT_GENERIC_VALUE_M;
>    646          lg_act->pdata.lg_act.act[1] = cpu_to_le32(act);
>    647  
>    648          act = (7 << ICE_LG_ACT_GENERIC_OFFSET_S) &
> ICE_LG_ACT_GENERIC_VALUE_M;
>                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> ^^^^^^^^^^^^^^^^
> This feels buggy, but I have no idea what was intended.
> 
>    649  
>    650          /* Third action Marker value */
>    651          act |= ICE_LG_ACT_GENERIC;
>    652          act |= (sw_marker << ICE_LG_ACT_GENERIC_VALUE_S) &
>    653                  ICE_LG_ACT_GENERIC_VALUE_M;
>    654  
>    655          act |= (0 << ICE_LG_ACT_GENERIC_OFFSET_S) &
> ICE_LG_ACT_GENERIC_VALUE_M;
>                         ^
> 
> Obviously intended, but I feel like the literal 0 doesn't add
> anything
> in terms of making it more readable...
> 
>    656          lg_act->pdata.lg_act.act[2] = cpu_to_le32(act);
>    657  
>    658          /* call the fill switch rule to fill the lookup tx rx
> structure */
>    659          ice_fill_sw_rule(hw, &m_ent->fltr_info, rx_tx,
>    660                           ice_aqc_opc_update_sw_rules);
>    661  
>    662          /* Update the action to point to the large action id
> */
>    663          rx_tx->pdata.lkup_tx_rx.act =
>    664                  cpu_to_le32(ICE_SINGLE_ACT_PTR |
>    665                              ((l_id <<
> ICE_SINGLE_ACT_PTR_VAL_S) &
>    666                               ICE_SINGLE_ACT_PTR_VAL_M));
> 
> regards,
> dan carpenter

Thanks for reporting, Dan. I am looking into this.

- Ani
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3302 bytes
Desc: not available
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20180417/0608565a/attachment.bin>


More information about the Intel-wired-lan mailing list