From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tiejun Chen Subject: [v7][PATCH 12/16] tools: introduce a new parameter to set a predefined rdm boundary Date: Thu, 9 Jul 2015 13:34:03 +0800 Message-ID: <1436420047-25356-13-git-send-email-tiejun.chen@intel.com> References: <1436420047-25356-1-git-send-email-tiejun.chen@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1436420047-25356-1-git-send-email-tiejun.chen@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Wei Liu , Ian Jackson , Ian Campbell , Stefano Stabellini List-Id: xen-devel@lists.xenproject.org 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 CC: Stefano Stabellini CC: Ian Campbell CC: Wei Liu Acked-by: Wei Liu Signed-off-by: Tiejun Chen --- v7: * Just sync with the fallout of renaming parameters from patch #10. 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 6c55a8b..23068ec 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 wiki page. +=item B + +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 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 c8a32d5..3de86a6 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.policy == LIBXL_RDM_RESERVE_POLICY_INVALID) b_info->u.hvm.rdm.policy = LIBXL_RDM_RESERVE_POLICY_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 a3ad8d1..4eb4f8a 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