From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tiejun Chen Subject: [v4][PATCH 15/19] tools: introduce a new parameter to set a predefined rdm boundary Date: Tue, 23 Jun 2015 17:57:26 +0800 Message-ID: <1435053450-25131-16-git-send-email-tiejun.chen@intel.com> References: <1435053450-25131-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: <1435053450-25131-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 Signed-off-by: Tiejun Chen --- v4: * Separated from the previous patch to provide a parameter to set that predefined boundary dynamically. docs/man/xl.cfg.pod.5 | 21 +++++++++++++++++++++ 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, 36 insertions(+), 7 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 638b350..079465f 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -767,6 +767,27 @@ to a given device, and "strict" is default here. Note this would override global B option. +=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. + =back =back diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 0a7913b..a6212fb 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -858,6 +858,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 30e6593..0438731 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->rdm.reserve == LIBXL_RDM_RESERVE_FLAG_INVALID) b_info->rdm.reserve = LIBXL_RDM_RESERVE_FLAG_RELAXED; + + if (b_info->rdm_mem_boundary_memkb == LIBXL_MEMKB_DEFAULT) + b_info->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 34bd466..0987991 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->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 5ba075d..d130d48 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -395,6 +395,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("target_memkb", MemKB), ("video_memkb", MemKB), ("shadow_memkb", MemKB), + ("rdm_mem_boundary_memkb", MemKB), ("rtc_timeoffset", uint32), ("exec_ssidref", uint32), ("exec_ssid_label", string), diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 5637c30..c7a12b1 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1374,6 +1374,9 @@ static void parse_config_data(const char *config_source, if (!xlu_cfg_get_long (config, "videoram", &l, 0)) b_info->video_memkb = l * 1024; + if (!xlu_cfg_get_long (config, "rdm_mem_boundary", &l, 0)) + b_info->rdm_mem_boundary_memkb = l * 1024; + if (!xlu_cfg_get_long(config, "max_event_channels", &l, 0)) b_info->event_channels = l; -- 1.9.1