28 Nov, 2013

1 commit


15 Nov, 2013

1 commit


11 Nov, 2013

1 commit

  • Pull gfs2 updates from Steven Whitehouse:
    "The main feature of interest this time is quota updates. There are
    some clean ups and some patches to use the new generic lru list code.

    There is still plenty of scope for some further changes in due course -
    faster lookups of quota structures is very much on the todo list.
    Also, a start has been made towards the more tricky issue of using the
    generic lru code with glocks, but that will have to be completed in a
    subsequent merge window.

    The other, more minor feature, is that there have been a number of
    performance patches which relate to block allocation. In particular
    they will improve performance when the disk is nearly full"

    * tag 'gfs2-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-nmw:
    GFS2: Use generic list_lru for quota
    GFS2: Rename quota qd_lru_lock qd_lock
    GFS2: Use reflink for quota data cache
    GFS2: Use lockref for glocks
    GFS2: Protect quota sync generation
    GFS2: Inline qd_trylock into gfs2_quota_unlock
    GFS2: Make two similar quota code fragments into a function
    GFS2: Remove obsolete quota tunable
    GFS2: Move gfs2_icbit_munge into quota.c
    GFS2: Speed up starting point selection for block allocation
    GFS2: Add allocation parameters structure
    GFS2: Clean up reservation removal
    GFS2: fix dentry leaks
    GFS2: new function gfs2_rbm_incr
    GFS2: Introduce rbm field bii
    GFS2: Do not reset flags on active reservations
    GFS2: introduce bi_blocks for optimization
    GFS2: optimize rbm_from_block wrt bi_start
    GFS2: d_splice_alias() can't return error

    Linus Torvalds
     

15 Oct, 2013

1 commit

  • Currently glocks have an atomic reference count and also a spinlock
    which covers various internal fields, such as the state. This intent of
    this patch is to replace the spinlock and the atomic reference count
    with a lockref structure. This contains a spinlock which we can continue
    to use as before, and a reference counter which is used in conjuction
    with the spinlock to replace the previous atomic counter.

    As a result of this there are some new rules for reference counting on
    glocks. We need to distinguish between reference count changes under
    gl_spin (which are now just increment or decrement of the new counter,
    provided the count cannot hit zero) and those which are outside of
    gl_spin, but which now take gl_spin internally.

    The conversion is relatively straight forward. There is probably some
    further clean up which can be done, but the priority at this stage is to
    make the change in as simple a manner as possible.

    A consequence of this change is that the reference count is being
    decoupled from the lru list processing. This should allow future
    adoption of the lru_list code with glocks in due course.

    The reason for using the "dead" state and not just relying on 0 being
    the "invalid state" is so that in due course 0 ref counts can be
    allowable. The intent is to eventually be able to remove the ref count
    changes which are currently hidden away in state_change().

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

28 Sep, 2013

2 commits

  • Make use of arch_mutex_cpu_relax() so architectures can override the
    default cpu_relax() semantics.
    This is especially useful for s390, where cpu_relax() means that we
    yield() the current (virtual) cpu and therefore is very expensive,
    and would contradict the whole purpose of the lockless cmpxchg loop.

    Signed-off-by: Heiko Carstens

    Heiko Carstens
     
  • The 64-bit cmpxchg operation on the lockref is ordered by virtue of
    hazarding between the cmpxchg operation and the reference count
    manipulation. On weakly ordered memory architectures (such as ARM), it
    can be of great benefit to omit the barrier instructions where they are
    not needed.

    This patch moves the lockless lockref code over to a cmpxchg64_relaxed
    operation, which doesn't provide barrier semantics. If the operation
    isn't defined, we simply #define it as the usual 64-bit cmpxchg macro.

    Cc: Waiman Long
    Signed-off-by: Will Deacon
    Signed-off-by: Linus Torvalds

    Will Deacon
     

21 Sep, 2013

