1. 04 1月, 2015 8 次提交
    • T
      rhashtable: Supports for nulls marker · f89bd6f8
      Thomas Graf 提交于
      In order to allow for wider usage of rhashtable, use a special nulls
      marker to terminate each chain. The reason for not using the existing
      nulls_list is that the prev pointer usage would not be valid as entries
      can be linked in two different buckets at the same time.
      
      The 4 nulls base bits can be set through the rhashtable_params structure
      like this:
      
      struct rhashtable_params params = {
              [...]
              .nulls_base = (1U << RHT_BASE_SHIFT),
      };
      
      This reduces the hash length from 32 bits to 27 bits.
      Signed-off-by: NThomas Graf <tgraf@suug.ch>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f89bd6f8
    • T
      rhashtable: Per bucket locks & deferred expansion/shrinking · 97defe1e
      Thomas Graf 提交于
      Introduces an array of spinlocks to protect bucket mutations. The number
      of spinlocks per CPU is configurable and selected based on the hash of
      the bucket. This allows for parallel insertions and removals of entries
      which do not share a lock.
      
      The patch also defers expansion and shrinking to a worker queue which
      allows insertion and removal from atomic context. Insertions and
      deletions may occur in parallel to it and are only held up briefly
      while the particular bucket is linked or unzipped.
      
      Mutations of the bucket table pointer is protected by a new mutex, read
      access is RCU protected.
      
      In the event of an expansion or shrinking, the new bucket table allocated
      is exposed as a so called future table as soon as the resize process
      starts.  Lookups, deletions, and insertions will briefly use both tables.
      The future table becomes the main table after an RCU grace period and
      initial linking of the old to the new table was performed. Optimization
      of the chains to make use of the new number of buckets follows only the
      new table is in use.
      
      The side effect of this is that during that RCU grace period, a bucket
      traversal using any rht_for_each() variant on the main table will not see
      any insertions performed during the RCU grace period which would at that
      point land in the future table. The lookup will see them as it searches
      both tables if needed.
      
      Having multiple insertions and removals occur in parallel requires nelems
      to become an atomic counter.
      Signed-off-by: NThomas Graf <tgraf@suug.ch>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      97defe1e
    • T
      spinlock: Add spin_lock_bh_nested() · 113948d8
      Thomas Graf 提交于
      Signed-off-by: NThomas Graf <tgraf@suug.ch>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      113948d8
    • T
      nft_hash: Remove rhashtable_remove_pprev() · 897362e4
      Thomas Graf 提交于
      The removal function of nft_hash currently stores a reference to the
      previous element during lookup which is used to optimize removal later
      on. This was possible because a lock is held throughout calling
      rhashtable_lookup() and rhashtable_remove().
      
      With the introdution of deferred table resizing in parallel to lookups
      and insertions, the nftables lock will no longer synchronize all
      table mutations and the stored pprev may become invalid.
      
      Removing this optimization makes removal slightly more expensive on
      average but allows taking the resize cost out of the insert and
      remove path.
      Signed-off-by: NThomas Graf <tgraf@suug.ch>
      Cc: netfilter-devel@vger.kernel.org
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      897362e4
    • T
      rhashtable: Factor out bucket_tail() function · b8e1943e
      Thomas Graf 提交于
      Subsequent patches will require access to the bucket tail. Access
      to the tail is relatively cheap as the automatic resizing of the
      table should keep the number of entries per bucket to no more
      than 0.75 on average.
      Signed-off-by: NThomas Graf <tgraf@suug.ch>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b8e1943e
    • T
      rhashtable: Convert bucket iterators to take table and index · 88d6ed15
      Thomas Graf 提交于
      This patch is in preparation to introduce per bucket spinlocks. It
      extends all iterator macros to take the bucket table and bucket
      index. It also introduces a new rht_dereference_bucket() to
      handle protected accesses to buckets.
      
      It introduces a barrier() to the RCU iterators to the prevent
      the compiler from caching the first element.
      
      The lockdep verifier is introduced as stub which always succeeds
      and properly implement in the next patch when the locks are
      introduced.
      Signed-off-by: NThomas Graf <tgraf@suug.ch>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      88d6ed15
    • T
      a4b18cda
    • T
      rhashtable: Do hashing inside of rhashtable_lookup_compare() · 8d24c0b4
      Thomas Graf 提交于
      Hash the key inside of rhashtable_lookup_compare() like
      rhashtable_lookup() does. This allows to simplify the hashing
      functions and keep them private.
      Signed-off-by: NThomas Graf <tgraf@suug.ch>
      Cc: netfilter-devel@vger.kernel.org
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      8d24c0b4
  2. 03 1月, 2015 21 次提交
  3. 01 1月, 2015 11 次提交
    • D
      Merge branch 'gmac-next' · 01aa2997
      David S. Miller 提交于
      Roger Chen says:
      
      ====================
      support GMAC driver for RK3288
      
      Roger Chen (6):
        patch1: add driver for Rockchip RK3288 SoCs integrated GMAC
        patch2: define clock ID used for GMAC
        patch3: modify CRU config for Rockchip RK3288 SoCs integrated GMAC
        patch4: dts: rockchip: add gmac info for rk3288
        patch5: dts: rockchip: enable gmac on RK3288 evb board
        patch6: add document for Rockchip RK3288 GMAC
      
      Tested on rk3288 evb board:
      Execute the following command to enable ethernet,
      set local IP and ping a remote host.
      
      busybox ifconfig eth0 up
      busybox ifconfig eth0 192.168.1.111
      ping 192.168.1.1
      ====================
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      01aa2997
    • R
      GMAC: add document for Rockchip RK3288 GMAC · 53a83930
      Roger Chen 提交于
      The document descripts how to add properties for GMAC in device tree.
      
      change since v2:
      
      1. remove power-gpio, reset-gpio, phyirq-gpio, pmu_regulator setting
      2. add "snps,reset-gpio", "snps,reset-active-low;" "snps,reset-delays-us"
      Signed-off-by: NRoger Chen <roger.chen@rock-chips.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      53a83930
    • R
      ARM: dts: rockchip: enable gmac on RK3288 evb board · e35e47ac
      Roger Chen 提交于
      enable gmac in rk3288-evb-rk808.dts
      
      changes since v2:
      1. add fixed regulator for PHY
      2. remove power-gpio, reset-gpio, phyirq-gpio, pmu_regulator setting
      3. add "snps,reset-gpio", "snps,reset-active-low;" "snps,reset-delays-us"
      Signed-off-by: NRoger Chen <roger.chen@rock-chips.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e35e47ac
    • R
      ARM: dts: rockchip: add gmac info for rk3288 · 3d3fb74a
      Roger Chen 提交于
      add gmac info in rk3288.dtsi for GMAC driver
      
      changes since v2:
      1. add drive-strength in the pinctrl settings
      Signed-off-by: NRoger Chen <roger.chen@rock-chips.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3d3fb74a
    • R
      GMAC: modify CRU config for Rockchip RK3288 SoCs integrated GMAC · 7f186025
      Roger Chen 提交于
      modify CRU config for GMAC driver
      
      changes since v2:
      1. remove SCLK_MAC_PLL
      Signed-off-by: NRoger Chen <roger.chen@rock-chips.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      7f186025
    • R
      GMAC: define clock ID used for GMAC · 3cf8e53a
      Roger Chen 提交于
      changes since v2:
      1. remove SCLK_MAC_PLL
      Signed-off-by: NRoger Chen <roger.chen@rock-chips.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3cf8e53a
    • R
      GMAC: add driver for Rockchip RK3288 SoCs integrated GMAC · 7ad269ea
      Roger Chen 提交于
      This driver is based on stmmac driver.
      
      changes since v2:
      - use tab instead of space for macros
      - use HIWORD_UPDATE macro for GMAC_CLK_RX_DL_CFG and GMAC_CLK_TX_DL_CFG
      - remove drive-strength setting in the driver and set it in the pinctrl settings
      - use dev_err instead of pr_err
      - remove clock names's macros, just use the real name of the clock
      - use devm_clk_get() instead of clk_get()
      - remove clk_set_parent(bsp_priv->clk_mac, bsp_priv->clk_mac_pll)
      - remove gpio setting for LDO, just use regulator API
      - remove phy reset using gpio in the glue layer, it has been handled in the stmmac driver
      - remove handling phy interrupt (mii interrupt)
      
      changes since v1:
      - use BIT() to set register
      - combine two remap_write() operations into one for the same register
      - use macros for register value setting
      - remove grf fail check in rk_gmac_setup() and save all the check in set_rgmii_speed()
      - remove .tx_coe=1 in rk_gmac_data
      Signed-off-by: NRoger Chen <roger.chen@rock-chips.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      7ad269ea
    • D
      9aacfb20
    • D
      54da5083
    • D
      Merge branch 'fib_trie-next' · e495f78d
      David S. Miller 提交于
      Alexander Duyck says:
      
      ====================
      fib_trie: Reduce time spent in fib_table_lookup by 35 to 75%
      
      These patches are meant to address several performance issues I have seen
      in the fib_trie implementation, and fib_table_lookup specifically.  With
      these changes in place I have seen a reduction of up to 35 to 75% for the
      total time spent in fib_table_lookup depending on the type of search being
      performed.
      
      On a VM running in my Corei7-4930K system with a trie of maximum depth of 7
      this resulted in a reduction of over 370ns per packet in the total time to
      process packets received from an ixgbe interface and route them to a dummy
      interface.  This represents a failed lookup in the local trie followed by
      a successful search in the main trie.
      
      				Baseline	Refactor
        ixgbe->dummy routing		1.20Mpps	2.21Mpps
        ------------------------------------------------------------
        processing time per packet		835ns		453ns
        fib_table_lookup		50.1%	418ns	25.0%	113ns
        check_leaf.isra.9		 7.9%	 66ns	   --	 --
        ixgbe_clean_rx_irq		 5.3%	 44ns	 9.8%	 44ns
        ip_route_input_noref		 2.9%	 25ns	 4.6%	 21ns
        pvclock_clocksource_read	 2.6%	 21ns	 4.6%	 21ns
        ip_rcv			 2.6%	 22ns	 4.0%	 18ns
      
      In the simple case of receiving a frame and dropping it before it can reach
      the socket layer I saw a reduction of 40ns per packet.  This represents a
      trip through the local trie with the correct leaf found with no need for
      any backtracing.
      
      				Baseline	Refactor
        ixgbe->local receive		2.65Mpps	2.96Mpps
        ------------------------------------------------------------
        processing time per packet		377ns		337ns
        fib_table_lookup		25.1%	 95ns	25.8%	 87ns
        ixgbe_clean_rx_irq		 8.7%	 33ns	 9.0%	 30ns
        check_leaf.isra.9		 7.2%	 27ns	   --	 --
        ip_rcv			 5.7%	 21ns	 6.5%	 22ns
      
      These changes have resulted in several functions being inlined such as
      check_leaf and fib_find_node, but due to the code simplification the
      overall size of the code has been reduced.
      
         text	   data	    bss	    dec	    hex	filename
        16932	    376	     16	  17324	   43ac	net/ipv4/fib_trie.o - before
        15259	    376	      8	  15643	   3d1b	net/ipv4/fib_trie.o - after
      
      Changes since RFC:
        Replaced this_cpu_ptr with correct call to this_cpu_inc in patch 1
        Changed test for leaf_info mismatch to (key ^ n->key) & li->mask_plen in patch 10
      ====================
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e495f78d
    • A
      fib_trie: Add tracking value for suffix length · 5405afd1
      Alexander Duyck 提交于
      This change adds a tracking value for the maximum suffix length of all
      prefixes stored in any given tnode.  With this value we can determine if we
      need to backtrace or not based on if the suffix is greater than the pos
      value.
      
      By doing this we can reduce the CPU overhead for lookups in the local table
      as many of the prefixes there are 32b long and have a suffix length of 0
      meaning we can immediately backtrace to the root node without needing to
      test any of the nodes between it and where we ended up.
      Signed-off-by: NAlexander Duyck <alexander.h.duyck@redhat.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      5405afd1