diff --git a/tools/helpers/init-xenstore-domain.c b/tools/helpers/init-xenstore-domain.c index 89c329c7c6..cd27edccb7 100644 --- a/tools/helpers/init-xenstore-domain.c +++ b/tools/helpers/init-xenstore-domain.c @@ -67,6 +67,14 @@ static int build(xc_interface *xch) .ssidref = SECINITSID_DOMU, .flags = XEN_DOMCTL_CDF_xs_domain, .max_evtchn_port = -1, /* No limit. */ + + /* + * 1 grant frame is enough: we don't need many grants. + * Mini-OS doesn't like less than 4, though, so use 4. + * 128 maptrack frames: 256 entries per frame, enough for 32768 domains. + */ + .max_grant_frames = 4, + .max_maptrack_frames = 128, }; xs_fd = open("/dev/xen/xenbus_backend", O_RDWR); @@ -104,12 +112,8 @@ static int build(xc_interface *xch) fprintf(stderr, "xc_domain_setmaxmem failed\n"); goto err; } - /* - * 1 grant frame is enough: we don't need many grants. - * Mini-OS doesn't like less than 4, though, so use 4. - * 128 maptrack frames: 256 entries per frame, enough for 32768 domains. - */ - rv = xc_domain_set_gnttab_limits(xch, domid, 4, 128); + rv = xc_domain_set_gnttab_limits(xch, domid, config.max_grant_frames, + config.max_maptrack_frames); if ( rv ) { fprintf(stderr, "xc_domain_set_gnttab_limits failed\n"); diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index b7b44e280b..8b755e412d 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -567,6 +567,8 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config, struct xen_domctl_createdomain create = { .ssidref = info->ssidref, .max_evtchn_port = b_info->event_channels, + .max_grant_frames = b_info->max_grant_frames, + .max_maptrack_frames = b_info->max_maptrack_frames, }; if (info->type != LIBXL_DOMAIN_TYPE_PV) { diff --git a/tools/ocaml/libs/xc/xenctrl.ml b/tools/ocaml/libs/xc/xenctrl.ml index 219355aefe..42f45c4b67 100644 --- a/tools/ocaml/libs/xc/xenctrl.ml +++ b/tools/ocaml/libs/xc/xenctrl.ml @@ -64,6 +64,8 @@ type domctl_create_config = handle: string; flags: domain_create_flag list; max_evtchn_port: int; + max_grant_frames: int; + max_maptrack_frames: int; arch: arch_domainconfig; } diff --git a/tools/ocaml/libs/xc/xenctrl.mli b/tools/ocaml/libs/xc/xenctrl.mli index c0c724b09d..0db58162d0 100644 --- a/tools/ocaml/libs/xc/xenctrl.mli +++ b/tools/ocaml/libs/xc/xenctrl.mli @@ -56,6 +56,8 @@ type domctl_create_config = { handle: string; flags: domain_create_flag list; max_evtchn_port: int; + max_grant_frames: int; + max_maptrack_frames: int; arch: arch_domainconfig; } diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c b/tools/ocaml/libs/xc/xenctrl_stubs.c index f8bdebadb1..1b5abd9f3a 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -129,13 +129,17 @@ CAMLprim value stub_xc_domain_create(value xch, value config) #define VAL_HANDLE Field(config, 1) #define VAL_FLAGS Field(config, 2) #define VAL_MAX_EVTCHN_PORT Field(config, 3) -#define VAL_ARCH Field(config, 4) +#define VAL_MAX_GRANT_FRAMES Field(config, 4) +#define VAL_MAX_MAPTRACK_FRAMES Field(config, 5) +#define VAL_ARCH Field(config, 6) uint32_t domid = 0; int result; struct xen_domctl_createdomain cfg = { .ssidref = Int32_val(VAL_SSIDREF), .max_evtchn_port = Int_val(VAL_MAX_EVTCHN_PORT), + .max_grant_frames = Int_val(VAL_MAX_GRANT_FRAMES), + .max_maptrack_frames = Int_val(VAL_MAX_MAPTRACK_FRAMES), }; domain_handle_of_uuid_string(cfg.handle, String_val(VAL_HANDLE)); @@ -171,6 +175,8 @@ CAMLprim value stub_xc_domain_create(value xch, value config) } #undef VAL_ARCH +#undef VAL_MAX_MAPTRACK_FRAMES +#undef VAL_MAX_GRANT_FRAMES #undef VAL_MAX_EVTCHN_PORT #undef VAL_FLAGS #undef VAL_HANDLE diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index 4dc6d1ca1e..6bd58ecbcd 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -126,6 +126,8 @@ static PyObject *pyxc_domain_create(XcObject *self, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, }, .max_evtchn_port = -1, /* No limit. */ + .max_grant_frames = 32, + .max_maptrack_frames = 1024, }; static char *kwd_list[] = { "domid", "ssidref", "handle", "flags", "target", NULL }; diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 7fc07cce13..59baa52716 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -71,6 +71,8 @@ struct xen_domctl_createdomain { * mapping space, xenheap, etc) a guest may consume. */ uint32_t max_evtchn_port; + uint32_t max_grant_frames; + uint32_t max_maptrack_frames; struct xen_arch_domainconfig arch; };