[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xl, libxl: Add per-device and global permissive config options for pci passthrough
On Wed, Mar 28, 2012 at 10:20 AM, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote: > On Tue, 2012-03-27 at 18:03 +0100, George Dunlap wrote: >> 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 f744e82ea740 -r 980c34bd5e51 docs/man/xl.cfg.pod.5 >> --- a/docs/man/xl.cfg.pod.5 Wed Feb 29 16:30:34 2012 +0000 >> +++ b/docs/man/xl.cfg.pod.5 Tue Mar 27 18:02:41 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 f744e82ea740 -r 980c34bd5e51 tools/libxl/libxl_pci.c >> --- a/tools/libxl/libxl_pci.c Wed Feb 29 16:30:34 2012 +0000 >> +++ b/tools/libxl/libxl_pci.c Tue Mar 27 18:02:41 2012 +0100 >> @@ -165,6 +165,8 @@ int libxl_device_pci_parse_bdf(libxl_ctx > > This should probably actually be in libxlu rather than libxl. But no > need to fix that here. (I'll send a follow up if you like). > >> pcidev->msitranslate = atoi(tok); >> }else if ( !strcmp(optkey, "power_mgmt") ) { >> pcidev->power_mgmt = atoi(tok); >> + }else if ( !strcmp(optkey, "permissive") ) { >> + pcidev->permissive = atoi(tok); >> }else{ >> LIBXL__LOG(ctx, LIBXL__LOG_WARNING, >> "Unknown PCI BDF option: %s", optkey); >> @@ -198,7 +200,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)); >> flexarray_append_pair(back, libxl__sprintf(gc, "state-%d", num), >> libxl__sprintf(gc, "%d", 1)); >> } >> >> @@ -708,6 +713,20 @@ 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) { >> + sysfs_path = libxl__sprintf(gc, >> SYSFS_PCIBACK_DRIVER"/permissive"); >> + f = fopen(sysfs_path, "w"); >> + if (f == NULL) { >> + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Couldn't open %s", >> + sysfs_path); >> + goto out; >> + } >> + fprintf(f, PCI_BDF, pcidev->domain, pcidev->bus, >> + pcidev->dev, pcidev->func); >> + fclose(f); >> + } >> break; >> } >> default: >> @@ -1101,6 +1120,9 @@ static void libxl__device_pci_from_xs_be >> } else if (!strcmp(p, "power_mgmt")) { >> p = strtok_r(NULL, ",=", &saveptr); >> pci->power_mgmt = atoi(p); >> + } else if (!strcmp(p, "permissive")) { >> + p = strtok_r(NULL, ",=", &saveptr); >> + pci->permissive = atoi(p); >> } >> } while ((p = strtok_r(NULL, ",=", &saveptr)) != NULL); >> } >> diff -r f744e82ea740 -r 980c34bd5e51 tools/libxl/libxl_types.idl >> --- a/tools/libxl/libxl_types.idl Wed Feb 29 16:30:34 2012 +0000 >> +++ b/tools/libxl/libxl_types.idl Tue Mar 27 18:02:41 2012 +0100 >> @@ -352,6 +352,7 @@ libxl_device_pci = Struct("device_pci", >> ("vfunc_mask", uint32), >> ("msitranslate", bool), >> ("power_mgmt", bool), >> + ("permissive", bool), >> ]) >> >> libxl_diskinfo = Struct("diskinfo", [ >> diff -r f744e82ea740 -r 980c34bd5e51 tools/libxl/xl_cmdimpl.c >> --- a/tools/libxl/xl_cmdimpl.c Wed Feb 29 16:30:34 2012 +0000 >> +++ b/tools/libxl/xl_cmdimpl.c Tue Mar 27 18:02:41 2012 +0100 >> @@ -518,6 +518,7 @@ static void parse_config_data(const char >> XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids; >> int pci_power_mgmt = 0; >> int pci_msitranslate = 1; >> + int pci_permissive = 0; >> int e; >> >> libxl_domain_create_info *c_info = &d_config->c_info; >> @@ -986,6 +987,9 @@ skip_vfb: >> if (!xlu_cfg_get_long (config, "pci_power_mgmt", &l, 0)) >> pci_power_mgmt = l; >> >> + if (!xlu_cfg_get_long (config, "pci_permissive", &l, 0)) >> + pci_permissive = l; >> + >> /* To be reworked (automatically enabled) once the auto ballooning >> * after guest starts is done (with PCI devices passed in). */ >> if (c_info->type == LIBXL_DOMAIN_TYPE_PV) { >> @@ -1005,6 +1009,7 @@ skip_vfb: >> >> pcidev->msitranslate = pci_msitranslate; >> pcidev->power_mgmt = pci_power_mgmt; >> + pcidev->permissive = pci_permissive; >> if (!libxl_device_pci_parse_bdf(ctx, pcidev, buf)) >> d_config->num_pcidevs++; >> } >> diff -r f744e82ea740 -r 980c34bd5e51 tools/libxl/xl_sxp.c >> --- a/tools/libxl/xl_sxp.c Wed Feb 29 16:30:34 2012 +0000 >> +++ b/tools/libxl/xl_sxp.c Tue Mar 27 18:02:41 2012 +0100 > > This file/function is provided only for compatibility with xend, is this > the precise syntax used by xend? There is no need to update this SXP > unless someone reports and incompatibility (although if you happen to > know what the xend output is you may as well). Ah, right -- in that case, this hunk should probably be taken out, as xend uses a different method of marking a device permissive. I'm going to write a patch that adds an option to automatically do unbinding and binding; so I'll just re-send this one as part of a series with that, and a patch that moves all the parsing stuff to libxlu. -George > > Otherwise: > > Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > >> @@ -199,9 +199,10 @@ void printf_info_sexp(int domid, libxl_d >> d_config->pcidevs[i].domain, d_config->pcidevs[i].bus, >> d_config->pcidevs[i].dev, d_config->pcidevs[i].func, >> d_config->pcidevs[i].vdevfn); >> - printf("\t\t\t(opts msitranslate %d power_mgmt %d)\n", >> + printf("\t\t\t(opts msitranslate %d power_mgmt %d permissive %d)\n", >> d_config->pcidevs[i].msitranslate, >> - d_config->pcidevs[i].power_mgmt); >> + d_config->pcidevs[i].power_mgmt, >> + d_config->pcidevs[i].permissive); >> printf("\t\t)\n"); >> printf("\t)\n"); >> } >> >> _______________________________________________ >> 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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |