1. 01 8月, 2020 2 次提交
  2. 28 5月, 2020 1 次提交
  3. 23 5月, 2020 2 次提交
  4. 22 5月, 2020 2 次提交
  5. 20 2月, 2020 1 次提交
  6. 13 2月, 2020 1 次提交
  7. 04 1月, 2020 1 次提交
  8. 05 11月, 2019 6 次提交
  9. 21 8月, 2019 1 次提交
  10. 24 5月, 2019 2 次提交
  11. 02 5月, 2019 1 次提交
  12. 18 4月, 2019 2 次提交
  13. 27 3月, 2019 3 次提交
  14. 26 3月, 2019 2 次提交
  15. 20 3月, 2019 1 次提交
  16. 16 1月, 2019 2 次提交
  17. 07 11月, 2018 1 次提交
    • B
      ice: Fix tx_timeout in PF driver · c585ea42
      Brett Creeley 提交于
      Prior to this commit the driver was running into tx_timeouts when a
      queue was stressed enough. This was happening because the HW tail
      and SW tail (NTU) were incorrectly out of sync. Consequently this was
      causing the HW head to collide with the HW tail, which to the hardware
      means that all descriptors posted for Tx have been processed.
      
      Due to the Tx logic used in the driver SW tail and HW tail are allowed
      to be out of sync. This is done as an optimization because it allows the
      driver to write HW tail as infrequently as possible, while still
      updating the SW tail index to keep track. However, there are situations
      where this results in the tail never getting updated, resulting in Tx
      timeouts.
      
      Tx HW tail write condition:
      	if (netif_xmit_stopped(txring_txq(tx_ring) || !skb->xmit_more)
      		writel(sw_tail, tx_ring->tail);
      
      An issue was found in the Tx logic that was causing the afore mentioned
      condition for updating HW tail to never happen, causing tx_timeouts.
      
      In ice_xmit_frame_ring we calculate how many descriptors we need for the
      Tx transaction based on the skb the kernel hands us. This is then passed
      into ice_maybe_stop_tx along with some extra padding to determine if we
      have enough descriptors available for this transaction. If we don't then
      we return -EBUSY to the stack, otherwise we move on and eventually
      prepare the Tx descriptors accordingly in ice_tx_map and set
      next_to_watch. In ice_tx_map we make another call to ice_maybe_stop_tx
      with a value of MAX_SKB_FRAGS + 4. The key here is that this value is
      possibly less than the value we sent in the first call to
      ice_maybe_stop_tx in ice_xmit_frame_ring. Now, if the number of unused
      descriptors is between MAX_SKB_FRAGS + 4 and the value used in the first
      call to ice_maybe_stop_tx in ice_xmit_frame_ring then we do not update
      the HW tail because of the "Tx HW tail write condition" above. This is
      because in ice_maybe_stop_tx we return success from ice_maybe_stop_tx
      instead of calling __ice_maybe_stop_tx and subsequently calling
      netif_stop_subqueue, which sets the __QUEUE_STATE_DEV_XOFF bit. This
      bit is then checked in the "Tx HW tail write condition" by calling
      netif_xmit_stopped and subsequently updating HW tail if the
      afore mentioned bit is set.
      
      In ice_clean_tx_irq, if next_to_watch is not NULL, we end up cleaning
      the descriptors that HW sets the DD bit on and we have the budget. The
      HW head will eventually run into the HW tail in response to the
      description in the paragraph above.
      
      The next time through ice_xmit_frame_ring we make the initial call to
      ice_maybe_stop_tx with another skb from the stack. This time we do not
      have enough descriptors available and we return NETDEV_TX_BUSY to the
      stack and end up setting next_to_watch to NULL.
      
      This is where we are stuck. In ice_clean_tx_irq we never clean anything
      because next_to_watch is always NULL and in ice_xmit_frame_ring we never
      update HW tail because we already return NETDEV_TX_BUSY to the stack and
      eventually we hit a tx_timeout.
      
      This issue was fixed by making sure that the second call to
      ice_maybe_stop_tx in ice_tx_map is passed a value that is >= the value
      that was used on the initial call to ice_maybe_stop_tx in
      ice_xmit_frame_ring. This was done by adding the following defines to
      make the logic more clear and to reduce the chance of mucking this up
      again:
      
      ICE_CACHE_LINE_BYTES		64
      ICE_DESCS_PER_CACHE_LINE	(ICE_CACHE_LINE_BYTES / \
      				 sizeof(struct ice_tx_desc))
      ICE_DESCS_FOR_CTX_DESC		1
      ICE_DESCS_FOR_SKB_DATA_PTR	1
      
      The ICE_CACHE_LINE_BYTES being 64 is an assumption being made so we
      don't have to figure this out on every pass through the Tx path. Instead
      I added a sanity check in ice_probe to verify cache line size and print
      a message if it's not 64 Bytes. This will make it easier to file issues
      if they are seen when the cache line size is not 64 Bytes when reading
      from the GLPCI_CNF2 register.
      Signed-off-by: NBrett Creeley <brett.creeley@intel.com>
      Signed-off-by: NAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
      Tested-by: NAndrew Bowers <andrewx.bowers@intel.com>
      Signed-off-by: NJeff Kirsher <jeffrey.t.kirsher@intel.com>
      c585ea42
  18. 03 10月, 2018 1 次提交
    • B
      ice: Add more flexibility on how we assign an ITR index · d2b464a7
      Brett Creeley 提交于
      This issue came about when looking at the VF function
      ice_vc_cfg_irq_map_msg. Currently we are assigning the itr_setting value
      to the itr_idx received from the AVF driver, which is not correct and is
      not used for the VF flow anyway. Currently the only way we set the ITR
      index for both the PF and VF driver is by hard coding ICE_TX_ITR or
      ICE_RX_ITR for the ITR index on each q_vector.
      
      To fix this, add the member itr_idx in struct ice_ring_container. This
      can then be used to dynamically program the correct ITR index. This change
      also affected the PF driver so make the necessary changes there as well.
      
      Also, removed the itr_setting member in struct ice_ring because it is not
      being used meaningfully and is going to be removed in a future patch that
      includes dynamic ITR.
      
      On another note, this will be useful moving forward if we decide to split
      Rx/Tx rings on different q_vectors instead of sharing them as queue pairs.
      Signed-off-by: NBrett Creeley <brett.creeley@intel.com>
      Signed-off-by: NAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
      Tested-by: NAndrew Bowers <andrewx.bowers@intel.com>
      Signed-off-by: NJeff Kirsher <jeffrey.t.kirsher@intel.com>
      d2b464a7
  19. 02 10月, 2018 1 次提交
    • B
      ice: Add support for dynamic interrupt moderation · 9e4ab4c2
      Brett Creeley 提交于
      Currently there is no support for dynamic interrupt moderation. This
      patch adds some initial code to support this. The following changes
      were made:
      
      1. Currently we are using multiple members to store the interrupt
         granularity (itr_gran_25/50/100/200). This is not necessary because
         we can query the device to determine what the interrupt granularity
         should be set to, done by a new function ice_get_itr_intrl_gran.
      
      2. Added intrl to ice_q_vector structure to support interrupt rate
         limiting.
      
      3. Added the function ice_intrl_usecs_to_reg for converting to a value
         in usecs that the device understands.
      
      4. Added call to write to the GLINT_RATE register. Disable intrl by
         default for now.
      
      5. Changed rx/tx_itr_setting to itr_setting because having both seems
         redundant because a ring is either Tx or Rx.
      
      6. Initialize itr_setting for both Tx/Rx rings in ice_vsi_alloc_rings()
      Signed-off-by: NBrett Creeley <brett.creeley@intel.com>
      Signed-off-by: NAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
      Tested-by: NAndrew Bowers <andrewx.bowers@intel.com>
      Signed-off-by: NJeff Kirsher <jeffrey.t.kirsher@intel.com>
      9e4ab4c2
  20. 29 8月, 2018 1 次提交
  21. 24 8月, 2018 1 次提交
  22. 27 3月, 2018 5 次提交