On 06/05/18 10:23, Ard Biesheuvel wrote:
> On 5 June 2018 at 10:18, Ard Biesheuvel <ard.biesheu...@linaro.org> wrote:
>> On 5 June 2018 at 10:16, Laszlo Ersek <ler...@redhat.com> wrote:

>>> To my understanding, Daniel has the opposite preference; namely, the
>>> above approach doesn't scale to a large and moving target like the
>>> kernel. Because the instructions in question work on the bare metal
>>> (IOW, the guest code is not "broken" in any sense of the word), people
>>> will continue writing kernel MMIO code in C that "lures" gcc into
>>> generating such ARM/AArch64 assembly that contains those instructions.
>>>
> 
> Kernel MMIO code is not written in C, it used readl/writel and friends.

Are we certain that all drivers, and all platform MMIO code, use
readl/writel?

>>> Your edk2 ArmVirtQemu patch adds a heavy-weight flag (-fno-lto) to a
>>> pin-point location; another possibility (that might scale better to
>>> humans) is a new, lighter-weight flag, such as "-mno-multiple", that is
>>> applied universally to a codebase.
>>>
>>
>> That will affect *all* memory references, which will undoubtedly hurt
>> performance.
> 
> ... given that it will prevent us from using load/store pair
> instructions, which are used *everywhere*. Every function prologue
> consists of a collection of ldp instructions, every function epilogue
> has stp instructions. Optimized copy routines use ldp/stp as well.
> 
> So rebuilding the world with -mno-multiple is not going to fly, really.
> 
> We should probably start with improving the diagnostics produced by
> KVM when this situation hits.

That would indeed speed up things, on the analysis side.

> And given that this is (imo) a bug in
> the architecture, it should be up to KVM to work around it.

I've had a similar idea (not sure how correct I am to call it "similar",
let me say it is "related to virtualization" at the least) -- AIUI there
are various "paravirt ops" in the kernel, and readl/writel could be "KVM
friendly" when the kernel realizes it runs under KVM. Sorry if this is a
totally bogus idea; regardless, even if we did something similar at
build time that *only* penalized readl/writel (and not function
prologues, epilogues, or copy routines), the issue would remain whether
all drivers and platform MMIO code restricted themselves to readl/writel.

Thanks!
Laszlo

Reply via email to