[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 1/1] Add mmio_hole_size
On 09/29/14 21:27, Boris Ostrovsky wrote: > > On 09/11/2014 12:20 PM, Don Slutz wrote: >> If you add enough PCI devices then all mmio may not fit below 4G >> which may not be the layout the user wanted. This allows you to >> increase the below 4G address space that PCI devices can use and >> therefore in more cases not have any mmio that is above 4G. >> >> There are real PCI cards that do not support mmio over 4G, so if you >> want to emulate them precisely, you may also need to increase the >> space below 4G for them. There are drivers for these cards that also >> do not work if they have their mmio space mapped above 4G. >> >> This allows growing the MMIO hole to the size needed. >> >> This may help with using pci passthru and HVM. >> >> Signed-off-by: Don Slutz <dslutz@xxxxxxxxxxx> >> --- >> v5: >> Add LIBXL_HAVE_BUILDINFO_HVM_MMIO_HOLE_SIZE. >> v4: >> s/pci_hole_min_size/mmio_hole_size/ >> s/HVM_BELOW_4G_RAM_END/HVM_BELOW_4G_MMIO_START/ >> Add ignore to hvmloader message >> Adjust commit message >> Dropped min; stopped mmio_hole_size changing in hvmloader >> >> docs/man/xl.cfg.pod.5 | 12 +++++++ >> tools/firmware/hvmloader/config.h | 1 - >> >> tools/firmware/hvmloader/pci.c | 71 >> +++++++++++++++++++++++++++------------ >> tools/libxc/xc_hvm_build_x86.c | 30 +++++++++++++++-- >> tools/libxc/xenguest.h | 11 ++++++ >> tools/libxl/libxl.h | 5 +++ >> tools/libxl/libxl_create.c | 29 ++++++++++++---- >> tools/libxl/libxl_dm.c | 24 +++++++++++-- >> tools/libxl/libxl_dom.c | 3 +- >> tools/libxl/libxl_types.idl | 1 + >> tools/libxl/xl_cmdimpl.c | 13 +++++++ >> 11 files changed, 166 insertions(+), 34 deletions(-) >> >> diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 >> index 517ae2f..45f7857 100644 >> --- a/docs/man/xl.cfg.pod.5 >> +++ b/docs/man/xl.cfg.pod.5 >> @@ -1111,6 +1111,18 @@ wallclock (i.e., real) time. >> =back >> +=head3 Memory layout >> + >> +=over 4 >> + >> +=item B<mmio_hole_size=BYTES> >> + >> +Specifies the size the MMIO hole below 4GiB will be. Only valid for >> +device_model_version = "qemu-xen". Note: this requires QEMU 2.1.0 >> +or later. > > Can you add text describing restrictions on hole size? Not smaller > than 256MB, I think. > Yes, I can add some things like "not smaller the 256MiB", "Not larger then 4GiB". There is no good statement on a max value (See other thread for more details). >> + >> +=back >> + ... >> - while ( (mmio_total > (pci_mem_end - pci_mem_start)) >> - && ((pci_mem_start << 1) != 0) >> - && (allow_memory_relocate >> - || (((pci_mem_start << 1) >> PAGE_SHIFT) >> - >= hvm_info->low_mem_pgend)) ) >> - pci_mem_start <<= 1; >> + if ( mmio_hole_size ) >> + { >> + uint64_t max_ram_below_4g = (1ULL << 32) - mmio_hole_size; >> + >> + if ( max_ram_below_4g > HVM_BELOW_4G_MMIO_START ) >> + { >> + printf("max_ram_below_4g=0x"PRIllx >> + " too big for mmio_hole_size=0x"PRIllx >> + " has been ignored.\n", >> + PRIllx_arg(max_ram_below_4g), >> + PRIllx_arg(mmio_hole_size)); >> + } > > Do you need to check whether the hole is too large? > > Here and in the toolstack. > Not really. Being unsigned handles most of these cases. And I have not found a good value to use. Just like memory does not say anything about the low end. > >> + else >> + { >> + pci_mem_start = max_ram_below_4g; >> + printf("pci_mem_start=0x%lx (was 0x%x) for >> mmio_hole_size=%lu\n", >> + pci_mem_start, HVM_BELOW_4G_MMIO_START, >> + (long)mmio_hole_size); >> + } >> + } >> + else >> + { >> + /* >> + * At the moment qemu-xen can't deal with relocated memory >> regions. >> + * It's too close to the release to make a proper fix; for now, >> + * only allow the MMIO hole to grow large enough to move >> guest memory >> + * if we're running qemu-traditional. Items that don't fit >> will be >> + * relocated into the 64-bit address space. >> + * >> + * This loop now does the following: >> + * - If allow_memory_relocate, increase the MMIO hole until >> it's >> + * big enough, or until it's 2GiB >> + * - If !allow_memory_relocate, increase the MMIO hole until >> it's >> + * big enough, or until it's 2GiB, or until it overlaps guest >> + * memory >> + */ >> + while ( (mmio_total > (pci_mem_end - pci_mem_start)) >> + && ((pci_mem_start << 1) != 0) >> + && (allow_memory_relocate >> + || (((pci_mem_start << 1) >> PAGE_SHIFT) >> + >= hvm_info->low_mem_pgend)) ) >> + pci_mem_start <<= 1; >> + } >> if ( mmio_total > (pci_mem_end - pci_mem_start) ) >> { >> diff --git a/tools/libxc/xc_hvm_build_x86.c >> b/tools/libxc/xc_hvm_build_x86.c >> index c81a25b..94da7fa 100644 >> --- a/tools/libxc/xc_hvm_build_x86.c >> +++ b/tools/libxc/xc_hvm_build_x86.c >> @@ -628,14 +628,40 @@ int xc_hvm_build_target_mem(xc_interface *xch, >> int target, >> const char *image_name) >> { >> + return xc_hvm_build_target_mem_with_hole(xch, domid, memsize, >> target, >> + image_name, 0); >> +} >> + >> +int xc_hvm_build_with_hole(xc_interface *xch, uint32_t domid, >> + struct xc_hvm_build_args *args, >> + uint64_t mmio_hole_size) >> +{ >> + if (mmio_hole_size) >> + { >> + uint64_t max_ram_below_4g = (1ULL << 32) - mmio_hole_size; >> + >> + if (max_ram_below_4g < HVM_BELOW_4G_MMIO_START) > > "<=", to be consistent with the check in > libxl__domain_create_info_setdefault (). Ok. > >> + { >> + args->mmio_size = mmio_hole_size; >> + } >> + } >> + return xc_hvm_build(xch, domid, args); >> +} ... >> + if (info->u.hvm.mmio_hole_size) { >> + uint64_t max_ram_below_4g = >> + (1ULL << 32) - info->u.hvm.mmio_hole_size; >> + >> + if (max_ram_below_4g <= HVM_BELOW_4G_MMIO_START) { > > You seem to be making various checks on hole size in multiple places > --- here, in libxl__build_device_model_args_new() and in > parse_config_data(). (And, to some degree, in > xc_hvm_build_with_hole()). Are they all necessary? > No, but helpful. -Don Slutz > -boris > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |