Previously we always fix that predefined boundary as 2G to handle conflict between memory and rdm, but now this predefined boundar can be changes with the parameter "rdm_mem_boundary" in .cfg file.
CC: Ian Jackson <ian.jack...@eu.citrix.com> CC: Stefano Stabellini <stefano.stabell...@eu.citrix.com> CC: Ian Campbell <ian.campb...@citrix.com> CC: Wei Liu <wei.l...@citrix.com> Acked-by: Wei Liu <wei.l...@citrix.com> Signed-off-by: Tiejun Chen <tiejun.c...@intel.com> --- v6: * Nothing is changed. v5: * Make this variable "rdm_mem_boundary_memkb" specific to .hvm v4: * Separated from the previous patch to provide a parameter to set that predefined boundary dynamically. docs/man/xl.cfg.pod.5 | 22 ++++++++++++++++++++++ tools/libxl/libxl.h | 6 ++++++ tools/libxl/libxl_create.c | 4 ++++ tools/libxl/libxl_dom.c | 8 +------- tools/libxl/libxl_types.idl | 1 + tools/libxl/xl_cmdimpl.c | 3 +++ 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 091e80d..7f65975 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -867,6 +867,28 @@ More information about Xen gfx_passthru feature is available on the XenVGAPassthrough L<http://wiki.xen.org/wiki/XenVGAPassthrough> wiki page. +=item B<rdm_mem_boundary=MBYTES> + +Number of megabytes to set a boundary for checking rdm conflict. + +When RDM conflicts with RAM, RDM probably scatter the whole RAM space. +Especially multiple RDM entries would worsen this to lead a complicated +memory layout. So here we're trying to figure out a simple solution to +avoid breaking existing layout. So when a conflict occurs, + + #1. Above a predefined boundary + - move lowmem_end below reserved region to solve conflict; + + #2. Below a predefined boundary + - Check strict/relaxed policy. + "strict" policy leads to fail libxl. Note when both policies + are specified on a given region, 'strict' is always preferred. + "relaxed" policy issue a warning message and also mask this + entry INVALID to indicate we shouldn't expose this entry to + hvmloader. + +Here the default is 2G. + =item B<dtdev=[ "DTDEV_PATH", "DTDEV_PATH", ... ]> Specifies the host device tree nodes to passthrough to this guest. Each diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index a1c5d15..6f157c9 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -863,6 +863,12 @@ const char *libxl_defbool_to_string(libxl_defbool b); #define LIBXL_TIMER_MODE_DEFAULT -1 #define LIBXL_MEMKB_DEFAULT ~0ULL +/* + * We'd like to set a memory boundary to determine if we need to check + * any overlap with reserved device memory. + */ +#define LIBXL_RDM_MEM_BOUNDARY_MEMKB_DEFAULT (2048 * 1024) + #define LIBXL_MS_VM_GENID_LEN 16 typedef struct { uint8_t bytes[LIBXL_MS_VM_GENID_LEN]; diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 7a0c57d..38a8c3a 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -109,6 +109,10 @@ void libxl__rdm_setdefault(libxl__gc *gc, libxl_domain_build_info *b_info) { if (b_info->u.hvm.rdm.reserve == LIBXL_RDM_RESERVE_FLAG_INVALID) b_info->u.hvm.rdm.reserve = LIBXL_RDM_RESERVE_FLAG_RELAXED; + + if (b_info->u.hvm.rdm_mem_boundary_memkb == LIBXL_MEMKB_DEFAULT) + b_info->u.hvm.rdm_mem_boundary_memkb = + LIBXL_RDM_MEM_BOUNDARY_MEMKB_DEFAULT; } int libxl__domain_build_info_setdefault(libxl__gc *gc, diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index f3c39a0..62ef120 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -922,12 +922,6 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid, int ret, rc = ERROR_FAIL; uint64_t mmio_start, lowmem_end, highmem_end; libxl_domain_build_info *const info = &d_config->b_info; - /* - * Currently we fix this as 2G to guarantte how to handle - * our rdm policy. But we'll provide a parameter to set - * this dynamically. - */ - uint64_t rdm_mem_boundary = 0x80000000; memset(&args, 0, sizeof(struct xc_hvm_build_args)); /* The params from the configuration file are in Mb, which are then @@ -966,7 +960,7 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid, args.mmio_start = mmio_start; ret = libxl__domain_device_construct_rdm(gc, d_config, - rdm_mem_boundary, + info->u.hvm.rdm_mem_boundary_memkb*1024, &args); if (ret) { LOG(ERROR, "checking reserved device memory failed"); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 9f3f669..a936b8b 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -484,6 +484,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("ms_vm_genid", libxl_ms_vm_genid), ("serial_list", libxl_string_list), ("rdm", libxl_rdm_reserve), + ("rdm_mem_boundary_memkb", MemKB), ])), ("pv", Struct(None, [("kernel", string), ("slack_memkb", MemKB), diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index c858068..dfb50d6 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1519,6 +1519,9 @@ static void parse_config_data(const char *config_source, exit(1); } } + + if (!xlu_cfg_get_long (config, "rdm_mem_boundary", &l, 0)) + b_info->u.hvm.rdm_mem_boundary_memkb = l * 1024; break; case LIBXL_DOMAIN_TYPE_PV: { -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel