[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] libxc: pass parameters to xc_hvm_build() in a structure
On Tue, Feb 28, 2012 at 6:27 PM, David Vrabel <david.vrabel@xxxxxxxxxx> wrote: > From: David Vrabel <david.vrabel@xxxxxxxxxx> > > To allow new parameters to be added to the xc_hvm_build*() family of > functions, pass them in a structure. Make the other variants fill in > the structure and call xc_hvm_build() (except for xc_hvm_build_mem() > which had no users and is removed). > > Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> You should probably mention in the commit message that you're changing from megabytes to bytes. Other than that, looks good to me: Acked-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> > --- > tools/libxc/ia64/xc_ia64_hvm_build.c | 21 ++++-- > tools/libxc/xc_hvm_build.c | 115 > +++++++++------------------------- > tools/libxc/xenguest.h | 27 +++++--- > tools/libxc/xg_private.c | 3 +- > 4 files changed, 62 insertions(+), 104 deletions(-) > > diff --git a/tools/libxc/ia64/xc_ia64_hvm_build.c > b/tools/libxc/ia64/xc_ia64_hvm_build.c > index 18be616..16dace0 100644 > --- a/tools/libxc/ia64/xc_ia64_hvm_build.c > +++ b/tools/libxc/ia64/xc_ia64_hvm_build.c > @@ -912,8 +912,8 @@ setup_guest(xc_interface *xch, uint32_t dom, unsigned > long memsize, > char *image, unsigned long image_size) > { > xen_pfn_t *pfn_list; > - unsigned long dom_memsize = memsize << 20; > - unsigned long nr_pages = memsize << (20 - PAGE_SHIFT); > + unsigned long dom_memsize = memsize; > + unsigned long nr_pages = memsize >> PAGE_SHIFT; > unsigned long vcpus; > unsigned long nr_special_pages; > unsigned long memmap_info_pfn; > @@ -1072,14 +1072,14 @@ error_out: > } > > int > -xc_hvm_build(xc_interface *xch, uint32_t domid, int memsize, const char > *image_name) > +xc_hvm_build(xc_interface *xch, uint32_t domid, const struct xc_hvm_params > *params) > { > vcpu_guest_context_any_t st_ctxt_any; > vcpu_guest_context_t *ctxt = &st_ctxt_any.c; > char *image = NULL; > unsigned long image_size; > > - image = xc_read_image(xch, image_name, &image_size); > + image = xc_read_image(xch, params->image_file_name, &image_size); > if (image == NULL) { > PERROR("Could not read guest firmware image %s", image_name); > goto error_out; > @@ -1087,7 +1087,7 @@ xc_hvm_build(xc_interface *xch, uint32_t domid, int > memsize, const char *image_n > > image_size = (image_size + PAGE_SIZE - 1) & PAGE_MASK; > > - if (setup_guest(xch, domid, (unsigned long)memsize, image, > + if (setup_guest(xch, domid, (unsigned long)params->mem_size, image, > image_size) < 0) { > ERROR("Error constructing guest OS"); > goto error_out; > @@ -1114,6 +1114,8 @@ error_out: > * files/filenames. If target < memsize, domain is created with > * memsize pages marked populate-on-demand, and with a PoD cache size > * of target. If target == memsize, pages are populated normally. > + * > + * XXX:PoD isn't supported yet so setting target does nothing. > */ > int xc_hvm_build_target_mem(xc_interface *xch, > uint32_t domid, > @@ -1121,8 +1123,13 @@ int xc_hvm_build_target_mem(xc_interface *xch, > int target, > const char *image_name) > { > - /* XXX:PoD isn't supported yet */ > - return xc_hvm_build(xch, domid, target, image_name); > + struct xc_hvm_params params; > + > + params.mem_size = (uint64_t)memsize << 20; > + params.mem_target = (uint64_t)target << 20; > + params.image_file_name = image_name; > + > + return xc_hvm_build(xch, domid, ¶ms); > } > > /* > diff --git a/tools/libxc/xc_hvm_build.c b/tools/libxc/xc_hvm_build.c > index 1fa5658..31d4734 100644 > --- a/tools/libxc/xc_hvm_build.c > +++ b/tools/libxc/xc_hvm_build.c > @@ -136,12 +136,12 @@ static int check_mmio_hole(uint64_t start, uint64_t > memsize) > } > > static int setup_guest(xc_interface *xch, > - uint32_t dom, int memsize, int target, > + uint32_t dom, const struct xc_hvm_params *params, > char *image, unsigned long image_size) > { > xen_pfn_t *page_array = NULL; > - unsigned long i, nr_pages = (unsigned long)memsize << (20 - PAGE_SHIFT); > - unsigned long target_pages = (unsigned long)target << (20 - PAGE_SHIFT); > + unsigned long i, nr_pages = params->mem_size >> PAGE_SHIFT; > + unsigned long target_pages = params->mem_target >> PAGE_SHIFT; > unsigned long entry_eip, cur_pages, cur_pfn; > void *hvm_info_page; > uint32_t *ident_pt; > @@ -153,11 +153,7 @@ static int setup_guest(xc_interface *xch, > stat_1gb_pages = 0; > int pod_mode = 0; > > - /* An HVM guest must be initialised with at least 2MB memory. */ > - if ( memsize < 2 || target < 2 ) > - goto error_out; > - > - if ( memsize > target ) > + if ( nr_pages > target_pages ) > pod_mode = 1; > > memset(&elf, 0, sizeof(elf)); > @@ -168,7 +164,7 @@ static int setup_guest(xc_interface *xch, > > elf_parse_binary(&elf); > v_start = 0; > - v_end = (unsigned long long)memsize << 20; > + v_end = params->mem_size; > > if ( xc_version(xch, XENVER_capabilities, &caps) != 0 ) > { > @@ -393,39 +389,34 @@ static int setup_guest(xc_interface *xch, > return -1; > } > > -static int xc_hvm_build_internal(xc_interface *xch, > - uint32_t domid, > - int memsize, > - int target, > - char *image, > - unsigned long image_size) > -{ > - if ( (image == NULL) || (image_size == 0) ) > - { > - ERROR("Image required"); > - return -1; > - } > - > - return setup_guest(xch, domid, memsize, target, image, image_size); > -} > - > /* xc_hvm_build: > * Create a domain for a virtualized Linux, using files/filenames. > */ > -int xc_hvm_build(xc_interface *xch, > - uint32_t domid, > - int memsize, > - const char *image_name) > +int xc_hvm_build(xc_interface *xch, uint32_t domid, > + const struct xc_hvm_params *hvm_params) > { > - char *image; > - int sts; > + struct xc_hvm_params params = *hvm_params; > + void *image; > unsigned long image_size; > + int sts; > > - if ( (image_name == NULL) || > - ((image = xc_read_image(xch, image_name, &image_size)) == NULL) ) > + if ( domid == 0 ) > + return -1; > + if ( params.image_file_name == NULL ) > return -1; > > - sts = xc_hvm_build_internal(xch, domid, memsize, memsize, image, > image_size); > + if ( params.mem_target == 0 ) > + params.mem_target = params.mem_size; > + > + /* An HVM guest must be initialised with at least 2MB memory. */ > + if ( params.mem_size < (2ull << 20) || params.mem_target < (2ull << 20) ) > + return -1; > + > + image = xc_read_image(xch, params.image_file_name, &image_size); > + if ( image == NULL ) > + return -1; > + > + sts = setup_guest(xch, domid, ¶ms, image, image_size); > > free(image); > > @@ -445,59 +436,13 @@ int xc_hvm_build_target_mem(xc_interface *xch, > int target, > const char *image_name) > { > - char *image; > - int sts; > - unsigned long image_size; > + struct xc_hvm_params params = {}; > > - if ( (image_name == NULL) || > - ((image = xc_read_image(xch, image_name, &image_size)) == NULL) ) > - return -1; > + params.mem_size = (uint64_t)memsize << 20; > + params.mem_target = (uint64_t)target << 20; > + params.image_file_name = image_name; > > - sts = xc_hvm_build_internal(xch, domid, memsize, target, image, > image_size); > - > - free(image); > - > - return sts; > -} > - > -/* xc_hvm_build_mem: > - * Create a domain for a virtualized Linux, using memory buffers. > - */ > -int xc_hvm_build_mem(xc_interface *xch, > - uint32_t domid, > - int memsize, > - const char *image_buffer, > - unsigned long image_size) > -{ > - int sts; > - unsigned long img_len; > - char *img; > - > - /* Validate that there is a kernel buffer */ > - > - if ( (image_buffer == NULL) || (image_size == 0) ) > - { > - ERROR("kernel image buffer not present"); > - return -1; > - } > - > - img = xc_inflate_buffer(xch, image_buffer, image_size, &img_len); > - if ( img == NULL ) > - { > - ERROR("unable to inflate ram disk buffer"); > - return -1; > - } > - > - sts = xc_hvm_build_internal(xch, domid, memsize, memsize, > - img, img_len); > - > - /* xc_inflate_buffer may return the original buffer pointer (for > - for already inflated buffers), so exercise some care in freeing */ > - > - if ( (img != NULL) && (img != image_buffer) ) > - free(img); > - > - return sts; > + return xc_hvm_build(xch, domid, ¶ms); > } > > /* > diff --git a/tools/libxc/xenguest.h b/tools/libxc/xenguest.h > index 533e702..19b0382 100644 > --- a/tools/libxc/xenguest.h > +++ b/tools/libxc/xenguest.h > @@ -171,10 +171,23 @@ int xc_linux_build_mem(xc_interface *xch, > unsigned int console_evtchn, > unsigned long *console_mfn); > > -int xc_hvm_build(xc_interface *xch, > - uint32_t domid, > - int memsize, > - const char *image_name); > +struct xc_hvm_params { > + uint64_t mem_size; /**< Memory size in bytes. */ > + uint64_t mem_target; /**< Memory target in bytes. */ > + const char *image_file_name; /**< File name of the image to load. */ > +}; > + > +/** > + * Build a HVM domain using a set of parameters. > + * @parm xch libxc context handle. > + * @parm domid domain ID for the new domain. > + * @parm params parameters for the new domain. > + * > + * The memory size and image file parameters are required, the reset > + * are optional. > + */ > +int xc_hvm_build(xc_interface *xch, uint32_t domid, > + const struct xc_hvm_params *hvm_params); > > int xc_hvm_build_target_mem(xc_interface *xch, > uint32_t domid, > @@ -182,12 +195,6 @@ int xc_hvm_build_target_mem(xc_interface *xch, > int target, > const char *image_name); > > -int xc_hvm_build_mem(xc_interface *xch, > - uint32_t domid, > - int memsize, > - const char *image_buffer, > - unsigned long image_size); > - > int xc_suspend_evtchn_release(xc_interface *xch, xc_evtchn *xce, int domid, > int suspend_evtchn); > > int xc_suspend_evtchn_init(xc_interface *xch, xc_evtchn *xce, int domid, int > port); > diff --git a/tools/libxc/xg_private.c b/tools/libxc/xg_private.c > index 4b624a5..f7e2139 100644 > --- a/tools/libxc/xg_private.c > +++ b/tools/libxc/xg_private.c > @@ -192,8 +192,7 @@ unsigned long csum_page(void *page) > __attribute__((weak)) > int xc_hvm_build(xc_interface *xch, > uint32_t domid, > - int memsize, > - const char *image_name) > + const struct xc_hvm_params *hvm_params) > { > errno = ENOSYS; > return -1; > -- > 1.7.2.5 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |