[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2 of 2] xl, libxl: Add per-device and global permissive config options for pci passthrough
On Mon, 2012-04-02 at 11:47 +0100, George Dunlap wrote: > # HG changeset patch > # User George Dunlap <george.dunlap@xxxxxxxxxxxxx> > # Date 1333363500 -3600 > # Node ID 62b1030a2485536caf995b825bee9e8255f914b3 > # Parent 5386937e6c5c9afaa8a3cd56d391dcc9e40d0596 > xl,libxl: Add per-device and global permissive config options for pci > passthrough > > By default pciback only allows PV guests to write "known safe" values into > PCI config space. But many devices require writes to other areas of config > space in order to operate properly. One way to do that is with the "quirks" > interface, which specifies areas known safe to a particular device; the > other way is to mark a device as "permissive", which tells pciback to allow > all config space writes for that domain and device. > > This adds a "permissive" flag to the libxl_pci struct and teaches libxl how > to write the appropriate value into sysfs to enable the permissive feature for > devices being passed through. It also adds the permissive config options > either > on a per-device basis, or as a global option in the xl command-line. > > Because of the potential stability and security implications of enabling > permissive, the flag is left off by default. > > Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> > > diff -r 5386937e6c5c -r 62b1030a2485 docs/man/xl.cfg.pod.5 > --- a/docs/man/xl.cfg.pod.5 Mon Apr 02 11:29:34 2012 +0100 > +++ b/docs/man/xl.cfg.pod.5 Mon Apr 02 11:45:00 2012 +0100 > @@ -294,10 +294,25 @@ XXX > > XXX > > +=item B<permissive=BOOLEAN> > + > +By default pciback only allows PV guests to write "known safe" values into > +PCI config space. But many devices require writes to other areas of config > +space in order to operate properly. This tells the pciback driver to > +allow all writes to PCI config space for this domain and this device. This > +option should be enabled with caution, as there may be stability or security > +implications of doing so. > + > =back > > =back > > +=item B<pci_permissive=BOOLEAN> > + > +Changes the default value of 'permissive' for all PCI devices for this > +VM. This can still be overriden on a per-device basis. See the > +"pci=" section for more information on the "permissive" flag. > + > =back > > =head2 Paravirtualised (PV) Guest Specific Options > diff -r 5386937e6c5c -r 62b1030a2485 tools/libxl/libxl_pci.c > --- a/tools/libxl/libxl_pci.c Mon Apr 02 11:29:34 2012 +0100 > +++ b/tools/libxl/libxl_pci.c Mon Apr 02 11:45:00 2012 +0100 > @@ -55,7 +55,10 @@ static void libxl_create_pci_backend_dev > if (pcidev->vdevfn) > flexarray_append_pair(back, libxl__sprintf(gc, "vdevfn-%d", num), > libxl__sprintf(gc, "%x", pcidev->vdevfn)); > flexarray_append(back, libxl__sprintf(gc, "opts-%d", num)); > - flexarray_append(back, libxl__sprintf(gc, > "msitranslate=%d,power_mgmt=%d", pcidev->msitranslate, pcidev->power_mgmt)); > + flexarray_append(back, > + libxl__sprintf(gc, > "msitranslate=%d,power_mgmt=%d,permissive=%d", > + pcidev->msitranslate, pcidev->power_mgmt, > + pcidev->permissive)); Since we are already writing this key, and AFAICT this matches xend's behaviour, I think it is correct to add the new parameter here. But... Does anything actually read this key? I can't find anything in pciback or qemu. > flexarray_append_pair(back, libxl__sprintf(gc, "state-%d", num), > libxl__sprintf(gc, "%d", 1)); > } > > @@ -565,6 +568,29 @@ static int do_pci_add(libxl__gc *gc, uin > } > } > fclose(f); > + > + /* Don't restrict writes to the PCI config space from this VM */ > + if (pcidev->permissive) { > + int fd; > + char *buf; > + > + sysfs_path = libxl__sprintf(gc, > SYSFS_PCIBACK_DRIVER"/permissive"); > + fd = open(sysfs_path, O_WRONLY); > + if (fd < 0) { > + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Couldn't open %s", > + sysfs_path); > + goto out; Why not either fall through (i.e. accept this as a soft failure) or return an actual error here? FWIW I think the case where we cannot open the sysfs "irq" node and "goto out" is also similarly wrong. > + } > + > + buf = libxl__sprintf(gc, PCI_BDF, pcidev->domain, pcidev->bus, > + pcidev->dev, pcidev->func); > + rc = write(fd, buf, strlen(buf)); > + if (rc < 0) > + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "write to %s > returned %d", > + sysfs_path, rc); > + close(fd); > + goto out; I don't think this makes sense, out is the next thing we actually get to anyway and there is a "break" out of the switch right below. > + } > break; > } > default: Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |