1. 27 Jan, 2011 3 commits
    • David S. Miller's avatar
      inetpeer: Mark metrics as "new" in fresh inetpeer entries. · 144001bd
      David S. Miller authored
      Set the RTAX_LOCKED metric to INETPEER_METRICS_NEW (basically,
      all ones) on fresh inetpeer entries.
      
      This way code can determine if default metrics have been loaded
      in from a routing table entry already.
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      144001bd
    • David S. Miller's avatar
    • David S. Miller's avatar
      net: Implement read-only protection and COW'ing of metrics. · 62fa8a84
      David S. Miller authored
      Routing metrics are now copy-on-write.
      
      Initially a route entry points it's metrics at a read-only location.
      If a routing table entry exists, it will point there.  Else it will
      point at the all zero metric place-holder called 'dst_default_metrics'.
      
      The writeability state of the metrics is stored in the low bits of the
      metrics pointer, we have two bits left to spare if we want to store
      more states.
      
      For the initial implementation, COW is implemented simply via kmalloc.
      However future enhancements will change this to place the writable
      metrics somewhere else, in order to increase sharing.  Very likely
      this "somewhere else" will be the inetpeer cache.
      
      Note also that this means that metrics updates may transiently fail
      if we cannot COW the metrics successfully.
      
      But even by itself, this patch should decrease memory usage and
      increase cache locality especially for routing workloads.  In those
      cases the read-only metric copies stay in place and never get written
      to.
      
      TCP workloads where metrics get updated, and those rare cases where
      PMTU triggers occur, will take a very slight performance hit.  But
      that hit will be alleviated when the long-term writable metrics
      move to a more sharable location.
      
      Since the metrics storage went from a u32 array of RTAX_MAX entries to
      what is essentially a pointer, some retooling of the dst_entry layout
      was necessary.
      
      Most importantly, we need to preserve the alignment of the reference
      count so that it doesn't share cache lines with the read-mostly state,
      as per Eric Dumazet's alignment assertion checks.
      
      The only non-trivial bit here is the move of the 'flags' member into
      the writeable cacheline.  This is OK since we are always accessing the
      flags around the same moment when we made a modification to the
      reference count.
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      62fa8a84
  2. 26 Jan, 2011 17 commits
  3. 25 Jan, 2011 16 commits
  4. 24 Jan, 2011 4 commits