|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 8/8] libxl, hvmloader: Don't relocate memory for MMIO hole
On Fri, 21 Jun 2013, George Dunlap wrote:
> On 20/06/13 18:38, Stefano Stabellini wrote:
> > On Thu, 20 Jun 2013, George Dunlap wrote:
> > > At the moment, qemu-xen can't handle memory being relocated by
> > > hvmloader. This may happen if a device with a large enough memory
> > > region is passed through to the guest. At the moment, if this
> > > happens, then at some point in the future qemu will crash and the
> > > domain will hang. (qemu-traditional is fine.)
> > >
> > > It's too late in the release to do a proper fix, so we try to do
> > > damage control.
> > >
> > > hvmloader already has mechanisms to relocate memory to 64-bit space
> > > if it can't make a big enough MMIO hole. By default this is 2GiB; if
> > > we just refuse to make the hole bigger if it will overlap with guest
> > > memory, then the relocation will happen by default.
> > >
> > > v3:
> > > - Fix polarity of comparison
> > > - Move diagnostic messages to another patch
> > > - Tested with xen platform pci device hacked to have different BAR sizes
> > > {256MiB, 1GiB} x {qemu-xen, qemu-traditional} x various memory
> > > configurations
> > > - Add comment explaining why we default to "allow"
> > > - Remove cast to bool
> > > v2:
> > > - style fixes
> > > - fix and expand comment on the MMIO hole loop
> > > - use "%d" rather than "%s" -> (...)?"1":"0"
> > > - use bool instead of uint8_t
> > > - Move 64-bit bar relocate detection to another patch
> > > - Add more diagnostic messages
> > >
> > > Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
> > > CC: Ian Campbell <ian.campbell@xxxxxxxxxx>
> > > CC: Ian Jackson <ian.jackson@xxxxxxxxxx>
> > > CC: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx>
> > > CC: Hanweidong <hanweidong@xxxxxxxxxx>
> > > CC: Keir Fraser <keir@xxxxxxx>
> > > CC: Keir Fraser <keir@xxxxxxx>
> > > ---
> > > tools/firmware/hvmloader/pci.c | 49
> > > +++++++++++++++++++++++++++++--
> > > tools/libxl/libxl_dm.c | 6 ++++
> > > xen/include/public/hvm/hvm_xs_strings.h | 1 +
> > > 3 files changed, 54 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/tools/firmware/hvmloader/pci.c
> > > b/tools/firmware/hvmloader/pci.c
> > > index 3108c8a..2364177 100644
> > > --- a/tools/firmware/hvmloader/pci.c
> > > +++ b/tools/firmware/hvmloader/pci.c
> > > @@ -27,6 +27,8 @@
> > > #include <xen/memory.h>
> > > #include <xen/hvm/ioreq.h>
> > > +#include <xen/hvm/hvm_xs_strings.h>
> > > +#include <stdbool.h>
> > > unsigned long pci_mem_start = PCI_MEM_START;
> > > unsigned long pci_mem_end = PCI_MEM_END;
> > > @@ -57,6 +59,32 @@ void pci_setup(void)
> > > } *bars = (struct bars *)scratch_start;
> > > unsigned int i, nr_bars = 0;
> > > + const char *s;
> > > + /*
> > > + * Do we allow hvmloader to relocate guest memory in order to
> > > + * increase the size of the lowmem MMIO hole? Defaulting to 1
> > > + * here will mean that non-libxl toolstacks (including xend and
> > > + * home-grown ones) will experience this series as "no change".
> > > + * It does mean that those using qemu-xen will still experience
> > > + * the bug (described below); but it also means that those using
> > > + * qemu-traditional will *not* experience any change; and it also
> > > + * means that there is a work-around for those using qemu-xen,
> > > + * namely switching to qemu-traditional.
> > > + *
> > > + * If we defaulted to 0, and failing to resize the hole caused any
> > > + * problems with qemu-traditional, then there is no work-around.
> > > + *
> > > + * Since xend can't talk to qemu-traditional, I think this is the
> > > + * option that will have the least impact.
> > > + */
> > > + bool allow_memory_relocate = 1;
> > > +
> > > + s = xenstore_read(HVM_XS_ALLOW_MEMORY_RELOCATE, NULL);
> > > + if ( s )
> > > + allow_memory_relocate = strtoll(s, NULL, 0);
> > Considering that strtoll retuns a long long, are we sure that this
> > allocation does what we want for all the possible long long values
> > that can be returned?
> >
> > For example, if strtoll returns -1, do we want allow_memory_relocate to
> > be set to true?
>
> The only valid values here are "0" and "1"; everything else is undefined.
This code doesn't do what you say: "0" means false and everything else
means true. The undefined values are treated as true. Is that what we
want?
In order to do what you say you would need:
bool allow_memory_relocate = 1;
int i;
i = strtoll(s, NULL, 0);
if (i == 0 || i == 1)
allow_memory_relocate = i;
else
printf("WARNING");
> Look, the bike shed is already painted, the brushes have been washed and put
> away. Leave it be. :-)
I am leaving strtoll be. I think it would be easier not to use to strtoll
but I don't mind.
But if we do use strtoll then we need to handle all the possible return
values appropriately.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |