[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 0/2] MMIO emulation fixes


  • To: George Dunlap <george.dunlap@xxxxxxxxxx>, Jan Beulich <JBeulich@xxxxxxxx>, Paul Durrant <paul.durrant@xxxxxxxxxx>, George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
  • From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • Date: Fri, 10 Aug 2018 17:37:24 +0100
  • Autocrypt: addr=andrew.cooper3@xxxxxxxxxx; prefer-encrypt=mutual; keydata= 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 6+ahAA==
  • Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Fri, 10 Aug 2018 16:38:17 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Openpgp: preference=signencrypt

On 10/08/18 17:30, George Dunlap wrote:
> On 08/10/2018 05:00 PM, Jan Beulich wrote:
>>>>> On 10.08.18 at 17:35, <Paul.Durrant@xxxxxxxxxx> wrote:
>>>>  -----Original Message-----
>>>> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
>>>> Sent: 10 August 2018 16:31
>>>> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>
>>>> Cc: Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; xen-devel <xen-
>>>> devel@xxxxxxxxxxxxxxxxxxxx>
>>>> Subject: RE: [Xen-devel] [PATCH 0/2] MMIO emulation fixes
>>>>
>>>>>>> On 10.08.18 at 17:08, <Paul.Durrant@xxxxxxxxxx> wrote:
>>>>>>  -----Original Message-----
>>>>>> From: Andrew Cooper
>>>>>> Sent: 10 August 2018 13:56
>>>>>> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>; 'Jan Beulich'
>>>>>> <JBeulich@xxxxxxxx>
>>>>>> Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
>>>>>> Subject: Re: [Xen-devel] [PATCH 0/2] MMIO emulation fixes
>>>>>>
>>>>>> On 10/08/18 13:43, Paul Durrant wrote:
>>>>>>>> -----Original Message-----
>>>>>>>> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
>>>>>>>> Sent: 10 August 2018 13:37
>>>>>>>> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>
>>>>>>>> Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
>>>>>>>> Subject: RE: [Xen-devel] [PATCH 0/2] MMIO emulation fixes
>>>>>>>>
>>>>>>>>>>> On 10.08.18 at 14:22, <Paul.Durrant@xxxxxxxxxx> wrote:
>>>>>>>>>>  -----Original Message-----
>>>>>>>>>> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
>>>>>>>>>> Sent: 10 August 2018 13:13
>>>>>>>>>> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>
>>>>>>>>>> Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
>>>>>>>>>> Subject: RE: [Xen-devel] [PATCH 0/2] MMIO emulation fixes
>>>>>>>>>>
>>>>>>>>>>>>> On 10.08.18 at 14:08, <Paul.Durrant@xxxxxxxxxx> wrote:
>>>>>>>>>>>>  -----Original Message-----
>>>>>>>>>>>> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
>>>>>>>>>>>> Sent: 10 August 2018 13:02
>>>>>>>>>>>> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>
>>>>>>>>>>>> Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
>>>>>>>>>>>> Subject: Re: [Xen-devel] [PATCH 0/2] MMIO emulation fixes
>>>>>>>>>>>>
>>>>>>>>>>>>>>> On 10.08.18 at 12:37, <paul.durrant@xxxxxxxxxx> wrote:
>>>>>>>>>>>>> These are probably both candidates for back-port.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Paul Durrant (2):
>>>>>>>>>>>>>   x86/hvm/ioreq: MMIO range checking completely ignores
>>>>>> direction
>>>>>>>> flag
>>>>>>>>>>>>>   x86/hvm/emulate: make sure rep I/O emulation does not cross
>>>>>> GFN
>>>>>>>>>>>>>     boundaries
>>>>>>>>>>>>>
>>>>>>>>>>>>>  xen/arch/x86/hvm/emulate.c | 17 ++++++++++++++++-
>>>>>>>>>>>>>  xen/arch/x86/hvm/ioreq.c   | 15 ++++++++++-----
>>>>>>>>>>>>>  2 files changed, 26 insertions(+), 6 deletions(-)
>>>>>>>>>>>> I take it this isn't yet what we've talked about yesterday on irc?
>>>>>>>>>>>>
>>>>>>>>>>> This is the band-aid fix. I can now show correct handling of a rep
>>>> mov
>>>>>>>>>>> walking off MMIO into RAM.
>>>>>>>>>> But that's not the problem we're having. In our case the bad
>>>> behavior
>>>>>>>>>> is with a single MOV. That's why I had assumed that your plan to
>>>> fiddle
>>>>>>>>>> with null_handler would help in our case as well, while this series
>>>>>> clearly
>>>>>>>>>> won't (afaict).
>>>>>>>>>>
>>>>>>>>> Oh, I see. A single MOV spanning MMIO and RAM has undefined
>>>>>> behaviour
>>>>>>>> though
>>>>>>>>> as I understand it. Am I incorrect?
>>>>>>>> I'm not aware of SDM or PM saying anything like this. Anyway, the
>>>>>>>> specific case where this is being observed as an issue is when
>>>>>>>> accessing the last few bytes of a normal RAM page followed by a
>>>>>>>> ballooned out one. The balloon driver doesn't remove the virtual
>>>>>>>> mapping of such pages (presumably in order to not shatter super
>>>>>>>> pages); observation is with the old XenoLinux one, but from code
>>>>>>>> inspection the upstream one behaves the same.
>>>>>>>>
>>>>>>>> Unless we want to change the balloon driver's behavior, at least
>>>>>>>> this specific case needs to be considered having defined behavior,
>>>>>>>> I think.
>>>>>>>>
>>>>>>> Ok. I'll see what I can do.
>>>>>> It is a software error to try and cross boundaries.  Modern processors
>>>>>> do their best to try and cause the correct behaviour to occur, albeit
>>>>>> with a massive disclaimer about the performance hit.  Older processors
>>>>>> didn't cope.
>>>>>>
>>>>>> As far as I'm concerned, its fine to terminate a emulation which crosses
>>>>>> a boundary with the null ops.
>>>>> Alas we never even get as far as the I/O handlers in some circumstances...
>>>>>
>>>>> I just set up a variant of an XTF test doing a backwards rep movsd into a
>>>>> well aligned stack buffer where source buffer starts 1 byte before a
>>>> boundary
>>>>> between RAM and MMIO. The code in hvmemul_rep_movs() (rightly)
>>>> detects that
>>>>> both the source and dest of the initial rep are RAM, skips over the I/O
>>>>> emulation calls, and then fails when the hvm_copy_from_guest_phys()
>>>>> (unsurprisingly) fails to grab the 8 bytes for the initial rep.
>>>>> So, any logic we add to deal with handling page spanning ops is going to
>>>>> have to go in at the top level of instruction emulation... which I fear is
>>>>> going to be quite a major change and not something that's going to be easy
>>>> to
>>>>> back-port.
>>>> Well, wasn't it clear from the beginning that a proper fix would be too
>>>> invasive to backport? And wasn't it for that reason that you intended
>>>> to add a small hack first, to deal with just the case(s) that we currently
>>>> have issues with?
>>> Well, given that I mistakenly understood you were hitting the same rep 
>>> issue 
>>> that I was, I thought I could deal with it in a reasonably straightforward 
>>> way. Maybe I can still do a point fix for what you are hitting though. What 
>>> precisely are you hitting? Always a single MOV? And always from a page 
>>> spanning source to a well aligned dest? Or more combinations than that?
>> Always a single, misaligned MOV spanning the boundary from a valid
>> RAM page to a ballooned out one (Linux'es load_unaligned_zeropad()).
>> I meanwhile wonder though whether it might not be better to address
>> this at the p2m level, by inserting a r/o mapping of an all-zeros page.
>> George, do you have any opinion one way or the other?
> Sorry, what exactly is the issue here?  Linux has a function called
> load_unaligned_zeropad() which is reading into a ballooned region?
>
> Fundamentally, a ballooned page is one which has been allocated to a
> device driver.  I'm having a hard time coming up with a justification
> for having code which reads memory owned by B in the process of reading
> memory owned by A.  Or is there some weird architectural reason that I'm
> not aware of?

The underlying issue is that the emulator can't cope with a single
misaligned access which crosses RAM and MMIO.  It gives up and
presumably throws #UD back.

One longstanding Xen bug is that simply ballooning a page out shouldn't
be able to trigger MMIO emulation to begin with.  It is a side effect of
mixed p2m types, and the fix for this to have Xen understand the guest
physmap layout.

However, the real bug is Linux making such a misaligned access into a
ballooned out page in the first place.  This is a Linux kernel bug which
(presumably) manifests in a very obvious way due to shortcomings in
Xen's emulation handling.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.