21 Jul, 2011

1 commit

  • If the list to be spliced is empty, then list_splice_init_rcu() has
    nothing to do. Unfortunately, list_splice_init_rcu() does not check
    the list to be spliced; it instead checks the list to be spliced into.
    This results in memory leaks given current usage. This commit
    therefore fixes the empty-list check.

    Signed-off-by: Jan H. Schönherr
    Signed-off-by: Paul E. McKenney

    Jan H. Schönherr
     

20 May, 2011

2 commits

  • This is removes the use of software prefetching from the regular list
    iterators. We don't want it. If you do want to prefetch in some
    iterator of yours, go right ahead. Just don't expect the iterator to do
    it, since normally the downsides are bigger than the upsides.

    It also replaces with , because the
    use of LIST_POISON ends up needing it. is sadly not
    self-contained, and including prefetch.h just happened to hide that.

    Suggested by David Miller (networking has a lot of regular lists that
    are often empty or a single entry, and prefetching is not going to do
    anything but add useless instructions).

    Acked-by: Ingo Molnar
    Acked-by: David S. Miller
    Cc: linux-arch@vger.kernel.org
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • They not only increase the code footprint, they actually make things
    slower rather than faster. On internationally acclaimed benchmarks
    ("make -j16" on an already fully built kernel source tree) the hlist
    prefetching slows down the build by up to 1%.

    (Almost all of it comes from hlist_for_each_entry_rcu() as used by
    avc_has_perm_noaudit(), which is very hot due to all the pathname
    lookups to see if there is anything to do).

    The cause seems to be two-fold:

    - on at least some Intel cores, prefetch(NULL) ends up with some
    microarchitectural stall due to the TLB miss that it incurs. The
    hlist case triggers this very commonly, since the NULL pointer is the
    last entry in the list.

    - the prefetch appears to cause more D$ activity, probably because it
    prefetches hash list entries that are never actually used (because we
    ended the search early due to a hit).

    Regardless, the numbers clearly say that the implicit prefetching is
    simply a bad idea. If some _particular_ user of the hlist iterators
    wants to prefetch the next list entry, they can do so themselves
    explicitly, rather than depend on all list iterators doing so
    implicitly.

    Acked-by: Ingo Molnar
    Acked-by: David S. Miller
    Cc: linux-arch@vger.kernel.org
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

18 Dec, 2010

2 commits


21 Aug, 2010

1 commit


20 Aug, 2010

1 commit

  • This avoids warnings from missing __rcu annotations
    in the rculist implementation, making it possible to
    use the same lists in both RCU and non-RCU cases.

    We can add rculist annotations later, together with
    lockdep support for rculist, which is missing as well,
    but that may involve changing all the users.

    Signed-off-by: Arnd Bergmann
    Signed-off-by: Paul E. McKenney
    Cc: Pavel Emelyanov
    Cc: Sukadev Bhattiprolu
    Reviewed-by: Josh Triplett

    Arnd Bergmann
     

04 May, 2010

1 commit

  • Add hlist_for_each_entry_rcu_bh() and
    hlist_for_each_entry_continue_rcu_bh() macros, and use them in
    ipv6_get_ifaddr(), if6_get_first() and if6_get_next() to fix lockdeps
    warnings.

    Signed-off-by: Eric Dumazet
    Reviewed-by: "Paul E. McKenney"
    Signed-off-by: David S. Miller

    Eric Dumazet
     

21 Mar, 2010

1 commit


01 Mar, 2010

1 commit


25 Feb, 2010

1 commit

  • The theory is that use of bare rcu_dereference() is more prone
    to error than use of the RCU list-traversal primitives.
    Therefore, disable lockdep RCU read-side critical-section
    checking in these primitives for the time being. Once all of
    the rcu_dereference() uses have been dealt with, it may be time
    to re-enable lockdep checking for the RCU list-traversal
    primitives.

    Signed-off-by: Paul E. McKenney
    Cc: laijs@cn.fujitsu.com
    Cc: dipankar@in.ibm.com
    Cc: mathieu.desnoyers@polymtl.ca
    Cc: josh@joshtriplett.org
    Cc: dvhltc@us.ibm.com
    Cc: niv@us.ibm.com
    Cc: peterz@infradead.org
    Cc: rostedt@goodmis.org
    Cc: Valdis.Kletnieks@vt.edu
    Cc: dhowells@redhat.com
    LKML-Reference:
    Signed-off-by: Ingo Molnar

    Paul E. McKenney
     

23 Feb, 2010

1 commit


11 Nov, 2009

1 commit


15 Apr, 2009

1 commit

  • I've run into the situation where I need to use list_first_entry with
    rcu-guarded list. This patch introduces this.

    Also simplify list_for_each_entry_rcu() to use new list_entry_rcu()
    instead of list_entry().

    Signed-off-by: Jiri Pirko
    Reviewed-by: Paul E. McKenney
    Cc: dipankar@in.ibm.com
    LKML-Reference:
    Signed-off-by: Ingo Molnar

    Jiri Pirko
     

15 Aug, 2008

1 commit


29 Jul, 2008

1 commit

  • Introduce list_del_init_rcu() and document it.

    Signed-off-by: Andrea Arcangeli
    Acked-by: Linus Torvalds
    Cc: "Paul E. McKenney"
    Cc: Ingo Molnar
    Cc: Christoph Lameter
    Cc: Jack Steiner
    Cc: Robin Holt
    Cc: Nick Piggin
    Cc: Peter Zijlstra
    Cc: Kanoj Sarcar
    Cc: Roland Dreier
    Cc: Steve Wise
    Cc: Avi Kivity
    Cc: Hugh Dickins
    Cc: Rusty Russell
    Cc: Anthony Liguori
    Cc: Chris Wright
    Cc: Marcelo Tosatti
    Cc: Eric Dumazet
    Cc: "Paul E. McKenney"
    Cc: Izik Eidus
    Cc: Anthony Liguori
    Cc: Rik van Riel
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrea Arcangeli
     

19 May, 2008

3 commits

  • RCU list iterators: should prefetch ever be optimised out with no
    side-effects, the current version will lose the barrier completely.

    Pointed-out-by: Linus Torvalds
    Signed-off-by: Paul E. McKenney
    Signed-off-by: Ingo Molnar

    Paul E. McKenney
     
  • Make almost all list mutation primitives use rcu_assign_pointer().

    The main point of this being readability improvement.

    Signed-off-by: Franck Bui-Huu
    Cc: "Paul E. McKenney"
    Cc: Josh Triplett
    Signed-off-by: Andrew Morton
    Signed-off-by: Ingo Molnar

    Franck Bui-Huu
     
  • Move rcu-protected lists from list.h into a new header file rculist.h.

    This is done because list are a very used primitive structure all over the
    kernel and it's currently impossible to include other header files in this
    list.h without creating some circular dependencies.

    For example, list.h implements rcu-protected list and uses rcu_dereference()
    without including rcupdate.h. It actually compiles because users of
    rcu_dereference() are macros. Others RCU functions could be used too but
    aren't probably because of this.

    Therefore this patch creates rculist.h which includes rcupdates without to
    many changes/troubles.

    Signed-off-by: Franck Bui-Huu
    Acked-by: Paul E. McKenney
    Acked-by: Josh Triplett
    Signed-off-by: Andrew Morton
    Signed-off-by: Ingo Molnar

    Franck Bui-Huu