[PATCH] ARC: Memory barriers for everyone!
Vineet Gupta
Vineet.Gupta1 at synopsys.com
Fri Oct 27 13:33:43 PDT 2017
Hi Jose,
On 09/13/2017 04:24 AM, Jose Abreu wrote:
> By default __iormb() and __iowmb() translate into a do { } while(0) for
> AXS10x platform. As ARC700 supports the sync op we can use the standard
> memory barriers that are supplied by asm-generic headers.
>
> Signed-off-by: Jose Abreu <joabreu at synopsys.com>
> Cc: Vineet Gupta <vgupta at synopsys.com>
> Cc: Alexey Brodkin <abrodkin at synopsys.com>
> Cc: Joao Pinto <jpinto at synopsys.com>
> ---
> Hi Vineet,
>
> This is the final patch for the series which should fix all the stacktracing
> mechanism for Bus Error messages. In this one we force memory barriers for
> all IO operations
SYNC is a performance killer - it makes the processor wait for all memory
operations to complete before proceeding. So the justification for adding it to
all io accessors has to be more than getting correct stack traces.
> which will prevent op reordering by gcc and which will
> *really* correct blink and eret regs to show where exactly the error happened.
I don't think this is the precise reason why it works. Adding the SYNC likely adds
enough delay between the IO r/w such that CPU doesn't move to the next instruction.
As you would know very well, Bus Errors on ARC are imprecise and that is the root
of the issue. The bus fabric can take arbitrary amount of time to come back with
an error and ARC would have moved on to next instruction(s) when it is actually
notified. Thus the exception is "charged" to whatever the current PC was when it
is actually taken, which accounts for the bogus ERET and hence broken call chains
etc. Note that sdding SYNC delays things just enough but it is still not
guaranteed that you will correct ERET, depending on your bus network.
Hence the reason this patch is not acceptable.
Apologies for the delay in responding..
Thx,
-Vineet
> With this fix I get a correct stacktrace upon a readl() from a non-existent
> register which causes a Bus Error. Without this, I would get non-correct
> blink and eret addresses because the ld operation would launch a bus error
> way after we performed readl().
>
> I am sending this but I'm not exactly sure if all platforms support
> the sync op. Could you confirm this?
>
> Best regards,
> Jose Miguel Abreu
> ---
> arch/arc/include/asm/io.h | 7 +------
> 1 file changed, 1 insertion(+), 6 deletions(-)
>
> diff --git a/arch/arc/include/asm/io.h b/arch/arc/include/asm/io.h
> index c22b181..712defd 100644
> --- a/arch/arc/include/asm/io.h
> +++ b/arch/arc/include/asm/io.h
> @@ -12,15 +12,10 @@
> #include <linux/types.h>
> #include <asm/byteorder.h>
> #include <asm/page.h>
> -
> -#ifdef CONFIG_ISA_ARCV2
> #include <asm/barrier.h>
> +
> #define __iormb() rmb()
> #define __iowmb() wmb()
> -#else
> -#define __iormb() do { } while (0)
> -#define __iowmb() do { } while (0)
> -#endif
>
> extern void __iomem *ioremap(phys_addr_t paddr, unsigned long size);
> extern void __iomem *ioremap_prot(phys_addr_t paddr, unsigned long size,
>
More information about the linux-snps-arc
mailing list