1. 27 Aug, 2019 14 commits
  2. 26 Aug, 2019 15 commits
    • Heiner Kallweit's avatar
      r8169: improve DMA handling in rtl_rx · 3c95e501
      Heiner Kallweit authored
      Move the call to dma_sync_single_for_cpu after calling napi_alloc_skb.
      This avoids calling dma_sync_single_for_cpu w/o handing control back
      to device if the memory allocation should fail.
      Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      3c95e501
    • David S. Miller's avatar
      Merge branch 'cls-hw-offload-rtnl' · 72991b56
      David S. Miller authored
      Vlad Buslov says:
      
      ====================
      Refactor cls hardware offload API to support rtnl-independent drivers
      
      Currently, all cls API hardware offloads driver callbacks require caller
      to hold rtnl lock when calling them. This patch set introduces new API
      that allows drivers to register callbacks that are not dependent on rtnl
      lock and unlocked classifiers to offload filters without obtaining rtnl
      lock first, which is intended to allow offloading tc rules in parallel.
      
      Recently, new rtnl registration flag RTNL_FLAG_DOIT_UNLOCKED was added.
      TC rule update handlers (RTM_NEWTFILTER, RTM_DELTFILTER, etc.) are
      already registered with this flag and only take rtnl lock when qdisc or
      classifier requires it. Classifiers can indicate that their ops
      callbacks don't require caller to hold rtnl lock by setting the
      TCF_PROTO_OPS_DOIT_UNLOCKED flag. Unlocked implementation of flower
      classifier is now upstreamed. However, this implementation still obtains
      rtnl lock before calling hardware offloads API.
      
      Implement following cls API changes:
      
      - Introduce new "unlocked_driver_cb" flag to struct flow_block_offload
        to allow registering and unregistering block hardware offload
        callbacks that do not require caller to hold rtnl lock. Drivers that
        doesn't require users of its tc offload callbacks to hold rtnl lock
        sets the flag to true on block bind/unbind. Internally tcf_block is
        extended with additional lockeddevcnt counter that is used to count
        number of devices that require rtnl lock that block is bound to. When
        this counter is zero, tc_setup_cb_*() functions execute callbacks
        without obtaining rtnl lock.
      
      - Extend cls API single hardware rule update tc_setup_cb_call() function
        with tc_setup_cb_add(), tc_setup_cb_replace(), tc_setup_cb_destroy()
        and tc_setup_cb_reoffload() functions. These new APIs are needed to
        move management of block offload counter, filter in hardware counter
        and flag from classifier implementations to cls API, which is now
        responsible for managing them in concurrency-safe manner. Access to
        cb_list from callback execution code is synchronized by obtaining new
        'cb_lock' rw_semaphore in read mode, which allows executing callbacks
        in parallel, but excludes any modifications of data from
        register/unregister code. tcf_block offloads counter type is changed
        to atomic integer to allow updating the counter concurrently.
      
      - Extend classifier ops with new ops->hw_add() and ops->hw_del()
        callbacks which are used to notify unlocked classifiers when filter is
        successfully added or deleted to hardware without releasing cb_lock.
        This is necessary to update classifier state atomically with callback
        list traversal and updating of all relevant counters and allows
        unlocked classifiers to synchronize with concurrent reoffload without
        requiring any changes to driver callback API implementations.
      
      New tc flow_action infrastructure is also modified to allow its user to
      execute without rtnl lock protection. Function tc_setup_flow_action() is
      modified to conditionally obtain rtnl lock before accessing action
      state. Action data that is accessed by reference is either copied or
      reference counted to prevent concurrent action overwrite from
      deallocating it. New function tc_cleanup_flow_action() is introduced to
      cleanup/release all such data obtained by tc_setup_flow_action().
      
      Flower classifier (only unlocked classifier at the moment) is modified
      to use new cls hardware offloads API and no longer obtains rtnl lock
      before calling it.
      ====================
      Acked-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      72991b56
    • Vlad Buslov's avatar
      net: sched: flower: don't take rtnl lock for cls hw offloads API · 918190f5
      Vlad Buslov authored
      Don't manually take rtnl lock in flower classifier before calling cls
      hardware offloads API. Instead, pass rtnl lock status via 'rtnl_held'
      parameter.
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      918190f5
    • Vlad Buslov's avatar
      net: sched: copy tunnel info when setting flow_action entry->tunnel · 1444c175
      Vlad Buslov authored
      In order to remove dependency on rtnl lock, modify tc_setup_flow_action()
      to copy tunnel info, instead of just saving pointer to tunnel_key action
      tunnel info. This is necessary to prevent concurrent action overwrite from
      releasing tunnel info while it is being used by rtnl-unlocked driver.
      
      Implement helper tcf_tunnel_info_copy() that is used to copy tunnel info
      with all its options to dynamically allocated memory block. Modify
      tc_cleanup_flow_action() to free dynamically allocated tunnel info.
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      1444c175
    • Vlad Buslov's avatar
      net: sched: take reference to action dev before calling offloads · 5a6ff4b1
      Vlad Buslov authored
      In order to remove dependency on rtnl lock when calling hardware offload
      API, take reference to action mirred dev when initializing flow_action
      structure in tc_setup_flow_action(). Implement function
      tc_cleanup_flow_action(), use it to release the device after hardware
      offload API is done using it.
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5a6ff4b1
    • Vlad Buslov's avatar
      net: sched: take rtnl lock in tc_setup_flow_action() · 9838b20a
      Vlad Buslov authored
      In order to allow using new flow_action infrastructure from unlocked
      classifiers, modify tc_setup_flow_action() to accept new 'rtnl_held'
      argument. Take rtnl lock before accessing tc_action data. This is necessary
      to protect from concurrent action replace.
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      9838b20a
    • Vlad Buslov's avatar
      net: sched: conditionally obtain rtnl lock in cls hw offloads API · 11bd634d
      Vlad Buslov authored
      In order to remove dependency on rtnl lock from offloads code of
      classifiers, take rtnl lock conditionally before executing driver
      callbacks. Only obtain rtnl lock if block is bound to devices that require
      it.
      
      Block bind/unbind code is rtnl-locked and obtains block->cb_lock while
      holding rtnl lock. Obtain locks in same order in tc_setup_cb_*() functions
      to prevent deadlock.
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      11bd634d
    • Vlad Buslov's avatar
      net: sched: add API for registering unlocked offload block callbacks · c9f14470
      Vlad Buslov authored
      Extend struct flow_block_offload with "unlocked_driver_cb" flag to allow
      registering and unregistering block hardware offload callbacks that do not
      require caller to hold rtnl lock. Extend tcf_block with additional
      lockeddevcnt counter that is incremented for each non-unlocked driver
      callback attached to device. This counter is necessary to conditionally
      obtain rtnl lock before calling hardware callbacks in following patches.
      
      Register mlx5 tc block offload callbacks as "unlocked".
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c9f14470
    • Vlad Buslov's avatar
      net: sched: notify classifier on successful offload add/delete · a449a3e7
      Vlad Buslov authored
      To remove dependency on rtnl lock, extend classifier ops with new
      ops->hw_add() and ops->hw_del() callbacks. Call them from cls API while
      holding cb_lock every time filter if successfully added to or deleted from
      hardware.
      
      Implement the new API in flower classifier. Use it to manage hw_filters
      list under cb_lock protection, instead of relying on rtnl lock to
      synchronize with concurrent fl_reoffload() call.
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a449a3e7
    • Vlad Buslov's avatar
      net: sched: refactor block offloads counter usage · 40119211
      Vlad Buslov authored
      Without rtnl lock protection filters can no longer safely manage block
      offloads counter themselves. Refactor cls API to protect block offloadcnt
      with tcf_block->cb_lock that is already used to protect driver callback
      list and nooffloaddevcnt counter. The counter can be modified by concurrent
      tasks by new functions that execute block callbacks (which is safe with
      previous patch that changed its type to atomic_t), however, block
      bind/unbind code that checks the counter value takes cb_lock in write mode
      to exclude any concurrent modifications. This approach prevents race
      conditions between bind/unbind and callback execution code but allows for
      concurrency for tc rule update path.
      
      Move block offload counter, filter in hardware counter and filter flags
      management from classifiers into cls hardware offloads API. Make functions
      tcf_block_offload_{inc|dec}() and tc_cls_offload_cnt_update() to be cls API
      private. Implement following new cls API to be used instead:
      
        tc_setup_cb_add() - non-destructive filter add. If filter that wasn't
        already in hardware is successfully offloaded, increment block offloads
        counter, set filter in hardware counter and flag. On failure, previously
        offloaded filter is considered to be intact and offloads counter is not
        decremented.
      
        tc_setup_cb_replace() - destructive filter replace. Release existing
        filter block offload counter and reset its in hardware counter and flag.
        Set new filter in hardware counter and flag. On failure, previously
        offloaded filter is considered to be destroyed and offload counter is
        decremented.
      
        tc_setup_cb_destroy() - filter destroy. Unconditionally decrement block
        offloads counter.
      
        tc_setup_cb_reoffload() - reoffload filter to single cb. Execute cb() and
        call tc_cls_offload_cnt_update() if cb() didn't return an error.
      
      Refactor all offload-capable classifiers to atomically offload filters to
      hardware, change block offload counter, and set filter in hardware counter
      and flag by means of the new cls API functions.
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      40119211
    • Vlad Buslov's avatar
      net: sched: change tcf block offload counter type to atomic_t · 97394bef
      Vlad Buslov authored
      As a preparation for running proto ops functions without rtnl lock, change
      offload counter type to atomic. This is necessary to allow updating the
      counter by multiple concurrent users when offloading filters to hardware
      from unlocked classifiers.
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      97394bef
    • Vlad Buslov's avatar
      net: sched: protect block offload-related fields with rw_semaphore · 4f8116c8
      Vlad Buslov authored
      In order to remove dependency on rtnl lock, extend tcf_block with 'cb_lock'
      rwsem and use it to protect flow_block->cb_list and related counters from
      concurrent modification. The lock is taken in read mode for read-only
      traversal of cb_list in tc_setup_cb_call() and write mode in all other
      cases. This approach ensures that:
      
      - cb_list is not changed concurrently while filters is being offloaded on
        block.
      
      - block->nooffloaddevcnt is checked while holding the lock in read mode,
        but is only changed by bind/unbind code when holding the cb_lock in write
        mode to prevent concurrent modification.
      Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
      Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      4f8116c8
    • YueHaibing's avatar
      cirrus: cs89x0: remove set but not used variable 'lp' · 0846e161
      YueHaibing authored
      Fixes gcc '-Wunused-but-set-variable' warning:
      
      drivers/net/ethernet/cirrus/cs89x0.c: In function 'cs89x0_platform_probe':
      drivers/net/ethernet/cirrus/cs89x0.c:1847:20: warning:
       variable 'lp' set but not used [-Wunused-but-set-variable]
      Reported-by: default avatarHulk Robot <hulkci@huawei.com>
      Fixes: 6751edeb ("cirrus: cs89x0: Use managed interfaces")
      Signed-off-by: default avatarYueHaibing <yuehaibing@huawei.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      0846e161
    • David S. Miller's avatar
      Revert "net: mediatek: remove set but not used variable 'status'" · 28894564
      David S. Miller authored
      This reverts commit ee641b0c.
      
      Actually it is not clear whether this register read is not
      needed for it's HW side effects or not.
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      28894564
    • Mao Wenan's avatar
      net: mediatek: remove set but not used variable 'status' · ee641b0c
      Mao Wenan authored
      Fixes gcc '-Wunused-but-set-variable' warning:
      drivers/net/ethernet/mediatek/mtk_eth_soc.c: In function mtk_handle_irq:
      drivers/net/ethernet/mediatek/mtk_eth_soc.c:1951:6: warning: variable status set but not used [-Wunused-but-set-variable]
      
      Fixes: 296c9120 ("net: ethernet: mediatek: Add MT7628/88 SoC support")
      Signed-off-by: default avatarMao Wenan <maowenan@huawei.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      ee641b0c
  3. 25 Aug, 2019 1 commit
  4. 24 Aug, 2019 10 commits
    • David S. Miller's avatar
      Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue · a914a841
      David S. Miller authored
      Jeff Kirsher says:
      
      ====================
      100GbE Intel Wired LAN Driver Updates 2019-08-23
      
      This series contains updates to ice driver only.
      
      Dave adds logic for the necessary bits to be set in the VSI context for
      the PF_VSI and the TX_descriptors for control packets egressing the
      PF_VSI.  Updated the logic to detect both DCBx and LLDP states in the
      firmware engine to account for situations where DCBx is enabled and LLDP
      is disabled.  Fixed the driver to treat the DCBx state of "NOT_STARTED"
      as a valid state and should not assume "is_fw_lldp" true automatically.
      Since "enable-fw-lldp" flag was confusing and cumbersome, change the
      flag to "fw-lldp-agent" with a value of on or off to help clarify
      whether the LLDP agent is running or not.
      
      Brett fixes an issue where synchronize_irq() was being called from the
      host of VF's, which should not be done.
      
      Michal fixed an issue when rebuilding the DCBx configuration while in
      IEEE mode versus CEE mode, so add a check before copying the
      configuration value to ensure we are only in CEE mode.
      
      Jake fixes the PF to reject any VF request to setup head writeback since
      the support has been deprecated.
      
      Mitch adds an additional check to ensure the VF is active before sending
      out an error message that a message was unable to be sent to a
      particular VF.
      
      Chinh updates the driver to use "topology" mode when checking the PHY
      for status, since this mode provides us the current module type that is
      available.  Fixes the driver from clearing the auto_fec_enable bit which
      was blocking a user from forcing non-spec compliant FEC configurations.
      
      Amruth does a refactor on the code to first check, then assign in the
      virtual channel space.
      
      Bruce updates the driver to actually update the stats when a user runs
      the ethtool command 'ethtool -S <iface>' instead of providing a snapshot
      of the stats that maybe from a second ago.
      
      Akeem fixes up the adding/removing of VSI MAC filters for VFs, so that
      VFs cannot add/remove a filter from another VSI.  We now track the
      number of filters added right from when the VF resources get allocated
      and won't get into MAC filter mis-match issue in the switch.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a914a841
    • David S. Miller's avatar
      Merge branch 's390-qeth-next' · ace4cede
      David S. Miller authored
      Julian Wiedmann says:
      
      ====================
      s390/qeth: updates 2019-08-23
      
      please apply one more round of qeth patches. These implement support for
      a bunch of TX-related features - namely TX NAPI, BQL and xmit_more.
      
      Note that this includes two qdio patches which lay the necessary
      groundwork, and have been acked by Vasily.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      ace4cede
    • Julian Wiedmann's avatar
      s390/qeth: add xmit_more support for IQD devices · 9549d70a
      Julian Wiedmann authored
      IQD devices offer limited support for bulking: all frames in a TX buffer
      need to have the same target. qeth_iqd_may_bulk() implements this
      constraint, and allows us to defer the TX doorbell until
      (a) the buffer is full (since each buffer needs its own doorbell), or
      (b) the entire TX queue is full, or
      (b) we reached the BQL limit.
      Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      9549d70a
    • Julian Wiedmann's avatar
      s390/qeth: add BQL support for IQD devices · 96bd6c94
      Julian Wiedmann authored
      Each TX buffer may contain multiple skbs. So just accumulate the sent
      byte count in the buffer struct, and later use the same count when
      completing the buffer.
      Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      96bd6c94
    • Julian Wiedmann's avatar
      s390/qeth: when in TX NAPI mode, use napi_consume_skb() · 85e537d8
      Julian Wiedmann authored
      This allows the stack to bulk-free our TX-completed skbs.
      Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      85e537d8
    • Julian Wiedmann's avatar
      s390/qeth: add TX NAPI support for IQD devices · e53edf74
      Julian Wiedmann authored
      Due to their large MTU and potentially low utilization of TX buffers,
      IQD devices in particular require fast TX recycling. This makes them
      a prime candidate for a TX NAPI path in qeth.
      
      qeth_tx_poll() uses the recently introduced qdio_inspect_queue() helper
      to poll the TX queue for completed buffers. To avoid hogging the CPU for
      too long, we yield to the stack after completing an entire queue's worth
      of buffers.
      While IQD is expected to transfer its buffers synchronously (and thus
      doesn't support TX interrupts), a timer covers for the odd case where a
      TX buffer doesn't complete synchronously. Currently this timer should
      only ever fire for
      (1) the mcast queue,
      (2) the occasional race, where the NAPI poll code observes an update to
          queue->used_buffers while the TX doorbell hasn't been issued yet.
      Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e53edf74
    • Julian Wiedmann's avatar
      s390/qeth: collect accurate TX statistics · eeac0e20
      Julian Wiedmann authored
      This consolidates the SW statistics code, and improves it to
      (1) account for the header overhead of each segment on a TSO skb,
      (2) count dangling packets as in-error (during eg. shutdown), and
      (3) only count offloads when the skb was successfully transmitted.
      
      We also count each segment of an TSO skb as one packet - except for
      tx_dropped, to be consistent with dev->tx_dropped.
      Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      eeac0e20
    • Julian Wiedmann's avatar
      s390/qdio: let drivers opt-out from Output Queue scanning · 313dc689
      Julian Wiedmann authored
      If a driver wants to use the new Output Queue poll code, then the qdio
      layer must disable its internal Queue scanning. Let the driver select
      this mode by passing a special scan_threshold of 0.
      
      As the scan_threshold is the same for all Output Queues, also move it
      into the main qdio_irq struct. This allows for fast opt-out checking, a
      driver is expected to operate either _all_ or none of its Output Queues
      in polling mode.
      Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
      Acked-by: default avatarVasily Gorbik <gor@linux.ibm.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      313dc689
    • Julian Wiedmann's avatar
      s390/qdio: enable drivers to poll for Output completions · 7c47f5af
      Julian Wiedmann authored
      While commit d36deae7 ("qdio: extend API to allow polling") enhanced
      the qdio layer so that drivers can poll their Input Queues, we don't
      have the corresponding infrastructure for Output Queues yet.
      
      Factor out a helper that scans a single QDIO Queue, so that qeth can
      implement TX NAPI on top of it.
      While doing so, remove the duplicated tracking of the next-to-scan index
      (q->first_to_check vs q->first_to_kick) in this code path.
      
      qdio_handle_aobs() needs to move slightly upwards in the code hierarchy,
      so that it's still called from the polling path.
      Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
      Acked-by: default avatarVasily Gorbik <gor@linux.ibm.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      7c47f5af
    • Michael Chan's avatar
      bnxt_en: Fix allocation of zero statistics block size regression. · fbbdbc64
      Michael Chan authored
      Recent commit added logic to determine the appropriate statistics block
      size to allocate and the size is stored in bp->hw_ring_stats_size.  But
      if the firmware spec is older than 1.6.0, it is 0 and not initialized.
      This causes the allocation to fail with size 0 and bnxt_open() to
      abort.  Fix it by always initializing bp->hw_ring_stats_size to the
      legacy default size value.
      
      Fixes: 4e748506 ("bnxt_en: Allocate the larger per-ring statistics block for 57500 chips.")
      Reported-by: default avatarJonathan Lemon <jonathan.lemon@gmail.com>
      Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
      Tested-by: default avatarJonathan Lemon <jonathan.lemon@gmail.com>
      Acked-by: default avatarJonathan Lemon <jonathan.lemon@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      fbbdbc64