linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: linux@arm.linux.org.uk (Russell King - ARM Linux)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] ARM: v6: avoid read_cpuid_ext() on ARM1136r0 in cache_ops_need_broadcast()
Date: Sun, 28 Jul 2013 12:52:20 +0100	[thread overview]
Message-ID: <20130728115220.GE21614@n2100.arm.linux.org.uk> (raw)
In-Reply-To: <20130728111038.GA9374@mudshark.cambridge.arm.com>

On Sun, Jul 28, 2013 at 12:10:38PM +0100, Will Deacon wrote:
> Hi Paul,
> 
> Cheers for sticking with this!
> 
> On Sun, Jul 28, 2013 at 06:43:24AM +0100, Paul Walmsley wrote:
> > 
> > Commit 621a0147d5c921f4cc33636ccd0602ad5d7cbfbc ("ARM: 7757/1: mm:
> > don't flush icache in switch_mm with hardware broadcasting") breaks
> > the boot on OMAP2430SDP with omap2plus_defconfig.  Tracked to an
> > undefined instruction abort from the CP15 read in
> > cache_ops_need_broadcast().  It turns out that early ARM1136 variants
> > don't support several CP15 registers that later ARM cores do.
> > ARM1136JF-S TRM section 3.2.1 "Register allocation" has the details.
> 
> Intriguing... I wouldn't expect a cp15 read to be emitted for 1136, since
> the SMP_ON_UP magic should have caused is_smp() to return false.

The compiler seems to be doing something quite odd with schedule():

00000540 <__schedule>:
 558:   ee103ff1        mrc     15, 0, r3, cr0, cr1, {7}
 560:   e1a03623        lsr     r3, r3, #12
 564:   e203300f        and     r3, r3, #15
 570:   e50b3080        str     r3, [fp, #-128] ; 0x80
...
 6e8:   e59f3428        ldr     r3, [pc, #1064] ; b18 <__schedule+0x5d8>
 6f0:   e5933000        ldr     r3, [r3]
 6f4:   e3530000        cmp     r3, #0
 6f8:   1a000027        bne     79c <__schedule+0x25c>
 6fc:   e2851f65        add     r1, r5, #404    ; 0x194
 700:   ebfffffe        bl      0 <_test_and_set_bit>
                        700: R_ARM_CALL _test_and_set_bit
...
 79c:   e51b1080        ldr     r1, [fp, #-128] ; 0x80
 7a0:   e3510000        cmp     r1, #0
 7a4:   1affffd4        bne     6fc <__schedule+0x1bc>
                        b18: R_ARM_ABS32        smp_on_up

Yes - that's right, it's reading from the mcr at the very start of
__schedule and storing it on the stack for just one test later on.  The
act of storing it on the stack and reading it back of is likely a lot
more expensive than reading it from CP15 in the first place!

We don't want to make the asm() itself volatile, because that means the
asm() statement can't be optimised away.

Adding a memory clobber to that asm seems to place it more appropriately,
but again, that's not particularly desirable.

Another solution would be to make both tlb_ops_need_broadcast and
cache_ops_need_broadcast both be a flag test, but that introduces a
memory load in all those paths no matter if we're running on SMP_ON_UP
or not.

  reply	other threads:[~2013-07-28 11:52 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-22 18:07 OMAP2430 SDP boot broken after Linus' rmk merge Paul Walmsley
2013-07-22 18:43 ` Russell King - ARM Linux
2013-07-22 20:07   ` Paul Walmsley
2013-07-23  7:03     ` Rajendra Nayak
2013-07-23  7:07       ` Paul Walmsley
2013-07-23  9:05         ` Rajendra Nayak
2013-07-24 13:56           ` Will Deacon
2013-07-24 14:17             ` Santosh Shilimkar
2013-07-24 14:20               ` Will Deacon
2013-07-24 14:45                 ` Santosh Shilimkar
2013-07-27  4:10                 ` Paul Walmsley
2013-07-27 12:22                   ` Will Deacon
2013-07-28  5:38                     ` Paul Walmsley
2013-07-28  5:46                       ` [PATCH] ARM: v6: avoid remaining accesses to missing CP15 registers on ARM1136 r0 Paul Walmsley
2013-07-28  5:58                         ` Paul Walmsley
2013-07-28  6:00                         ` [PATCH v2] " Paul Walmsley
2013-07-28 19:58                           ` Paul Walmsley
2013-07-28  5:43                     ` [PATCH] ARM: v6: avoid read_cpuid_ext() on ARM1136r0 in cache_ops_need_broadcast() Paul Walmsley
2013-07-28 11:10                       ` Will Deacon
2013-07-28 11:52                         ` Russell King - ARM Linux [this message]
2013-07-28 19:56                           ` Paul Walmsley
2013-07-28 19:47                         ` Paul Walmsley
2013-07-28 20:16                       ` [PATCH] ARM: v6: prevent gcc from reordering extended CP15 reads above is_smp() test Paul Walmsley
2013-07-29  7:30                         ` Tony Lindgren
2013-07-29 10:02                         ` Will Deacon
2013-07-30 10:58                           ` Paul Walmsley
2013-07-30 11:32                         ` [PATCH v2] ARM: v6: prevent gcc 4.5 " Paul Walmsley
2013-07-30 15:04                           ` Will Deacon
2013-07-24 14:52               ` OMAP2430 SDP boot broken after Linus' rmk merge Russell King - ARM Linux
2013-07-24 15:40                 ` OMAP4430 SDP boot issues.. (Was Re: OMAP2430 SDP boot broken after Linus' rmk merge) Santosh Shilimkar
2013-07-24 17:23                   ` Russell King - ARM Linux
2013-07-24 18:17                     ` Santosh Shilimkar
2013-07-25  6:40                 ` OMAP2430 SDP boot broken after Linus' rmk merge Tomi Valkeinen
2013-07-25  6:50                   ` Tomi Valkeinen
2013-07-26 22:59                     ` Russell King - ARM Linux
2013-08-07 18:09           ` Paul Walmsley
2013-08-08  5:37             ` Rajendra Nayak
2013-08-08 10:20               ` Rajendra Nayak
2013-07-23 10:33 ` Jonathan Austin
2013-07-31  0:57   ` Paul Walmsley

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=20130728115220.GE21614@n2100.arm.linux.org.uk \
    --to=linux@arm.linux.org.uk \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).