All of lore.kernel.org
 help / color / mirror / Atom feed
From: will.deacon@arm.com (Will Deacon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] ARM: mutex: use generic atomic_dec-based implementation for ARMv6+
Date: Fri, 13 Jul 2012 14:43:52 +0100	[thread overview]
Message-ID: <20120713134352.GR18079@mudshark.cambridge.arm.com> (raw)
In-Reply-To: <alpine.LFD.2.02.1207130905390.14068@xanadu.home>

Hi Nico,

On Fri, Jul 13, 2012 at 02:21:41PM +0100, Nicolas Pitre wrote:
> On Fri, 13 Jul 2012, Will Deacon wrote:
> 
> > The open-coded mutex implementation for ARMv6+ cores suffers from a
> > couple of problems:
> > 
> > 	1. (major) There aren't any barriers in sight, so in the
> > 	   uncontended case we don't actually protect any accesses
> > 	   performed in during the critical section.
> > 
> > 	2. (minor) If the strex indicates failure to complete the store,
> > 	   we assume that the lock is contended and run away down the
> > 	   failure (slow) path. This assumption isn't correct and the
> > 	   core may fail the strex for reasons other than contention.
> > 
> > This patch solves both of these problems by using the generic atomic_dec
> > based implementation for mutexes on ARMv6+. This also has the benefit of
> > removing a fair amount of inline assembly code.
> 
> I don't agree with #2.  Mutexes should be optimized for the uncontended 
> case.  And in such case, strex failures are unlikely.

Hmm, my only argument here is that the architecture doesn't actually define
all the causes of such a failure, so assuming that they are unlikely is
really down to the CPU implementation. However, whilst I haven't benchmarked
the strex failure rate, it wouldn't make sense to fail them gratuitously
although we may still end up on the slow path for the uncontended case.

> There was a time where the fast path was inlined in the code while any 
> kind of contention processing was pushed out of line.  Going to the slow 
> path on strex failure just followed that model and provided correct 
> mutex behavior while making the inlined sequence one instruction 
> shorter.  Therefore #2 is not a problem at all, not even a minor one.

Ok, I wasn't aware of the history, thanks. The trade-off between size of
inlined code and possibly taking the slow path unnecessarily seems like a
compromise, so point (2) doesn't stand there...

> These days the whole mutex code is always out of line so the saving of a 
> single branch instruction in the whole kernel doesn't really matter 
> anymore. So to say that I agree with the patch but not the second half 
> of its justification.

... but like you say, the size of the out-of-line code doesn't matter as
much, so surely taking the slow patch for an uncontended mutex is a minor
issue here?

Anyway, that's an interesting discussion but I'll reword the commit message
so we can get this in while we ponder strex failures :)

How about:


    ARM: mutex: use generic atomic_dec-based implementation for ARMv6+

    The open-coded mutex implementation for ARMv6+ cores suffers from a
    severe lack of barriers, so in the uncontended case we don't actually
    protect any accesses performed during the critical section.

    Furthermore, the code is largely a duplication of the ARMv6+ atomic_dec
    code but optimised to remove a branch instruction, as the mutex fastpath
    was previously inlined. Now that this is executed out-of-line, we can
    reuse the atomic access code for the locking.

    This patch solves uses the generic atomic_dec based implementation for
    mutexes on ARMv6+, which introduces barriers to the lock/unlock
    operations and also has the benefit of removing a fair amount of inline
    assembly code.


Cheers,

Will

  reply	other threads:[~2012-07-13 13:43 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-13 11:04 [PATCH] ARM: mutex: use generic atomic_dec-based implementation for ARMv6+ Will Deacon
2012-07-13 13:21 ` Nicolas Pitre
2012-07-13 13:43   ` Will Deacon [this message]
2012-07-13 17:00     ` Nicolas Pitre
2012-07-13 14:14 ` Arnd Bergmann
2012-07-13 14:30   ` Will Deacon
2012-07-13 15:13     ` Will Deacon
2012-07-13 17:07     ` Nicolas Pitre
  -- strict thread matches above, loose matches on Subject: below --
2012-08-13 17:38 Will Deacon
2012-08-13 18:14 ` Nicolas Pitre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120713134352.GR18079@mudshark.cambridge.arm.com \
    --to=will.deacon@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.