1. 25 8月, 2012 3 次提交
    • B
      sfc: Simplify TSO header buffer allocation · f7251a9c
      Ben Hutchings 提交于
      TSO header buffers contain a control structure immediately followed by
      the packet headers, and are kept on a free list when not in use.  This
      complicates buffer management and tends to result in cache read misses
      when we recycle such buffers (particularly if DMA-coherent memory
      requires caches to be disabled).
      
      Replace the free list with a simple mapping by descriptor index.  We
      know that there is always a payload descriptor between any two
      descriptors with TSO header buffers, so we can allocate only one
      such buffer for each two descriptors.
      
      While we're at it, use a standard error code for allocation failure,
      not -1.
      Signed-off-by: NBen Hutchings <bhutchings@solarflare.com>
      f7251a9c
    • B
      sfc: Stop TX queues before they fill up · 14bf718f
      Ben Hutchings 提交于
      We now have a definite upper bound on the number of descriptors per
      skb; use that to stop the queue when the next packet might not fit.
      Signed-off-by: NBen Hutchings <bhutchings@solarflare.com>
      14bf718f
    • B
      sfc: Refactor struct efx_tx_buffer to use a flags field · 7668ff9c
      Ben Hutchings 提交于
      Add a flags field to struct efx_tx_buffer, replacing the
      continuation and map_single booleans.
      
      Since a single descriptor cannot be both a TSO header and the last
      descriptor for an skb, unionise efx_tx_buffer::{skb,tsoh} and add
      flags for validity of these fields.
      
      Clear all flags in free buffers (whereas previously the continuation
      flag would be set).
      Signed-off-by: NBen Hutchings <bhutchings@solarflare.com>
      7668ff9c
  2. 02 8月, 2012 1 次提交
    • B
      sfc: Fix maximum number of TSO segments and minimum TX queue size · 7e6d06f0
      Ben Hutchings 提交于
      Currently an skb requiring TSO may not fit within a minimum-size TX
      queue.  The TX queue selected for the skb may stall and trigger the TX
      watchdog repeatedly (since the problem skb will be retried after the
      TX reset).  This issue is designated as CVE-2012-3412.
      
      Set the maximum number of TSO segments for our devices to 100.  This
      should make no difference to behaviour unless the actual MSS is less
      than about 700.  Increase the minimum TX queue size accordingly to
      allow for 2 worst-case skbs, so that there will definitely be space
      to add an skb after we wake a queue.
      
      To avoid invalidating existing configurations, change
      efx_ethtool_set_ringparam() to fix up values that are too small rather
      than returning -EINVAL.
      Signed-off-by: NBen Hutchings <bhutchings@solarflare.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      7e6d06f0
  3. 20 7月, 2012 1 次提交
  4. 17 7月, 2012 10 次提交
  5. 11 7月, 2012 2 次提交
  6. 11 5月, 2012 1 次提交
    • J
      drivers/net: Convert compare_ether_addr to ether_addr_equal · 2e42e474
      Joe Perches 提交于
      Use the new bool function ether_addr_equal to add
      some clarity and reduce the likelihood for misuse
      of compare_ether_addr for sorting.
      
      Done via cocci script:
      
      $ cat compare_ether_addr.cocci
      @@
      expression a,b;
      @@
      -	!compare_ether_addr(a, b)
      +	ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	compare_ether_addr(a, b)
      +	!ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	!ether_addr_equal(a, b) == 0
      +	ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	!ether_addr_equal(a, b) != 0
      +	!ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	ether_addr_equal(a, b) == 0
      +	!ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	ether_addr_equal(a, b) != 0
      +	ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	!!ether_addr_equal(a, b)
      +	ether_addr_equal(a, b)
      Signed-off-by: NJoe Perches <joe@perches.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      2e42e474
  7. 10 5月, 2012 6 次提交
  8. 09 5月, 2012 1 次提交
    • B
      sfc: Fix division by zero when using one RX channel and no SR-IOV · 3132d282
      Ben Hutchings 提交于
      If RSS is disabled on the PF (efx->n_rx_channels == 1) we try to set
      up the indirection table so that VFs can use it, setting
      efx->rss_spread = efx_vf_size(efx).  But if SR-IOV was disabled at
      compile time, this evaluates to 0 and we end up dividing by zero when
      initialising the table.
      
      I considered changing the fallback definition of efx_vf_size() to
      return 1, but its value is really meaningless if we are not going to
      enable VFs.  Therefore add a condition of efx_sriov_wanted(efx) in
      efx_probe_interrupts().
      Signed-off-by: NBen Hutchings <bhutchings@solarflare.com>
      3132d282
  9. 27 3月, 2012 2 次提交
  10. 07 3月, 2012 10 次提交
  11. 25 2月, 2012 1 次提交
    • B
      sfc: Fix assignment of ip_summed for pre-allocated skbs · ff3bc1e7
      Ben Hutchings 提交于
      When pre-allocating skbs for received packets, we set ip_summed =
      CHECKSUM_UNNCESSARY.  We used to change it back to CHECKSUM_NONE when
      the received packet had an incorrect checksum or unhandled protocol.
      
      Commit bc8acf2c ('drivers/net: avoid
      some skb->ip_summed initializations') mistakenly replaced the latter
      assignment with a DEBUG-only assertion that ip_summed ==
      CHECKSUM_NONE.  This assertion is always false, but it seems no-one
      has exercised this code path in a DEBUG build.
      
      Fix this by moving our assignment of CHECKSUM_UNNECESSARY into
      efx_rx_packet_gro().
      Signed-off-by: NBen Hutchings <bhutchings@solarflare.com>
      ff3bc1e7
  12. 24 2月, 2012 1 次提交
  13. 23 2月, 2012 1 次提交