@@ -1619,6 +1619,14 @@ hexadecimal format, without the "0x" prefix and all in lower case, like
Specifies the transport mechanism for the Virtio device, only "mmio" is
supported for now.
+=item B<grant_usage=BOOLEAN>
+
+If this option is B<true>, the Xen grants are always enabled.
+If this option is B<false>, the Xen grants are always disabled.
+
+If this option is missing, then the default grant setting will be used,
+i.e. enable grants if backend-domid != 0.
+
=back
=item B<tee="STRING">
@@ -1792,6 +1792,9 @@ func (x *DeviceVirtio) fromC(xc *C.libxl_device_virtio) error {
x.BackendDomname = C.GoString(xc.backend_domname)
x.Type = C.GoString(xc._type)
x.Transport = VirtioTransport(xc.transport)
+if err := x.GrantUsage.fromC(&xc.grant_usage);err != nil {
+return fmt.Errorf("converting field GrantUsage: %v", err)
+}
x.Devid = Devid(xc.devid)
x.Irq = uint32(xc.irq)
x.Base = uint64(xc.base)
@@ -1809,6 +1812,9 @@ xc.backend_domname = C.CString(x.BackendDomname)}
if x.Type != "" {
xc._type = C.CString(x.Type)}
xc.transport = C.libxl_virtio_transport(x.Transport)
+if err := x.GrantUsage.toC(&xc.grant_usage); err != nil {
+return fmt.Errorf("converting field GrantUsage: %v", err)
+}
xc.devid = C.libxl_devid(x.Devid)
xc.irq = C.uint32_t(x.Irq)
xc.base = C.uint64_t(x.Base)
@@ -683,6 +683,7 @@ BackendDomid Domid
BackendDomname string
Type string
Transport VirtioTransport
+GrantUsage Defbool
Devid Devid
Irq uint32
Base uint64
@@ -922,7 +922,8 @@ static int make_xen_iommu_node(libxl__gc *gc, void *fdt)
/* The caller is responsible to complete / close the fdt node */
static int make_virtio_mmio_node_common(libxl__gc *gc, void *fdt, uint64_t base,
- uint32_t irq, uint32_t backend_domid)
+ uint32_t irq, uint32_t backend_domid,
+ bool grant_usage)
{
int res;
gic_interrupt intr;
@@ -945,7 +946,7 @@ static int make_virtio_mmio_node_common(libxl__gc *gc, void *fdt, uint64_t base,
res = fdt_property(fdt, "dma-coherent", NULL, 0);
if (res) return res;
- if (backend_domid != LIBXL_TOOLSTACK_DOMID) {
+ if (grant_usage) {
uint32_t iommus_prop[2];
iommus_prop[0] = cpu_to_fdt32(GUEST_PHANDLE_IOMMU);
@@ -959,11 +960,12 @@ static int make_virtio_mmio_node_common(libxl__gc *gc, void *fdt, uint64_t base,
}
static int make_virtio_mmio_node(libxl__gc *gc, void *fdt, uint64_t base,
- uint32_t irq, uint32_t backend_domid)
+ uint32_t irq, uint32_t backend_domid,
+ bool grant_usage)
{
int res;
- res = make_virtio_mmio_node_common(gc, fdt, base, irq, backend_domid);
+ res = make_virtio_mmio_node_common(gc, fdt, base, irq, backend_domid, grant_usage);
if (res) return res;
return fdt_end_node(fdt);
@@ -1019,11 +1021,11 @@ static int make_virtio_mmio_node_gpio(libxl__gc *gc, void *fdt)
static int make_virtio_mmio_node_device(libxl__gc *gc, void *fdt, uint64_t base,
uint32_t irq, const char *type,
- uint32_t backend_domid)
+ uint32_t backend_domid, bool grant_usage)
{
int res;
- res = make_virtio_mmio_node_common(gc, fdt, base, irq, backend_domid);
+ res = make_virtio_mmio_node_common(gc, fdt, base, irq, backend_domid, grant_usage);
if (res) return res;
/* Add device specific nodes */
@@ -1363,7 +1365,8 @@ static int libxl__prepare_dtb(libxl__gc *gc, libxl_domain_config *d_config,
iommu_needed = true;
FDT( make_virtio_mmio_node(gc, fdt, disk->base, disk->irq,
- disk->backend_domid) );
+ disk->backend_domid,
+ disk->backend_domid != LIBXL_TOOLSTACK_DOMID) );
}
}
@@ -1373,12 +1376,13 @@ static int libxl__prepare_dtb(libxl__gc *gc, libxl_domain_config *d_config,
if (virtio->transport != LIBXL_VIRTIO_TRANSPORT_MMIO)
continue;
- if (virtio->backend_domid != LIBXL_TOOLSTACK_DOMID)
+ if (libxl_defbool_val(virtio->grant_usage))
iommu_needed = true;
FDT( make_virtio_mmio_node_device(gc, fdt, virtio->base,
virtio->irq, virtio->type,
- virtio->backend_domid) );
+ virtio->backend_domid,
+ libxl_defbool_val(virtio->grant_usage)) );
}
/*
@@ -740,6 +740,7 @@ libxl_device_virtio = Struct("device_virtio", [
("backend_domname", string),
("type", string),
("transport", libxl_virtio_transport),
+ ("grant_usage", libxl_defbool),
("devid", libxl_devid),
# Note that virtio-mmio parameters (irq and base) are for internal
# use by libxl and can't be modified.
@@ -23,8 +23,16 @@ static int libxl__device_virtio_setdefault(libxl__gc *gc, uint32_t domid,
libxl_device_virtio *virtio,
bool hotplug)
{
- return libxl__resolve_domid(gc, virtio->backend_domname,
- &virtio->backend_domid);
+ int rc;
+
+ rc = libxl__resolve_domid(gc, virtio->backend_domname,
+ &virtio->backend_domid);
+ if (rc < 0) return rc;
+
+ libxl_defbool_setdefault(&virtio->grant_usage,
+ virtio->backend_domid != LIBXL_TOOLSTACK_DOMID);
+
+ return 0;
}
static int libxl__device_from_virtio(libxl__gc *gc, uint32_t domid,
@@ -48,11 +56,13 @@ static int libxl__set_xenstore_virtio(libxl__gc *gc, uint32_t domid,
flexarray_t *ro_front)
{
const char *transport = libxl_virtio_transport_to_string(virtio->transport);
+ const char *grant_usage = libxl_defbool_to_string(virtio->grant_usage);
flexarray_append_pair(back, "irq", GCSPRINTF("%u", virtio->irq));
flexarray_append_pair(back, "base", GCSPRINTF("%#"PRIx64, virtio->base));
flexarray_append_pair(back, "type", GCSPRINTF("%s", virtio->type));
flexarray_append_pair(back, "transport", GCSPRINTF("%s", transport));
+ flexarray_append_pair(back, "grant_usage", GCSPRINTF("%s", grant_usage));
return 0;
}
@@ -104,6 +114,15 @@ static int libxl__virtio_from_xenstore(libxl__gc *gc, const char *libxl_path,
}
}
+ tmp = NULL;
+ rc = libxl__xs_read_checked(gc, XBT_NULL,
+ GCSPRINTF("%s/grant_usage", be_path), &tmp);
+ if (rc) goto out;
+
+ if (tmp) {
+ libxl_defbool_set(&virtio->grant_usage, strtoul(tmp, NULL, 0));
+ }
+
tmp = NULL;
rc = libxl__xs_read_checked(gc, XBT_NULL,
GCSPRINTF("%s/type", be_path), &tmp);
@@ -1215,6 +1215,8 @@ static int parse_virtio_config(libxl_device_virtio *virtio, char *token)
} else if (MATCH_OPTION("transport", token, oparg)) {
rc = libxl_virtio_transport_from_string(oparg, &virtio->transport);
if (rc) return rc;
+ } else if (MATCH_OPTION("grant_usage", token, oparg)) {
+ libxl_defbool_set(&virtio->grant_usage, strtoul(oparg, NULL, 0));
} else {
fprintf(stderr, "Unknown string \"%s\" in virtio spec\n", token);
return -1;
Currently, the grant mapping related device tree properties are added if the backend domain is not Dom0. While Dom0 is privileged and can do foreign mapping for the entire guest memory, it is still desired for Dom0 to access guest's memory via grant mappings and hence map only what is required. This commit adds the "grant_usage" parameter for virtio devices, which provides better control over the functionality. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- docs/man/xl.cfg.5.pod.in | 8 ++++++++ tools/golang/xenlight/helpers.gen.go | 6 ++++++ tools/golang/xenlight/types.gen.go | 1 + tools/libs/light/libxl_arm.c | 22 +++++++++++++--------- tools/libs/light/libxl_types.idl | 1 + tools/libs/light/libxl_virtio.c | 23 +++++++++++++++++++++-- tools/xl/xl_parse.c | 2 ++ 7 files changed, 52 insertions(+), 11 deletions(-)