[lkml]   [2009]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH] x86: Remove readq()/writeq() on 32-bit
    As discussed in <> and follow-ups,
    readq()/writeq() for 32-bit x86 are implemented as two readl()/writel()
    operations. This is not atomic (in the sense that another MMIO
    operation from another CPU or thread can be done in the middle of the
    two read/writes), and may not access the two halves of the register in
    the correct order to work with hardware.

    Rather than silently providing a 32-bit fallback that leaves a
    possibility for strange driver bugs, it's better to provide readq()
    and writeq() only for 64-bit architectures, and have a compile failure
    on 32-bit architectures that forces driver authors to think about what
    the correct solution is.

    This essentially reverts 2c5643b1 ("x86: provide readq()/writeq() on
    32-bit too") and follow-on commits. If in the future someone wants to
    provide a generic solution for all 32-bit architectures, that's great,
    but there's not much point in providing (arguably broken)
    implementations for only one architecture, since any portable driver
    will have to implement fallbacks for other architectures anyway.

    Signed-off-by: Roland Dreier <>
    We never seemed to reach closure on this. I would strongly suggest
    merging something like this, and then if someone has a grand plan to
    unify all fallbacks, we can add that when it shows up. As it stands,
    the x86-32 situation is not progress towards that grand unified plans,
    and does nothing that I can tell beyond setting a trap for drivers.

    arch/x86/Kconfig | 2 --
    arch/x86/include/asm/io.h | 23 ++---------------------
    2 files changed, 2 insertions(+), 23 deletions(-)

    diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
    index df9e885..0be277b 100644
    --- a/arch/x86/Kconfig
    +++ b/arch/x86/Kconfig
    @@ -19,8 +19,6 @@ config X86_64
    config X86
    def_bool y
    select HAVE_AOUT if X86_32
    - select HAVE_READQ
    - select HAVE_WRITEQ
    select HAVE_IDE
    select HAVE_OPROFILE
    diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h
    index 7373932..199c7b9 100644
    --- a/arch/x86/include/asm/io.h
    +++ b/arch/x86/include/asm/io.h
    @@ -51,27 +51,6 @@ build_mmio_write(__writel, "l", unsigned int, "r", )
    build_mmio_read(readq, "q", unsigned long, "=r", :"memory")
    build_mmio_write(writeq, "q", unsigned long, "r", :"memory")

    -static inline __u64 readq(const volatile void __iomem *addr)
    - const volatile u32 __iomem *p = addr;
    - u32 low, high;
    - low = readl(p);
    - high = readl(p + 1);
    - return low + ((u64)high << 32);
    -static inline void writeq(__u64 val, volatile void __iomem *addr)
    - writel(val, addr);
    - writel(val >> 32, addr+4);
    #define readq_relaxed(a) readq(a)

    #define __raw_readq(a) readq(a)
    @@ -81,6 +60,8 @@ static inline void writeq(__u64 val, volatile void __iomem *addr)
    #define readq readq
    #define writeq writeq

    * virt_to_phys - map virtual addresses to physical
    * @address: address to remap

     \ /
      Last update: 2009-04-28 21:07    [W:0.301 / U:11.208 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site