1 commit

  • The cmpxchg() function tends not to support 64-bit arguments on 32-bit
    architectures. This could be either due to use of unsigned long
    arguments (like on ARM) or lack of instruction support (cmpxchgq on
    x86). However, these architectures may implement a specific cmpxchg64()
    function to provide 64-bit cmpxchg support instead.

    Since the lockref code requires a 64-bit cmpxchg and relies on the
    architecture selecting ARCH_USE_CMPXCHG_LOCKREF, move to using cmpxchg64
    instead of cmpxchg and allow 32-bit architectures to make use of the
    lockless lockref implementation.

    Cc: Waiman Long
    Signed-off-by: Will Deacon
    Signed-off-by: Linus Torvalds

    Will Deacon
     

08 Sep, 2013

2 commits

  • The only actual current lockref user (dcache) uses zero reference counts
    even for perfectly live dentries, because it's a cache: there may not be
    any users, but that doesn't mean that we want to throw away the dentry.

    At the same time, the dentry cache does have a notion of a truly "dead"
    dentry that we must not even increment the reference count of, because
    we have pruned it and it is not valid.

    Currently that distinction is not visible in the lockref itself, and the
    dentry cache validation uses "lockref_get_or_lock()" to either get a new
    reference to a dentry that already had existing references (and thus
    cannot be dead), or get the dentry lock so that we can then verify the
    dentry and increment the reference count under the lock if that
    verification was successful.

    That's all somewhat complicated.

    This adds the concept of being "dead" to the lockref itself, by simply
    using a count that is negative. This allows a usage scenario where we
    can increment the refcount of a dentry without having to validate it,
    and pushing the special "we killed it" case into the lockref code.

    The dentry code itself doesn't actually use this yet, and it's probably
    too late in the merge window to do that code (the dentry_kill() code
    with its "should I decrement the count" logic really is pretty complex
    code), but let's introduce the concept at the lockref level now.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • The code got rewritten, but the comments got copied as-is from older
    versions, and as a result the argument name in the comment didn't
    actually match the code any more.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

04 Sep, 2013

1 commit

  • While we are likley to succeed and break out of this loop, it isn't
    guaranteed. We should be power and thread friendly if we do have to
    go around for a second (or third, or more) attempt.

    Signed-off-by: Tony Luck
    Signed-off-by: Linus Torvalds

    Luck, Tony
     

03 Sep, 2013

2 commits

  • Instead of taking the spinlock, the lockless versions atomically check
    that the lock is not taken, and do the reference count update using a
    cmpxchg() loop. This is semantically identical to doing the reference
    count update protected by the lock, but avoids the "wait for lock"
    contention that you get when accesses to the reference count are
    contended.

    Note that a "lockref" is absolutely _not_ equivalent to an atomic_t.
    Even when the lockref reference counts are updated atomically with
    cmpxchg, the fact that they also verify the state of the spinlock means
    that the lockless updates can never happen while somebody else holds the
    spinlock.

    So while "lockref_put_or_lock()" looks a lot like just another name for
    "atomic_dec_and_lock()", and both optimize to lockless updates, they are
    fundamentally different: the decrement done by atomic_dec_and_lock() is
    truly independent of any lock (as long as it doesn't decrement to zero),
    so a locked region can still see the count change.

    The lockref structure, in contrast, really is a *locked* reference
    count. If you hold the spinlock, the reference count will be stable and
    you can modify the reference count without using atomics, because even
    the lockless updates will see and respect the state of the lock.

    In order to enable the cmpxchg lockless code, the architecture needs to
    do three things:

    (1) Make sure that the "arch_spinlock_t" and an "unsigned int" can fit
    in an aligned u64, and have a "cmpxchg()" implementation that works
    on such a u64 data type.

    (2) define a helper function to test for a spinlock being unlocked
    ("arch_spin_value_unlocked()")

    (3) select the "ARCH_USE_CMPXCHG_LOCKREF" config variable in its
    Kconfig file.

    This enables it for x86-64 (but not 32-bit, we'd need to make sure
    cmpxchg() turns into the proper cmpxchg8b in order to enable it for
    32-bit mode).

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • They aren't very good to inline, since they already call external
    functions (the spinlock code), and we're going to create rather more
    complicated versions of them that can do the reference count updates
    locklessly.

    Signed-off-by: Linus Torvalds

    Linus Torvalds