[libvirt] [PATCH] Add migration APIs for libxl driver
Add migration APIs for libxl driver. Implemented in migration version 3. Based on xen 4.1. Signed-off-by: Chunyan Liu cy...@suse.com --- src/libxl/libxl_driver.c | 617 ++ src/libxl/libxl_driver.h | 17 ++- 2 files changed, 632 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d5fa64a..4037635 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -30,6 +30,12 @@ #include math.h #include libxl.h #include fcntl.h +#include stdlib.h +#include string.h +#include sys/types.h +#include sys/socket.h +#include arpa/inet.h +#include netdb.h #include internal.h #include logging.h @@ -60,6 +66,13 @@ #define XEN_SCHED_CREDIT_NPARAM 2 static libxlDriverPrivatePtr libxl_driver = NULL; +static virThread migrate_receive_thread; + +typedef struct migrate_receive_args { +virConnectPtr conn; +virDomainObjPtr vm; +int sockfd; +} migrate_receive_args; /* Function declarations */ static int @@ -1095,6 +1108,17 @@ libxlClose(virConnectPtr conn ATTRIBUTE_UNUSED) return 0; } +static int +libxlSupportsFeature(virConnectPtr conn ATTRIBUTE_UNUSED, int feature) +{ +switch (feature) { +case VIR_DRV_FEATURE_MIGRATION_V3: +return 1; +default: +return 0; +} +} + static const char * libxlGetType(virConnectPtr conn ATTRIBUTE_UNUSED) { @@ -3842,12 +3866,600 @@ libxlIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED) return 1; } +static int libxlReadFixedMessage(int fd, const void *msg, int msgsz) +{ +char buf[msgsz]; + +if (saferead(fd, buf, msgsz) != msgsz || memcmp(buf, msg, msgsz)) { +return -1; +} + +return 0; +} + +static int doParseURI(const char *uri, char **p_hostname, int *p_port) +{ +char *p, *hostname; +char port[16] = 0; + +if (strstr (uri, //)) { /* Full URI. */ +virURIPtr uriptr = virURIParse(uri); +if (!uriptr) { +libxlError(VIR_ERR_INVALID_ARG, + _(Invalid URI)); +return -1; +} +if (uriptr-scheme STRCASENEQ(uriptr-scheme, xlmigr)) { +libxlError(VIR_ERR_INVALID_ARG, +_(Only xlmigr:// + migrations are supported by Xen)); +xmlFreeURI(uriptr); +return -1; +} +if (!uriptr-server) { +libxlError(VIR_ERR_INVALID_ARG, + _(A hostname must be + specified in the URI)); +xmlFreeURI(uriptr); +return -1; +} +hostname = strdup(uriptr-server); +if (!hostname) { +virReportOOMError(); +xmlFreeURI(uriptr); +return -1; +} +if (uriptr-port) +snprintf(port, sizeof(port), %d, uriptr-port); +xmlFreeURI(uriptr); +} +else if ((p = strrchr(uri, ':')) != NULL) { /* hostname:port */ +int port_nr, n; + +if (virStrToLong_i(p+1, NULL, 10, port_nr) 0) { +libxlError(VIR_ERR_INVALID_ARG, + _(Invalid port number)); +return -1; +} +snprintf(port, sizeof(port), %d, port_nr); + +/* Get the hostname. */ +n = p - uri; /* n = Length of hostname in bytes. */ +hostname = strdup(uri); +if (!hostname) { +virReportOOMError(); +return -1; +} +hostname[n] = '\0'; +} +else {/* hostname (or IP address) */ +hostname = strdup(uri); +if (!hostname) { +virReportOOMError(); +return -1; +} +} +*p_hostname = hostname; +*p_port = atoi(port); +return 0; +} + +static bool libxlMigrationFromIsAllowed(libxlDriverPrivatePtr driver, virDomainObjPtr vm) +{ +/* to be extended */ +VIR_DEBUG(driver=%p, vm=%p, driver, vm); +return true; +} + +static bool libxlMigrationToIsAllowed(libxlDriverPrivatePtr driver, virDomainDefPtr def) +{ +/* to be extended */ +VIR_DEBUG(driver=%p, def=%p, driver, def); +return true; +} + +static char * +libxlDomainMigrateBegin3(virDomainPtr domain, + const char *xmlin, + char **cookieout ATTRIBUTE_UNUSED, + int *cookieoutlen ATTRIBUTE_UNUSED, + unsigned long flags, + const char *dname ATTRIBUTE_UNUSED, + unsigned long resource ATTRIBUTE_UNUSED) +{ +libxlDriverPrivatePtr driver = domain-conn-privateData; +virDomainObjPtr vm; +virDomainDefPtr def = NULL; +char *xml = NULL; + +virCheckFlags(LIBXL_MIGRATION_FLAGS, NULL); + +libxlDriverLock(driver); +vm = virDomainFindByUUID(driver-domains, domain-uuid); +if (!vm) { +char uuidstr[VIR_UUID_STRING_BUFLEN]; +virUUIDFormat(domain-uuid, uuidstr); +libxlError
Re: [libvirt] [PATCH] Add migration APIs for libxl driver
Chun Yan Liu cy...@suse.com 3/6/2012 2:29 PM I didn't get a chance to test this yet, but have some initial review comments. Signed-off-by: Chunyan Liu --- src/libxl/libxl_driver.c | 617 ++ src/libxl/libxl_driver.h | 17 ++- 2 files changed, 632 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d5fa64a..4037635 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -30,6 +30,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include internal.h #include logging.h @@ -60,6 +66,13 @@ #define XEN_SCHED_CREDIT_NPARAM 2 static libxlDriverPrivatePtr libxl_driver = NULL; +static virThread migrate_receive_thread; This prevents receiving concurrent migrations. Yes. It is a problem. Defined as static is to be used in Begin3 function virThreadCreate and in Finish3() function virThreadJoin, but actually the thread will exit when receiving data completed or meets error, so virThreadJoin doesn't have much effect here. If a call of virThreadJoin is not needed, then can specify migrate_receive_thread as a local variable. About concurrent migrations, there is another problem in migration port. Every time a migration operation is issued, it will create a socket connection between source and host to transfer data. If a port specified, target side will create a socket and bind to that port, otherwise will bind to a DEFAULT_MIGRATION_PORT (current implementation). But if 1st migration occupies the DEFAULT_MIGRATION_PORT, then 2nd migration (without specifying port) will fail to bind to the DEFAULT_MIGRATION_PORT again. So, to ensure concurrent migrations, perhaps we need a group of ports for migration usage, every migration operation probes for a usable port. How do you think? Thanks, Chunyan -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] Add migration APIs for libxl driver
Hi, Jim, I made some changes to the patch according to your comments: a. support concurrent migrations, add virBitmapPtr for probing migration ports b. update doParseURI: use virAsprintf instead of strdup and snprintf, support migration URI syntax hostname[:port], remove xlmigr scheme c. drop lock of driver while doing doMigrateSend d. fix extra whitespace and parameter alignment and other places mentioned Not changed: a. ensure the name provided in xmlin is the same as def-name. Since we support domain name change, so I think the name could be different. Keep not checked. b. leaks the original name. It seems the original name won't be used again, so didn't save original name. Keep it as before. c. about migrate_receive_args. It's only used in dst side. If send logic and receive logic still matches, extending the structure won't cause problem. But if send logic and receive logic cannot match, there will problem. Still think about how to handle it. Any further comments will be very appreciated. Thanks for your time! Signed-off-by: Chunyan Liu cy...@suse.com --- src/libxl/libxl_conf.h |1 + src/libxl/libxl_driver.c | 634 ++ src/libxl/libxl_driver.h | 20 ++- 3 files changed, 653 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 2820afb..dd59817 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -61,6 +61,7 @@ struct _libxlDriverPrivate { libxl_ctx ctx; virBitmapPtr reservedVNCPorts; +virBitmapPtr reservedMigPorts; /* reserved migration ports */ virDomainObjList domains; virDomainEventStatePtr domainEventState; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d5fa64a..5dc29a0 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -30,6 +30,12 @@ #include math.h #include libxl.h #include fcntl.h +#include stdlib.h +#include string.h +#include sys/types.h +#include sys/socket.h +#include arpa/inet.h +#include netdb.h #include internal.h #include logging.h @@ -61,6 +67,12 @@ static libxlDriverPrivatePtr libxl_driver = NULL; +typedef struct migrate_receive_args { +virConnectPtr conn; +virDomainObjPtr vm; +int sockfd; +} migrate_receive_args; + /* Function declarations */ static int libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, @@ -810,6 +822,7 @@ libxlShutdown(void) VIR_FORCE_FCLOSE(libxl_driver-logger_file); virBitmapFree(libxl_driver-reservedVNCPorts); +virBitmapFree(libxl_driver-reservedMigPorts); VIR_FREE(libxl_driver-configDir); VIR_FREE(libxl_driver-autostartDir); @@ -865,6 +878,10 @@ libxlStartup(int privileged) { virBitmapAlloc(LIBXL_VNC_PORT_MAX - LIBXL_VNC_PORT_MIN)) == NULL) goto out_of_memory; +if ((libxl_driver-reservedMigPorts = + virBitmapAlloc(LIBXL_MIGRATION_MAX_PORT - LIBXL_MIGRATION_MIN_PORT)) == NULL) +goto out_of_memory; + if (virDomainObjListInit(libxl_driver-domains) 0) goto out_of_memory; @@ -1095,6 +1112,17 @@ libxlClose(virConnectPtr conn ATTRIBUTE_UNUSED) return 0; } +static int +libxlSupportsFeature(virConnectPtr conn ATTRIBUTE_UNUSED, int feature) +{ +switch (feature) { +case VIR_DRV_FEATURE_MIGRATION_V3: +return 1; +default: +return 0; +} +} + static const char * libxlGetType(virConnectPtr conn ATTRIBUTE_UNUSED) { @@ -3842,12 +3870,613 @@ libxlIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED) return 1; } +static int libxlReadFixedMessage(int fd, const void *msg, int msgsz) +{ +char buf[msgsz]; + +if (saferead(fd, buf, msgsz) != msgsz || memcmp(buf, msg, msgsz)) { +return -1; +} + +return 0; +} + +static int doParseURI(const char *uri, char **p_hostname, int *p_port) +{ +char *p, *hostname; +int port_nr = 0; + +if (uri == NULL) +return -1; + +/* URI passed is a string hostname[:port] */ +if ((p = strrchr(uri, ':')) != NULL) { /* hostname:port */ +int n; + +if (virStrToLong_i(p+1, NULL, 10, port_nr) 0) { +libxlError(VIR_ERR_INVALID_ARG, +_(Invalid port number)); +return -1; +} + +/* Get the hostname. */ +n = p - uri; /* n = Length of hostname in bytes. */ +if (n = 0) { +libxlError(VIR_ERR_INVALID_ARG, + _(Hostname must be specified in the URI)); +return -1; +} + +if (virAsprintf(hostname, %s, uri) 0) { +virReportOOMError(); +return -1; +} + +hostname[n] = '\0'; +} +else {/* hostname (or IP address) */ +if (virAsprintf(hostname, %s, uri) 0) { +virReportOOMError(); +return -1; +} +} +*p_hostname = hostname; +*p_port = port_nr; +return 0; +} + +static char * +libxlDomainMigrateBegin3(virDomainPtr domain
Re: [libvirt] [PATCH] Add migration APIs for libxl driver
2012/3/15 Jim Fehlig jfeh...@suse.com While testing this patch, I noticed some strange problems wrt concurrent operations in the driver. E.g. if I start a migration and then query dominfo on the migrating domain, it kills the migration xen134: # virsh migrate --live sles11sp1-pv xen+ssh://xen142 error: internal error Failed to save domain '7' with libxenlight Strange. Found that doing whatever operation that needs to open a connect to the hypervisor (even virsh version) will cause the same issue to live migration. While trying operation that calls do_open the connect, xc_shadow_control( in xc_domain_save) will fail. Non-live migration is OK. Thanks! Jim -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] Add migration APIs for libxl driver
2012/3/19 Daniel P. Berrange berra...@redhat.com On Fri, Mar 09, 2012 at 06:55:55PM +0800, Chunyan Liu wrote: diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d5fa64a..5dc29a0 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c +static int doParseURI(const char *uri, char **p_hostname, int *p_port) +{ +char *p, *hostname; +int port_nr = 0; + +if (uri == NULL) +return -1; + +/* URI passed is a string hostname[:port] */ +if ((p = strrchr(uri, ':')) != NULL) { /* hostname:port */ +int n; + +if (virStrToLong_i(p+1, NULL, 10, port_nr) 0) { +libxlError(VIR_ERR_INVALID_ARG, +_(Invalid port number)); +return -1; +} + +/* Get the hostname. */ +n = p - uri; /* n = Length of hostname in bytes. */ +if (n = 0) { +libxlError(VIR_ERR_INVALID_ARG, + _(Hostname must be specified in the URI)); +return -1; +} + +if (virAsprintf(hostname, %s, uri) 0) { +virReportOOMError(); +return -1; +} + +hostname[n] = '\0'; +} +else {/* hostname (or IP address) */ +if (virAsprintf(hostname, %s, uri) 0) { +virReportOOMError(); +return -1; +} +} +*p_hostname = hostname; +*p_port = port_nr; +return 0; +} Lets not re-invent URI parsing code with wierd special cases for base hostnames. Please just use virURIParse, since there is no compatibility issue here. virURIParse can only parse full URI format like xenmigr://destIP:port, cannot handle simple URI like destIP:port correctly. Both xen_driver and qemu_driver have extra code like in doParseURI to handle the simple URI case. For libxl driver, currently use syntax: virsh migrate domU xen+ssh://destIP destIP[:port], so to parse hostname and port, need extra code to handle that but not virURIParse. And since there are several places that need to parse port, so I extract the code to function doParseURI. -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] separate module for pci passthrough device assigning and in-use tracking
Hi, Shradha, Laine Some time before I found you had a thread discussing in-use tracking for network and pci-passthrough devices[1], it mentioned code for tracking pci device allocation should be better as a separate module rather than a part of qemu, so that it could solve data sharing problem between hypervisor drivers and network driver. And after that, we wanted to add pci passthrough support to libxl driver[2], which turned to be the same problem, data sharing between libxl driver and other drivers, and there were code duplication between libxl and qemu driver. Laine suggested again to write code in common library as a separate module. Now I wonder if there is anyone already worked and pushed this thing to some status? If not, I am willing to try it. Thanks, Chunyan -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] doc: write separate module for hostdev passthrough and in-use tracking
Hi, List, As the mail I've sent a week before: https://www.redhat.com/archives/libvir-list/2013-March/msg00730.html I'm willing to push this work forward so that the passthrough APIs could be reused by qemu driver and libxl driver (which doesn't support pci passthrough yet and tries to add this function recently), or other drivers. But since this work affacts a lot, I'm not sure if I can control it in a correct way. I write a draft to describe what I'm considering how to do, as in the following and in attachment. Hope to get your review, comment and guidence to improve the work before start coding. Any feedback will be very appreciated! Thanks! Chunyan DRAFT: Write separate module for hostdev passthrough 1. Purposes: * Move hostdev passthrough APIs from qemu_hostdev.ch to separate module so that they could be reused by other hypervisors too * Maintain global in-use state of hostdevs 2. Module design (draft): * New module name: hostdev_driver * New module files: hostdev_driver.ch hostdev_conf.ch * New Definitions: ## [src/driver.h] typedef struct _virHostdevDriver virHostdevDriver; typedef virHostdevDriver *virHostdevDriverPtr; struct _virHosedevDriver { const char *name; virDrvOpen open; virDrvClose close; virDrvPrepareHostdevsprepareHostdevs; virDrvPreparePciHostdevspreparePciHostdevs; virDrvprepareUsbHostdevsprepareUsbHostdevs; virDrvReattachHostdevsreattachHostdevs; virDrvReattachPciHostdevsreattachPciHostdevs; virDrvReattachUsbHostdevs reattachUsbHostdevs; virDrvGetActivePciHostdevList getActivePciHostdevList; virDrvGetActiveUsbHostdevList getActiveUsbHostdevList; virDrvGetDomainActivePciHostdevList getDomainActivePciHostdevList; virDrvGetDomainActiveUsbHostdevList getDomainActiveUsbHostdevList; }; ## [src/hostdev/hostdev_conf.h] typedef struct _virHostdevDriverState virHostdevDriverState; typedef virHostdevDriverState *virHostdevDriverStatePtr; struct _virHostdevDriverState { virMutex lock; virPCIDeviceListPtr activePciHostdevs; virPCIDeviceListPtr inactivePciHostdevs; virUSBDeviceListPtr activeUsbHostdevs; }; ## [src/hostdev/hostdev_driver.c] static virHostdevDriver hostdevDriver = { .name = hostdev, .open = hostdevDriverOpen, .close = hostdevDriverClose, .prepareHostdevs = virPrepareHostdevs, .preparePciHostdevs = virPreparePciHostdevs, .prepareUsbHostdevs = virPrepareUsbHostdevs .reattachHostdevs = virReattachHostdevs, .reattachPciHostdevs = virReattachPciHostdevs, .reattachUsbHostdevs = virReattachUsbHostdevs, .getActivePciHostdevList = virGetActivePciHostdevList, .getActiveUsbHostdevList = virGetActiveUsbHostdevList, .getDomainActivePciHostdevList = virGetDomainActivePciHostdevList, .getDomainActiveUsbHostdevList = virGetDomainActiveUsbHostdevList, }; static virStateDriver hostdevStateDriver = { .name = hostdev, .initialize = hostdevDriverStartup, .cleanup = hostdevDriverCleanup, .reload = hostdevDriverReload, }; * Changed Definitions: struct _virPCIDevice { .. --- const char*used_by; /* The domain which uses the device */ +++ virDomainObjPtr used_by; /* include domname and conn info */ .. }; struct _virUSBDevice { .. --- const char*used_by; /* name of the domain using this dev */ +++ virDomainObjPtr used_by; /* include domname and conn info */ }; * APIs: typedef int (*virDrvPrepareHostdevs)(virHostdevDriverPtr driver, virDomainObjPtr vm, unsigned int flags); /* - workflow: call PrepareHostdevPciDevices and PrepareHostdevUsbDevices to do specific work. - reference: int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, bool coldBoot); - new parameter: - flags: - could set coldBoot for usb usage - could set hypervisor tag since for qemu it will use pci-stub, for libxl, it will use pciback. */ typedef int (*virDrvPreparePciHostdevs)(virHostdevDriverPtr driver, virDomainObjPtr vm,
Re: [libvirt] doc: write separate module for hostdev passthrough and in-use tracking
2013/3/22 Osier Yang jy...@redhat.com: On 2013年03月22日 17:36, Chunyan Liu wrote: Hi, List, As the mail I've sent a week before: https://www.redhat.com/archives/libvir-list/2013-March/msg00730.html I'm willing to push this work forward so that the passthrough APIs could be reused by qemu driver and libxl driver (which doesn't support pci passthrough yet and tries to add this function recently), or other drivers. But since this work affacts a lot, I'm not sure if I can control it in a correct way. I write a draft to describe what I'm considering how to do, as in the following and in attachment. Hope to get your review, comment and guidence to improve the work before start coding. Any feedback will be very appreciated! Thanks! Chunyan DRAFT: Write separate module for hostdev passthrough Cool. we lacked this for a time. 1. Purposes: * Move hostdev passthrough APIs from qemu_hostdev.ch to separate module so that they could be reused by other hypervisors too * Maintain global in-use state of hostdevs This is more important than the code-reuse. 2. Module design (draft): * New module name: hostdev_driver * New module files: hostdev_driver.ch hostdev_conf.ch * New Definitions: ## [src/driver.h] typedef struct _virHostdevDriver virHostdevDriver; typedef virHostdevDriver *virHostdevDriverPtr; struct _virHosedevDriver { const char *name; virDrvOpen open; virDrvClose close; virDrvPrepareHostdevsprepareHostdevs; virDrvPreparePciHostdevspreparePciHostdevs; virDrvprepareUsbHostdevsprepareUsbHostdevs; In case of you want to expose prepareHostdevs, no need to expose preparePciHostdevs and prepareUsbHostdevs? Thanks very much for your comments. Exposing these two APIs is considering that some driver may supports one but not another, so that it could call specific API. But we can use support flag in prepareHostdevs to control that, in this way not need these two APIs. virDrvReattachHostdevsreattachHostdevs; virDrvReattachPciHostdevsreattachPciHostdevs; virDrvReattachUsbHostdevs reattachUsbHostdevs; Likewise. virDrvGetActivePciHostdevList getActivePciHostdevList; virDrvGetActiveUsbHostdevList getActiveUsbHostdevList; virDrvGetDomainActivePciHostdevList getDomainActivePciHostdevList; virDrvGetDomainActiveUsbHostdevList getDomainActiveUsbHostdevList; These APIs are useful for upper layer management too. I have once wanted to create similiar APIs, but only tended for qemu driver at that time. But except these 4 get APIs, others are only useful for other drivers (internally), useless for upper layer management. That's true. Do we really want a driver instead of just an internal share module? Like src/nodeinfo.[ch], and with it we still can expose APIs like the 4 get APIs. Do you mean add src/hostdev.[ch] and do all work there? Think a while, I think it can achieve too. Then do we need to differentiate 4 get APIs and other APIs? }; ## [src/hostdev/hostdev_conf.h] typedef struct _virHostdevDriverState virHostdevDriverState; typedef virHostdevDriverState *virHostdevDriverStatePtr; struct _virHostdevDriverState { virMutex lock; virPCIDeviceListPtr activePciHostdevs; virPCIDeviceListPtr inactivePciHostdevs; virUSBDeviceListPtr activeUsbHostdevs; }; ## [src/hostdev/hostdev_driver.c] static virHostdevDriver hostdevDriver = { .name = hostdev, .open = hostdevDriverOpen, .close = hostdevDriverClose, .prepareHostdevs = virPrepareHostdevs, .preparePciHostdevs = virPreparePciHostdevs, .prepareUsbHostdevs = virPrepareUsbHostdevs .reattachHostdevs = virReattachHostdevs, .reattachPciHostdevs = virReattachPciHostdevs, .reattachUsbHostdevs = virReattachUsbHostdevs, .getActivePciHostdevList = virGetActivePciHostdevList, .getActiveUsbHostdevList = virGetActiveUsbHostdevList, .getDomainActivePciHostdevList = virGetDomainActivePciHostdevList, .getDomainActiveUsbHostdevList = virGetDomainActiveUsbHostdevList, }; static virStateDriver hostdevStateDriver = { .name = hostdev, .initialize = hostdevDriverStartup, .cleanup = hostdevDriverCleanup, .reload = hostdevDriverReload, }; * Changed Definitions: struct _virPCIDevice { .. --- const char*used_by
Re: [libvirt] doc: write separate module for hostdev passthrough and in-use tracking
2013/3/26 Osier Yang jy...@redhat.com: On 25/03/13 14:51, Chunyan Liu wrote: 2013/3/22 Osier Yang jy...@redhat.com: On 2013年03月22日 17:36, Chunyan Liu wrote: Hi, List, As the mail I've sent a week before: https://www.redhat.com/archives/libvir-list/2013-March/msg00730.html I'm willing to push this work forward so that the passthrough APIs could be reused by qemu driver and libxl driver (which doesn't support pci passthrough yet and tries to add this function recently), or other drivers. But since this work affacts a lot, I'm not sure if I can control it in a correct way. I write a draft to describe what I'm considering how to do, as in the following and in attachment. Hope to get your review, comment and guidence to improve the work before start coding. Any feedback will be very appreciated! Thanks! Chunyan DRAFT: Write separate module for hostdev passthrough Cool. we lacked this for a time. 1. Purposes: * Move hostdev passthrough APIs from qemu_hostdev.ch to separate module so that they could be reused by other hypervisors too * Maintain global in-use state of hostdevs This is more important than the code-reuse. 2. Module design (draft): * New module name: hostdev_driver * New module files: hostdev_driver.ch hostdev_conf.ch * New Definitions: ## [src/driver.h] typedef struct _virHostdevDriver virHostdevDriver; typedef virHostdevDriver *virHostdevDriverPtr; struct _virHosedevDriver { const char *name; virDrvOpen open; virDrvClose close; virDrvPrepareHostdevsprepareHostdevs; virDrvPreparePciHostdevspreparePciHostdevs; virDrvprepareUsbHostdevsprepareUsbHostdevs; In case of you want to expose prepareHostdevs, no need to expose preparePciHostdevs and prepareUsbHostdevs? Thanks very much for your comments. Exposing these two APIs is considering that some driver may supports one but not another, so that it could call specific API. But we can use support flag in prepareHostdevs to control that, in this way not need these two APIs virDrvReattachHostdevsreattachHostdevs; virDrvReattachPciHostdevsreattachPciHostdevs; virDrvReattachUsbHostdevs reattachUsbHostdevs; Likewise. virDrvGetActivePciHostdevList getActivePciHostdevList; virDrvGetActiveUsbHostdevList getActiveUsbHostdevList; virDrvGetDomainActivePciHostdevList getDomainActivePciHostdevList; virDrvGetDomainActiveUsbHostdevList getDomainActiveUsbHostdevList; These APIs are useful for upper layer management too. I have once wanted to create similiar APIs, but only tended for qemu driver at that time. But except these 4 get APIs, others are only useful for other drivers (internally), useless for upper layer management. That's true. Do we really want a driver instead of just an internal share module? Like src/nodeinfo.[ch], and with it we still can expose APIs like the 4 get APIs. Do you mean add src/hostdev.[ch] and do all work there? Think a while, I think it can achieve too. Yes. Then do we need to differentiate 4 get APIs and other APIs? Not sure about you meaning here. Sorry, I meant: since the 4 get APIs could be used by upper layer management, other APIs like prepareHostdevs and reattachHostdevs are only used internally, should we place them separately, like in separate header files? or trace them no difference? But you can take the existing APIs like virNodeSetMemoryParameters as examples. The API is implemented in src/nodeinfo.[ch], but each driver can use it. }; ## [src/hostdev/hostdev_conf.h] typedef struct _virHostdevDriverState virHostdevDriverState; typedef virHostdevDriverState *virHostdevDriverStatePtr; struct _virHostdevDriverState { virMutex lock; virPCIDeviceListPtr activePciHostdevs; virPCIDeviceListPtr inactivePciHostdevs; virUSBDeviceListPtr activeUsbHostdevs; }; ## [src/hostdev/hostdev_driver.c] static virHostdevDriver hostdevDriver = { .name = hostdev, .open = hostdevDriverOpen, .close = hostdevDriverClose, .prepareHostdevs = virPrepareHostdevs, .preparePciHostdevs = virPreparePciHostdevs, .prepareUsbHostdevs = virPrepareUsbHostdevs .reattachHostdevs = virReattachHostdevs, .reattachPciHostdevs = virReattachPciHostdevs, .reattachUsbHostdevs = virReattachUsbHostdevs, .getActivePciHostdevList = virGetActivePciHostdevList, .getActiveUsbHostdevList
Re: [libvirt] doc: write separate module for hostdev passthrough and in-use tracking
2013/4/17 Daniel P. Berrange berra...@redhat.com On Fri, Mar 22, 2013 at 05:36:09PM +0800, Chunyan Liu wrote: Hi, List, As the mail I've sent a week before: https://www.redhat.com/archives/libvir-list/2013-March/msg00730.html I'm willing to push this work forward so that the passthrough APIs could be reused by qemu driver and libxl driver (which doesn't support pci passthrough yet and tries to add this function recently), or other drivers. But since this work affacts a lot, I'm not sure if I can control it in a correct way. I write a draft to describe what I'm considering how to do, as in the following and in attachment. Hope to get your review, comment and guidence to improve the work before start coding. Any feedback will be very appreciated! Thanks! Chunyan DRAFT: Write separate module for hostdev passthrough 1. Purposes: * Move hostdev passthrough APIs from qemu_hostdev.ch to separate module so that they could be reused by other hypervisors too * Maintain global in-use state of hostdevs 2. Module design (draft): * New module name: hostdev_driver * New module files: hostdev_driver.ch hostdev_conf.ch * New Definitions: ## [src/driver.h] typedef struct _virHostdevDriver virHostdevDriver; typedef virHostdevDriver *virHostdevDriverPtr; struct _virHosedevDriver { const char *name; virDrvOpen open; virDrvClose close; virDrvPrepareHostdevsprepareHostdevs; virDrvPreparePciHostdevspreparePciHostdevs; virDrvprepareUsbHostdevsprepareUsbHostdevs; virDrvReattachHostdevsreattachHostdevs; virDrvReattachPciHostdevsreattachPciHostdevs; virDrvReattachUsbHostdevs reattachUsbHostdevs; virDrvGetActivePciHostdevList getActivePciHostdevList; virDrvGetActiveUsbHostdevList getActiveUsbHostdevList; virDrvGetDomainActivePciHostdevList getDomainActivePciHostdevList; virDrvGetDomainActiveUsbHostdevList getDomainActiveUsbHostdevList; }; This is real overkill - we only need to do the driver table design for things which are public APIs with multiple pluggable implementations. For this scenario, we simply need one single set of internal APIs that any of the stateful hypervisor drivers can directly call into. Basically you just need to define some object to maintain the state eg virHostdevManagerPtr and a method to get the default shared instance of it virHostdevManagerPtr virHostdevManagerGetDefault(); and then the various APIs for interacting with it virHostdevManagerPrepareHostdevs(virHostdevManagerPtr mgr, ); ...etc.. I'd just put this is all in a src/util/virhostdevmanager.{c,h} file. Got it. I'm writing it in the way you pointed, as a shared module instead of a driver, as Osier has pointed out too. Thanks for your suggestion about detail, I'll change code to follow that. Regards, Daniel -- |: http://berrange.com -o-http://www.flickr.com/photos/dberrange/:| |: http://libvirt.org -o- http://virt-manager.org:| |: http://autobuild.org -o- http://search.cpan.org/~danberr/:| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc:| -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH RESENT 02/12] libxl: PCI passthrough support
In testing, could send out in a couple of days I think. 2013/5/3 Marek Marczykowski marma...@invisiblethingslab.com On 11.04.2013 05:50, Jim Fehlig wrote: Right. Chunyan already posted such a patch series [1], but Laine noted that it would be useful to maintain the state of PCI device assignment for coordination among multiple drivers. Chunyan posted a design [2] for a hostdev passthrough driver, and IIRC she has started coding after receiving feedback from the list. Regards, Jim [1] https://www.redhat.com/archives/libvir-list/2013-January/msg00697.html [2] https://www.redhat.com/archives/libvir-list/2013-March/msg01331.html Chunyan, any progress on this? Perhaps I can help you somehow? -- Best Regards / Pozdrawiam, Marek Marczykowski Invisible Things Lab -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] add pci passthrough impl to libxl
Add pci passthrough implementation to libxl driver, using hostdev common library. --- src/libxl/libxl_conf.c | 44 src/libxl/libxl_driver.c | 21 - 2 files changed, 64 insertions(+), 1 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 1a7e430..61dfe85 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -708,6 +708,46 @@ error: return -1; } +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +int nhostdevs = def-nhostdevs; +libxl_device_pci *x_pcidevs; +int i; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) { +virReportOOMError(); +return -1; +} + +d_config-num_pcidevs = 0; +d_config-pcidevs = x_pcidevs; + +for (i = 0 ; i nhostdevs ; i++) { +virDomainHostdevDefPtr hostdev = l_hostdevs[i]; +libxl_device_pci pcidev; + +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +pcidev.domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev.bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev.dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev.func = hostdev-source.subsys.u.pci.addr.function; + +d_config-pcidevs[d_config-num_pcidevs] = pcidev; +d_config-num_pcidevs ++; +} + +return 0; +} + virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -766,6 +806,10 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, return -1; } +if (libxlMakePciList(def, d_config) 0) { +return -1; +} + d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index b39e005..d6db98a 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -45,6 +45,7 @@ #include virtypedparam.h #include viruri.h #include virstring.h +#include virhostdevmanager.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -685,13 +686,17 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason) { libxlDomainObjPrivatePtr priv = vm-privateData; - +virHostdevManagerPtr hostdev_mgr; + if (libxl_domain_destroy(priv-ctx, vm-def-id, NULL) 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _(Unable to cleanup domain %d), vm-def-id); return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +virHostdevManagerReAttachHostdevs(hostdev_mgr, xenlight, vm-def, VIR_SP_PCI_HOSTDEV); + libxlVmCleanup(driver, vm, reason); return 0; } @@ -902,6 +907,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, char *managed_save_path = NULL; int managed_save_fd = -1; libxlDomainObjPrivatePtr priv = vm-privateData; +virHostdevManagerPtr hostdev_mgr; /* If there is a managed saved state restore it instead of starting * from scratch. The old state is removed once the restoring succeeded. */ @@ -956,6 +962,12 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, goto error; } +VIR_DEBUG(Preparing host PCI devices); +hostdev_mgr = virHostdevManagerGetDefault(); +if (virHostdevManagerPrepareHostdevs(hostdev_mgr, xenlight, vm-def, VIR_SP_PCI_HOSTDEV ) 0) +goto error; + + /* use as synchronous operations = ao_how = NULL and no intermediate reports = ao_progress = NULL */ if (restore_fd 0) @@ -1049,6 +1061,7 @@ libxlReconnectDomain(virDomainObjPtr vm, libxl_dominfo d_info; int len; uint8_t *data = NULL; +virHostdevManagerPtr hostdev_mgr; virObjectLock(vm); @@ -1071,6 +1084,12 @@ libxlReconnectDomain(virDomainObjPtr vm, /* Update domid in case it changed (e.g. reboot) while we were gone? */ vm-def-id = d_info.domid; + +/* Update hostdev state */ +hostdev_mgr = virHostdevManagerGetDefault(); +if (virHostdevManagerPrepareHostdevs(hostdev_mgr, xenlight, vm-def, VIR_SP_PCI_HOSTDEV ) 0) +goto out; + virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_UNKNOWN); if (!driver-nactive driver-inhibitCallback) -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] add hostdev passthrough common library
Write separate module for hostdev passthrough so that it could be used by all hypervisor drivers and maintain a global hostdev state. --- po/POTFILES.in |1 + src/Makefile.am |1 + src/libvirt.c|5 + src/libvirt_private.syms | 15 + src/util/virhostdevmanager.c | 1218 ++ src/util/virhostdevmanager.h | 91 src/util/virpci.c| 17 +- src/util/virpci.h|7 +- src/util/virusb.c| 19 +- src/util/virusb.h|4 +- 10 files changed, 1362 insertions(+), 16 deletions(-) create mode 100644 src/util/virhostdevmanager.c create mode 100644 src/util/virhostdevmanager.h diff --git a/po/POTFILES.in b/po/POTFILES.in index f3ea4da..a7c21bf 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -188,6 +188,7 @@ src/util/viruri.c src/util/virusb.c src/util/virutil.c src/util/virxml.c +src/util/virhostdevmanager.c src/vbox/vbox_MSCOMGlue.c src/vbox/vbox_XPCOMCGlue.c src/vbox/vbox_driver.c diff --git a/src/Makefile.am b/src/Makefile.am index 4312c3c..a197c2b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -130,6 +130,7 @@ UTIL_SOURCES = \ util/virutil.c util/virutil.h \ util/viruuid.c util/viruuid.h \ util/virxml.c util/virxml.h \ +util/virhostdevmanager.c util/virhostdevmanager.h \ $(NULL) diff --git a/src/libvirt.c b/src/libvirt.c index 2b3515e..d9af5a6 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -65,6 +65,7 @@ #include virthread.h #include virstring.h #include virutil.h +#include virhostdevmanager.h #ifdef WITH_TEST # include test/test_driver.h @@ -827,6 +828,7 @@ int virStateInitialize(bool privileged, if (virInitialize() 0) return -1; +virHostdevManagerInit(); for (i = 0 ; i virStateDriverTabCount ; i++) { if (virStateDriverTab[i]-stateInitialize) { VIR_DEBUG(Running global init for %s state driver, @@ -858,6 +860,9 @@ int virStateCleanup(void) { virStateDriverTab[i]-stateCleanup() 0) ret = -1; } + +virHostdevManagerCleanup(); + return ret; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index cdd0b41..824de4e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1991,6 +1991,21 @@ virXPathULong; virXPathULongHex; virXPathULongLong; +#util/virhostdevmanager.h +virHostdevManagerGetDefault; +virHostdevManagerInit; +virHostdevManagerCleanup; +virHostdevManagerPrepareHostdevs; +virHostdevManagerReAttachHostdevs; +virHostdevManagerPreparePciHostdevs; +virHostdevManagerPrepareUsbHostdevs; +virHostdevManagerReAttachPciHostdevs; +virHostdevManagerReAttachUsbHostdevs; +virGetActivePciHostdevs; +virGetActiveUsbHostdevs; +virGetDomainActivePciHostdevs; +virGetDomainActiveUsbHostdevs; +virFreeHostdevNameList; # Let emacs know we want case-insensitive sorting # Local Variables: diff --git a/src/util/virhostdevmanager.c b/src/util/virhostdevmanager.c new file mode 100644 index 000..9034212 --- /dev/null +++ b/src/util/virhostdevmanager.c @@ -0,0 +1,1218 @@ +/* + * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * http://www.gnu.org/licenses/. + * + * Author: Chunyan Liu cy...@suse.com + */ +#include config.h + +#include virhostdevmanager.h + +#include sys/types.h +#include sys/stat.h +#include unistd.h +#include stdlib.h +#include stdio.h + +#include viralloc.h +#include virstring.h +#include virfile.h +#include virerror.h +#include virlog.h +#include virpci.h +#include virusb.h +#include virnetdev.h + +/* For virReportOOMError() and virReportSystemError() */ +#define VIR_FROM_THIS VIR_FROM_NONE + +struct _virHostdevManager{ +char *stateDir; + +virPCIDeviceListPtr activePciHostdevs; +virPCIDeviceListPtr inactivePciHostdevs; +virUSBDeviceListPtr activeUsbHostdevs; +}; + +static virHostdevManagerPtr hostdevMgr; + +int virHostdevManagerInit(void) +{ +char ebuf[1024]; +if (VIR_ALLOC(hostdevMgr) 0) + return -1; + +if ((hostdevMgr-activePciHostdevs = virPCIDeviceListNew()) == NULL) +return -1
[libvirt] [PATCH]write separate module for hostdev passthrough
This patch sets include two patches: 1/2 is the implementation of the hostdev passthrough common library. To meet two purposes: a. move qemu hostdev APIs to common library so that it could be used by all hypervisor drivers. b. maintain a global hostdev in-use state. 2/2 is the implementation of pci passthrough to libxl driver. There should be more patches to change qemu driver and lxc driver codes to switch to common library APIs, but I think it's better to have you review the common library first. After common library APIs confirmed, then modify qemu/lxc driver codes in a time. The implementation to libxl driver (2/2) is an example of using common library. Please review, thanks! Chunyan Liu (2): add pci passthrough common library add pci passthrough impl to libxl po/POTFILES.in |1 + src/Makefile.am |1 + src/libvirt.c|5 + src/libvirt_private.syms | 15 + src/libxl/libxl_conf.c | 44 ++ src/libxl/libxl_driver.c | 21 +- src/util/virhostdevmanager.c | 1218 ++ src/util/virhostdevmanager.h | 91 src/util/virpci.c| 17 +- src/util/virpci.h|7 +- src/util/virusb.c| 19 +- src/util/virusb.h|4 +- 12 files changed, 1426 insertions(+), 17 deletions(-) create mode 100644 src/util/virhostdevmanager.c create mode 100644 src/util/virhostdevmanager.h -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 1/2] add hostdev passthrough common library
Write separate module for hostdev passthrough so that it could be used by all hypervisor drivers and maintain a global hostdev state. Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in |1 + src/Makefile.am |1 + src/libvirt.c|5 + src/libvirt_private.syms | 15 + src/util/virhostdevmanager.c | 1218 ++ src/util/virhostdevmanager.h | 91 src/util/virpci.c| 17 +- src/util/virpci.h|7 +- src/util/virusb.c| 19 +- src/util/virusb.h|4 +- 10 files changed, 1362 insertions(+), 16 deletions(-) create mode 100644 src/util/virhostdevmanager.c create mode 100644 src/util/virhostdevmanager.h diff --git a/po/POTFILES.in b/po/POTFILES.in index f3ea4da..a7c21bf 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -188,6 +188,7 @@ src/util/viruri.c src/util/virusb.c src/util/virutil.c src/util/virxml.c +src/util/virhostdevmanager.c src/vbox/vbox_MSCOMGlue.c src/vbox/vbox_XPCOMCGlue.c src/vbox/vbox_driver.c diff --git a/src/Makefile.am b/src/Makefile.am index 4312c3c..a197c2b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -130,6 +130,7 @@ UTIL_SOURCES = \ util/virutil.c util/virutil.h \ util/viruuid.c util/viruuid.h \ util/virxml.c util/virxml.h \ +util/virhostdevmanager.c util/virhostdevmanager.h \ $(NULL) diff --git a/src/libvirt.c b/src/libvirt.c index 2b3515e..d9af5a6 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -65,6 +65,7 @@ #include virthread.h #include virstring.h #include virutil.h +#include virhostdevmanager.h #ifdef WITH_TEST # include test/test_driver.h @@ -827,6 +828,7 @@ int virStateInitialize(bool privileged, if (virInitialize() 0) return -1; +virHostdevManagerInit(); for (i = 0 ; i virStateDriverTabCount ; i++) { if (virStateDriverTab[i]-stateInitialize) { VIR_DEBUG(Running global init for %s state driver, @@ -858,6 +860,9 @@ int virStateCleanup(void) { virStateDriverTab[i]-stateCleanup() 0) ret = -1; } + +virHostdevManagerCleanup(); + return ret; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index cdd0b41..824de4e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1991,6 +1991,21 @@ virXPathULong; virXPathULongHex; virXPathULongLong; +#util/virhostdevmanager.h +virHostdevManagerGetDefault; +virHostdevManagerInit; +virHostdevManagerCleanup; +virHostdevManagerPrepareHostdevs; +virHostdevManagerReAttachHostdevs; +virHostdevManagerPreparePciHostdevs; +virHostdevManagerPrepareUsbHostdevs; +virHostdevManagerReAttachPciHostdevs; +virHostdevManagerReAttachUsbHostdevs; +virGetActivePciHostdevs; +virGetActiveUsbHostdevs; +virGetDomainActivePciHostdevs; +virGetDomainActiveUsbHostdevs; +virFreeHostdevNameList; # Let emacs know we want case-insensitive sorting # Local Variables: diff --git a/src/util/virhostdevmanager.c b/src/util/virhostdevmanager.c new file mode 100644 index 000..9034212 --- /dev/null +++ b/src/util/virhostdevmanager.c @@ -0,0 +1,1218 @@ +/* + * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * http://www.gnu.org/licenses/. + * + * Author: Chunyan Liu cy...@suse.com + */ +#include config.h + +#include virhostdevmanager.h + +#include sys/types.h +#include sys/stat.h +#include unistd.h +#include stdlib.h +#include stdio.h + +#include viralloc.h +#include virstring.h +#include virfile.h +#include virerror.h +#include virlog.h +#include virpci.h +#include virusb.h +#include virnetdev.h + +/* For virReportOOMError() and virReportSystemError() */ +#define VIR_FROM_THIS VIR_FROM_NONE + +struct _virHostdevManager{ +char *stateDir; + +virPCIDeviceListPtr activePciHostdevs; +virPCIDeviceListPtr inactivePciHostdevs; +virUSBDeviceListPtr activeUsbHostdevs; +}; + +static virHostdevManagerPtr hostdevMgr; + +int virHostdevManagerInit(void) +{ +char ebuf[1024]; +if (VIR_ALLOC(hostdevMgr) 0) + return -1; + +if ((hostdevMgr-activePciHostdevs = virPCIDeviceListNew
[libvirt] [PATCH 0/2]write separate module for hostdev passthrough
This patch sets include two patches: 1/2 is the implementation of the hostdev passthrough common library. To meet two purposes: a. move qemu hostdev APIs to common library so that it could be used by all hypervisor drivers. b. maintain a global hostdev in-use state. 2/2 is the implementation of pci passthrough to libxl driver. There should be more patches to change qemu driver and lxc driver codes to switch to common library APIs, but I think it's better to have you review the common library first. After common library APIs confirmed, then modify qemu/lxc driver codes in a time. The implementation to libxl driver (2/2) is an example of using common library. Please review, thanks! Chunyan Liu (2): add pci passthrough common library add pci passthrough impl to libxl po/POTFILES.in |1 + src/Makefile.am |1 + src/libvirt.c|5 + src/libvirt_private.syms | 15 + src/libxl/libxl_conf.c | 44 ++ src/libxl/libxl_driver.c | 21 +- src/util/virhostdevmanager.c | 1218 ++ src/util/virhostdevmanager.h | 91 src/util/virpci.c| 17 +- src/util/virpci.h|7 +- src/util/virusb.c| 19 +- src/util/virusb.h|4 +- 12 files changed, 1426 insertions(+), 17 deletions(-) create mode 100644 src/util/virhostdevmanager.c create mode 100644 src/util/virhostdevmanager.h -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/2] add pci passthrough impl to libxl
Add pci passthrough implementation to libxl driver, using hostdev common library. Signed-off-by: Chunyan Liu cy...@suse.com --- src/libxl/libxl_conf.c | 44 src/libxl/libxl_driver.c | 21 - 2 files changed, 64 insertions(+), 1 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 1a7e430..61dfe85 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -708,6 +708,46 @@ error: return -1; } +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +int nhostdevs = def-nhostdevs; +libxl_device_pci *x_pcidevs; +int i; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) { +virReportOOMError(); +return -1; +} + +d_config-num_pcidevs = 0; +d_config-pcidevs = x_pcidevs; + +for (i = 0 ; i nhostdevs ; i++) { +virDomainHostdevDefPtr hostdev = l_hostdevs[i]; +libxl_device_pci pcidev; + +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +pcidev.domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev.bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev.dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev.func = hostdev-source.subsys.u.pci.addr.function; + +d_config-pcidevs[d_config-num_pcidevs] = pcidev; +d_config-num_pcidevs ++; +} + +return 0; +} + virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -766,6 +806,10 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, return -1; } +if (libxlMakePciList(def, d_config) 0) { +return -1; +} + d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index b39e005..d6db98a 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -45,6 +45,7 @@ #include virtypedparam.h #include viruri.h #include virstring.h +#include virhostdevmanager.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -685,13 +686,17 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason) { libxlDomainObjPrivatePtr priv = vm-privateData; - +virHostdevManagerPtr hostdev_mgr; + if (libxl_domain_destroy(priv-ctx, vm-def-id, NULL) 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _(Unable to cleanup domain %d), vm-def-id); return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +virHostdevManagerReAttachHostdevs(hostdev_mgr, xenlight, vm-def, VIR_SP_PCI_HOSTDEV); + libxlVmCleanup(driver, vm, reason); return 0; } @@ -902,6 +907,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, char *managed_save_path = NULL; int managed_save_fd = -1; libxlDomainObjPrivatePtr priv = vm-privateData; +virHostdevManagerPtr hostdev_mgr; /* If there is a managed saved state restore it instead of starting * from scratch. The old state is removed once the restoring succeeded. */ @@ -956,6 +962,12 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, goto error; } +VIR_DEBUG(Preparing host PCI devices); +hostdev_mgr = virHostdevManagerGetDefault(); +if (virHostdevManagerPrepareHostdevs(hostdev_mgr, xenlight, vm-def, VIR_SP_PCI_HOSTDEV ) 0) +goto error; + + /* use as synchronous operations = ao_how = NULL and no intermediate reports = ao_progress = NULL */ if (restore_fd 0) @@ -1049,6 +1061,7 @@ libxlReconnectDomain(virDomainObjPtr vm, libxl_dominfo d_info; int len; uint8_t *data = NULL; +virHostdevManagerPtr hostdev_mgr; virObjectLock(vm); @@ -1071,6 +1084,12 @@ libxlReconnectDomain(virDomainObjPtr vm, /* Update domid in case it changed (e.g. reboot) while we were gone? */ vm-def-id = d_info.domid; + +/* Update hostdev state */ +hostdev_mgr = virHostdevManagerGetDefault(); +if (virHostdevManagerPrepareHostdevs(hostdev_mgr, xenlight, vm-def, VIR_SP_PCI_HOSTDEV ) 0) +goto out; + virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_UNKNOWN); if (!driver-nactive driver-inhibitCallback) -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 1/2] add hostdev passthrough common library
2013/5/16 Osier Yang jy...@redhat.com On 16/05/13 14:07, Chunyan Liu wrote: Write separate module for hostdev passthrough so that it could be used by all hypervisor drivers and maintain a global hostdev state. Signed-off-by: Chunyan Liucy...@suse.com --- po/POTFILES.in |1 + src/Makefile.am |1 + src/libvirt.c|5 + src/libvirt_private.syms | 15 + src/util/virhostdevmanager.c | 1218 ++** src/util/virhostdevmanager.h | 91 src/util/virpci.c| 17 +- src/util/virpci.h|7 +- src/util/virusb.c| 19 +- src/util/virusb.h|4 +- 10 files changed, 1362 insertions(+), 16 deletions(-) create mode 100644 src/util/virhostdevmanager.c create mode 100644 src/util/virhostdevmanager.h diff --git a/po/POTFILES.in b/po/POTFILES.in index f3ea4da..a7c21bf 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -188,6 +188,7 @@ src/util/viruri.c src/util/virusb.c src/util/virutil.c src/util/virxml.c +src/util/virhostdevmanager.c src/vbox/vbox_MSCOMGlue.c src/vbox/vbox_XPCOMCGlue.c src/vbox/vbox_driver.c diff --git a/src/Makefile.am b/src/Makefile.am index 4312c3c..a197c2b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -130,6 +130,7 @@ UTIL_SOURCES = \ util/virutil.c util/virutil.h \ util/viruuid.c util/viruuid.h \ util/virxml.c util/virxml.h \ +util/virhostdevmanager.c util/virhostdevmanager.h \ $(NULL) diff --git a/src/libvirt.c b/src/libvirt.c index 2b3515e..d9af5a6 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -65,6 +65,7 @@ #include virthread.h #include virstring.h #include virutil.h +#include virhostdevmanager.h #ifdef WITH_TEST # include test/test_driver.h @@ -827,6 +828,7 @@ int virStateInitialize(bool privileged, if (virInitialize() 0) return -1; +virHostdevManagerInit(); for (i = 0 ; i virStateDriverTabCount ; i++) { if (virStateDriverTab[i]-**stateInitialize) { VIR_DEBUG(Running global init for %s state driver, @@ -858,6 +860,9 @@ int virStateCleanup(void) { virStateDriverTab[i]-**stateCleanup() 0) ret = -1; } + +virHostdevManagerCleanup(); + return ret; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index cdd0b41..824de4e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1991,6 +1991,21 @@ virXPathULong; virXPathULongHex; virXPathULongLong; +#util/virhostdevmanager.h +virHostdevManagerGetDefault; +virHostdevManagerInit; +virHostdevManagerCleanup; +**virHostdevManagerPrepareHostde**vs; +**virHostdevManagerReAttachHostd**evs; +**virHostdevManagerPreparePciHos**tdevs; +**virHostdevManagerPrepareUsbHos**tdevs; +**virHostdevManagerReAttachPciHo**stdevs; +**virHostdevManagerReAttachUsbHo**stdevs; +virGetActivePciHostdevs; +virGetActiveUsbHostdevs; +**virGetDomainActivePciHostdevs; +**virGetDomainActiveUsbHostdevs; +virFreeHostdevNameList; # Let emacs know we want case-insensitive sorting # Local Variables: diff --git a/src/util/virhostdevmanager.c b/src/util/virhostdevmanager.c new file mode 100644 index 000..9034212 --- /dev/null +++ b/src/util/virhostdevmanager.c @@ -0,0 +1,1218 @@ +/* + * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + *http://www.gnu.org/licenses/**. + * + * Author: Chunyan Liucy...@suse.com + */ +#include config.h + +#include virhostdevmanager.h + +#include sys/types.h +#include sys/stat.h +#include unistd.h +#include stdlib.h +#include stdio.h + +#include viralloc.h +#include virstring.h +#include virfile.h +#include virerror.h +#include virlog.h +#include virpci.h +#include virusb.h +#include virnetdev.h + +/* For virReportOOMError() and virReportSystemError() */ +#define VIR_FROM_THIS VIR_FROM_NONE + +struct _virHostdevManager{ +char *stateDir; + +virPCIDeviceListPtr activePciHostdevs; +virPCIDeviceListPtr inactivePciHostdevs; +virUSBDeviceListPtr
[libvirt] [PATCH v2 2/2] add pci passthrough impl to libxl
Add pci passthrough implementation to libxl driver Changes to v1: * Add device-attach/detach a pci hostdev implementataion to libxl driver * driver name='xen' / should be specified in hostdev definition to keep consistency with qemu changes (use driver name='kvm/vfio' / to decide stub driver pci-stub/vfio). According to name='xen', it will use 'pciback'. Signed-off-by: Chunyan Liu cy...@suse.com --- src/libxl/libxl_conf.c | 106 +++ src/libxl/libxl_conf.h |3 +- src/libxl/libxl_driver.c | 250 +- 3 files changed, 355 insertions(+), 4 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 1a7e430..4f2fc91 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -708,6 +708,108 @@ error: return -1; } +int libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev) +{ +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +return -1; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +return -1; + +pcidev-domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev-bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev-dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev-func = hostdev-source.subsys.u.pci.addr.function; + +return 0; +} + +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +size_t nhostdevs = def-nhostdevs; +size_t npcidevs = 0; +libxl_device_pci *x_pcidevs; +int i, j; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) { +virReportOOMError(); +return -1; +} + +for (i = 0, j = 0; i nhostdevs; i++) { +if (l_hostdevs[i]-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (l_hostdevs[i]-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +libxl_device_pci_init(x_pcidevs[j]); + +if (libxlMakePci(l_hostdevs[i], x_pcidevs[j]) 0) +goto error; + +npcidevs++; +j++; +} + +VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs); +d_config-pcidevs = x_pcidevs; +d_config-num_pcidevs = npcidevs; + +return 0; + +error: +for (i = 0; i npcidevs; i++) { +libxl_device_pci_dispose(x_pcidevs[i]); +} +VIR_FREE(x_pcidevs); +return -1; +} + +/* +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +int nhostdevs = def-nhostdevs; +libxl_device_pci *x_pcidevs; +int i; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) { +virReportOOMError(); +return -1; +} + +d_config-num_pcidevs = 0; +d_config-pcidevs = x_pcidevs; + +for (i = 0 ; i nhostdevs ; i++) { +virDomainHostdevDefPtr hostdev = l_hostdevs[i]; +libxl_device_pci pcidev; + +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +pcidev.domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev.bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev.dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev.func = hostdev-source.subsys.u.pci.addr.function; + +d_config-pcidevs[d_config-num_pcidevs] = pcidev; +d_config-num_pcidevs ++; +} + +return 0; +} +*/ virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -766,6 +868,10 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, return -1; } +if (libxlMakePciList(def, d_config) 0) { +return -1; +} + d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index fed878d..7d7a021 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -119,7 +119,8 @@ libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic); int libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb); - +int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev); int libxlBuildDomainConfig(libxlDriverPrivatePtr driver, virDomainDefPtr def, libxl_domain_config *d_config); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index b39e005..a94b214 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -45,6 +45,7 @@ #include virtypedparam.h #include viruri.h #include virstring.h +#include virhostdevmanager.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -685,13 +686,17 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason
[libvirt] [PATCH v2 0/2]impl separite module for hostdev passthrough
This patch series include two patches: 1/2 is the implementation of the hostdev passthrough common library. To meet two purposes: a. move qemu hostdev APIs to common library so that it could be used by all hypervisor drivers. b. maintain a global hostdev in-use state. 2/2 is the implementation of pci passthrough to libxl driver. Using common library APIs to implement pci passthrough for libxl driver. (Changes to qemu/lxc driver are not included yet. That could be done after common library is confirmed.) Changes to v1: 1/2: * add scsi part to common library * instead of hardcode, check for driver name='kvm/vfio/xen'/ setting, call virPCIDeviceSetStubDriver to set stub driver. For libxl driver, a driver name='xen' / is needed. * rebase to current libvirt changes 2/2: * Add device-attach/detach a pci hostdev implementataion to libxl driver Chunyan Liu (2): add hostdev passthrough common library add pci passthrough impl to libxl po/POTFILES.in |1 + src/Makefile.am |1 + src/conf/domain_conf.c |3 +- src/conf/domain_conf.h |1 + src/libvirt.c|5 + src/libvirt_private.syms | 22 +- src/libxl/libxl_conf.c | 106 +++ src/libxl/libxl_conf.h |3 +- src/libxl/libxl_driver.c | 250 +++- src/util/virhostdevmanager.c | 1486 ++ src/util/virhostdevmanager.h | 109 +++ src/util/virpci.c| 17 +- src/util/virpci.h|7 +- src/util/virscsi.c | 18 +- src/util/virscsi.h |4 +- src/util/virusb.c| 19 +- src/util/virusb.h|4 +- 17 files changed, 2026 insertions(+), 30 deletions(-) create mode 100644 src/util/virhostdevmanager.c create mode 100644 src/util/virhostdevmanager.h -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCHv3 2/4] add pci passthrough to libxl driver
2013/8/14 Jim Fehlig jfeh...@suse.com cy...@suse.com wrote: From: Chunyan Liu cy...@suse.com Add pci passthrough to libxl driver, support attach-device, detach-device and start a vm with pci hostdev specified. Signed-off-by: Chunyan Liu cy...@suse.com --- src/libxl/libxl_conf.c | 65 src/libxl/libxl_conf.h |5 +- src/libxl/libxl_driver.c | 250 +- 3 files changed, 315 insertions(+), 5 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 827dfdd..aa6fd1e 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -871,6 +871,67 @@ error: return -1; } +int libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev) Return type and function name on separate lines. +{ +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +return -1; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +return -1; + +pcidev-domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev-bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev-dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev-func = hostdev-source.subsys.u.pci.addr.function; + +return 0; +} + +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +size_t nhostdevs = def-nhostdevs; +size_t npcidevs = 0; +libxl_device_pci *x_pcidevs; +size_t i, j; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) { +virReportOOMError(); No need to report OOM error. +return -1; +} + +for (i = 0, j = 0; i nhostdevs; i++) { +if (l_hostdevs[i]-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (l_hostdevs[i]-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +libxl_device_pci_init(x_pcidevs[j]); + +if (libxlMakePci(l_hostdevs[i], x_pcidevs[j]) 0) +goto error; + +npcidevs++; +j++; +} + +VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs); +d_config-pcidevs = x_pcidevs; +d_config-num_pcidevs = npcidevs; + +return 0; + +error: +for (i = 0; i npcidevs; i++) { +libxl_device_pci_dispose(x_pcidevs[i]); +} No need for the braces. From HACKING: Omit the curly braces around an if, while, for etc. body only when that body occupies a single line. +VIR_FREE(x_pcidevs); +return -1; +} + virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -932,6 +993,10 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, return -1; } +if (libxlMakePciList(def, d_config) 0) { +return -1; +} + Same here, no need for the braces. (I should put together a cleanup patch to fix the existing offenses in this file.) d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index aa57710..db3e53d 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -36,7 +36,7 @@ # include virobject.h # include virchrdev.h - Spurious whitespace change. +# define LIBXL_DRIVER_NAME xenlight # define LIBXL_VNC_PORT_MIN 5900 # define LIBXL_VNC_PORT_MAX 65535 @@ -126,7 +126,8 @@ libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic); int libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb); - Same here. I'd prefer a line between all these function declarations. +int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev); int libxlBuildDomainConfig(libxlDriverPrivatePtr driver, virDomainObjPtr vm, libxl_domain_config *d_config); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 9e9bc89..8166baf 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -49,6 +49,7 @@ #include virstring.h #include virsysinfo.h #include viraccessapicheck.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -698,6 +699,7 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason) { libxlDomainObjPrivatePtr priv = vm-privateData; +virHostdevManagerPtr hostdev_mgr; if (libxl_domain_destroy(priv-ctx, vm-def-id, NULL) 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -705,6 +707,10 @@ libxlVmReap(libxlDriverPrivatePtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +virHostdevReAttachDomainHostdevs(hostdev_mgr
Re: [libvirt] [PATCHv4 1/4] add hostdev passthrough common library
Thanks very much! Still two places to confirm: 2013/8/21 Daniel P. Berrange berra...@redhat.com On Mon, Aug 19, 2013 at 04:49:37PM -0400, cy...@suse.com wrote: diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c new file mode 100644 index 000..1baa829 --- /dev/null +++ b/src/util/virhostdev.c + +/* For virReportOOMError() and virReportSystemError() */ No need for this comment - this is standard practice for every source file +#define VIR_FROM_THIS VIR_FROM_NONE + +/* Same name as in virDriver. For special check. */ +#define LIBXL_DRIVER_NAME xenlight +#define QEMU_DRIVER_NAME QEMU You're using this later to determine whether to use pci-back vs pci-stub. I think it it would be preferrable to have the drivers pass in the name of their desired stub driver instead. I'm afraid there are some problems: Currently there are two places: 1. if driver name=xx / is not specified in pci hostdev .xml, use default stub driver. But to 'libxl' and 'qemu', the default stub driver is different (pciback vs pci-stub), so, need to check hypervisor driver name to decide default stub dirver name. 2. in detach-device, for 'qemu/kvm', it needs to check 'kvm_assigned_device', waiting for device cleanup. For 'libxl', it doesn't. So, need to check hypervisor driver name to add the extra processing. Besides, to 'qemu', not only the 'pci-stub' case, it could be 'pci-stub' or 'vfio'. To prepare domain hostdevs, just could not pass ONE stub driver name simply to virHostdev API (e.g, virHostdevPrepareDomainHostdevs). Any suggestions? +static int +virHostdevOnceInit(void) +{ +char ebuf[1024]; + +if (VIR_ALLOC(hostdevMgr) 0) +goto error; + +if ((hostdevMgr-activePciHostdevs = virPCIDeviceListNew()) == NULL) +goto error; + +if ((hostdevMgr-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) +goto error; + +if ((hostdevMgr-inactivePciHostdevs = virPCIDeviceListNew()) == NULL) +goto error; + +if ((hostdevMgr-activeScsiHostdevs = virSCSIDeviceListNew()) == NULL) +goto error; + +if (virAsprintf(hostdevMgr-stateDir, %s, HOSTDEV_STATE_DIR) 0) +goto error; + +if (virFileMakePath(hostdevMgr-stateDir) 0) { +VIR_ERROR(_(Failed to create state dir '%s': %s), + hostdevMgr-stateDir, virStrerror(errno, ebuf, sizeof(ebuf))); You should be using virReportError here +goto error; +} + +return 0; + +error: You should free the partially initialized 'hostdevMgr' instance all its data +return -1; +} + +VIR_ONCE_GLOBAL_INIT(virHostdev) + +virHostdevManagerPtr +virHostdevManagerGetDefault(void) +{ +virHostdevInitialize(); You should do if (virHostdevInitialize() 0) return NULL; +return hostdevMgr; +} + + +void +virHostdevReAttachUsbHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, + const char *dom_name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) +{ +size_t i; + +virObjectLock(mgr-activeUsbHostdevs); I wonder if we should get rid of the mutex locks in the PCI / USB device list objects, and instead have a single lock on the virHostdevManagerPtr instance. I noticed in qemu_hostdev.c, originally it used single driver lock, later changed to use pci/usb list object lock. Do you think a single lock is still preferred? If yes, I'll update. diff --git a/src/util/virpci.c b/src/util/virpci.c index be50b4f..dc38efe 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -62,7 +62,10 @@ struct _virPCIDevice { char name[PCI_ADDR_LEN]; /* domain:bus:slot.function */ char id[PCI_ID_LEN]; /* product vendor */ char *path; -const char*used_by; /* The domain which uses the device */ + +/* The driver:domain which uses the device */ +const char*used_by_drvname; +const char*used_by_domname; [snip] void -virPCIDeviceSetUsedBy(virPCIDevicePtr dev, const char *name) +virPCIDeviceSetUsedBy(virPCIDevicePtr dev, const char *drv_name, const char *dom_name) { -dev-used_by = name; +dev-used_by_drvname = drv_name; +dev-used_by_domname = dom_name; I know you are just following existing code design, but I consider it pretty bad practice to store pointers to parameters that are passed in. You can never be sure when someone is using to use this API in the future with a string that they free sooner than we expect. Much much safer to strdup the parameters. } -const char * -virPCIDeviceGetUsedBy(virPCIDevicePtr dev) +int +virPCIDeviceGetUsedBy(virPCIDevicePtr dev, char **drv_name, char **dom_name) { -return dev-used_by; +if
[libvirt] [RESEND][PATCHv5 0/4] write separate module for hostdev passthrough
[rebased to latest libvirt code for applying and reviewing the patches] These patches implements a separate module for hostdev passthrough so that it could be shared by different drivers and can maintain a global state of a host device. Plus, add passthrough to libxl driver, and change qemu driver and lxc driver to use hostdev common library instead of their own hostdev APIs. --- Changes to v4: * change the way checking hypervisor driver name to decide whether use pciback or pci-stub as stub driver, instead, using driver callback to handle that. * remove get active/inactive list APIs from hostdev common library since currently no code uses them. * add nodedev-detach/reattach/reset to libxl driver * other fixes to Daniel and Jim's comments v4 is here: https://www.redhat.com/archives/libvir-list/2013-August/msg00806.html Changes to v3: * fix Jim's comments v3 is here: https://www.redhat.com/archives/libvir-list/2013-August/msg00019.html Changes to v2: * add patches for qemu driver and lxc driver, use common library APIs instead of their own hostdev APIs. * add APIs for nodedev-detach and nodedev-reattach calling. * rename functions to use unified prefix 'virHostdev' * use VIR_ONCE_GLOBAL_INIT() as others instead of previous Init and Cleanup. * use VIR_STRDUP instead of strdup * rebase to latest code v2 is here: https://www.redhat.com/archives/libvir-list/2013-June/msg00263.html Chunyan Liu (4): add hostdev passthrough common library add pci passthrough to libxl driver change qemu driver to use hostdev common library change lxc driver to use hostdev common library docs/schemas/domaincommon.rng |1 + po/POTFILES.in|3 +- src/Makefile.am |3 +- src/conf/domain_conf.c|3 +- src/conf/domain_conf.h|1 + src/libvirt_private.syms | 15 + src/libxl/libxl_conf.c| 63 ++ src/libxl/libxl_conf.h|4 + src/libxl/libxl_domain.c |9 + src/libxl/libxl_driver.c | 443 ++- src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 45 +- src/lxc/lxc_hostdev.c | 413 - src/lxc/lxc_hostdev.h | 43 -- src/lxc/lxc_process.c | 21 +- src/qemu/qemu_command.c |1 - src/qemu/qemu_conf.h |9 +- src/qemu/qemu_domain.c|9 + src/qemu/qemu_driver.c| 72 +-- src/qemu/qemu_hostdev.c | 1289 --- src/qemu/qemu_hostdev.h | 72 --- src/qemu/qemu_hotplug.c | 126 ++--- src/qemu/qemu_process.c | 34 +- src/util/virhostdev.c | 1335 + src/util/virhostdev.h | 104 src/util/virpci.c | 28 +- src/util/virpci.h |9 +- src/util/virscsi.c| 26 +- src/util/virscsi.h|8 +- src/util/virusb.c | 27 +- src/util/virusb.h |8 +- 31 files changed, 2195 insertions(+), 2033 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h delete mode 100644 src/qemu/qemu_hostdev.c delete mode 100644 src/qemu/qemu_hostdev.h create mode 100644 src/util/virhostdev.c create mode 100644 src/util/virhostdev.h -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [RESEND][PATCHv5 4/4] change lxc driver to use hostdev common library
Change lxc driver to use hostdev common library instead of its own APIs in lxc_hostdev.[ch] Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in|1 - src/Makefile.am |1 - src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 45 +++--- src/lxc/lxc_hostdev.c | 413 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 21 ++- 7 files changed, 43 insertions(+), 485 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 2fc7e67..b3b7832 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -61,7 +61,6 @@ src/locking/lock_manager.c src/locking/sanlock_helper.c src/lxc/lxc_cgroup.c src/lxc/lxc_fuse.c -src/lxc/lxc_hostdev.c src/lxc/lxc_container.c src/lxc/lxc_conf.c src/lxc/lxc_controller.c diff --git a/src/Makefile.am b/src/Makefile.am index c3a8ba0..afae0a8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -600,7 +600,6 @@ LXC_DRIVER_SOURCES = \ lxc/lxc_container.c lxc/lxc_container.h \ lxc/lxc_cgroup.c lxc/lxc_cgroup.h \ lxc/lxc_domain.c lxc/lxc_domain.h \ - lxc/lxc_hostdev.c lxc/lxc_hostdev.h \ lxc/lxc_monitor.c lxc/lxc_monitor.h \ lxc/lxc_process.c lxc/lxc_process.h \ lxc/lxc_fuse.c lxc/lxc_fuse.h \ diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index a6208a2..05f2a80 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -92,10 +92,6 @@ struct _virLXCDriver { /* Immutable pointer, self-locking APIs */ virDomainObjListPtr domains; -/* Immutable pointer. Requires lock to be held before - * calling APIs. */ -virUSBDeviceListPtr activeUsbHostdevs; - /* Immutable pointer, self-locking APIs */ virDomainEventStatePtr domainEventState; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index b587c22..098f2f0 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -70,6 +70,7 @@ #include virstring.h #include viraccessapicheck.h #include viraccessapichecklxc.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LXC @@ -1418,9 +1419,6 @@ static int lxcStateInitialize(bool privileged, if (!(lxc_driver-securityManager = lxcSecurityInit(cfg))) goto cleanup; -if ((lxc_driver-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) -goto cleanup; - if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL) goto cleanup; @@ -1535,7 +1533,6 @@ static int lxcStateCleanup(void) virSysinfoDefFree(lxc_driver-hostsysinfo); -virObjectUnref(lxc_driver-activeUsbHostdevs); virObjectUnref(lxc_driver-caps); virObjectUnref(lxc_driver-securityManager); virObjectUnref(lxc_driver-xmlopt); @@ -3214,6 +3211,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, mode_t mode; bool created = false; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if (virDomainHostdevFind(vm-def, def, NULL) = 0) { virReportError(VIR_ERR_OPERATION_FAILED, %s, @@ -3221,6 +3219,13 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (virHostdevPrepareUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, 1, 0) 0) +goto cleanup; + if (virAsprintf(vroot, /proc/%llu/root, (unsigned long long)priv-initpid) 0) goto cleanup; @@ -3296,6 +3301,11 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, ret = 0; cleanup: +virHostdevReAttachUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, + 1); virDomainAuditHostdev(vm, def, attach, ret == 0); if (ret 0 created) unlink(dstfile); @@ -3758,8 +3768,7 @@ cleanup: static int -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, -virDomainObjPtr vm, +lxcDomainDetachDeviceHostdevUSBLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { virLXCDomainObjPrivatePtr priv = vm-privateData; @@ -3768,6 +3777,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, char *dst = NULL; char *vroot = NULL; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if ((idx = virDomainHostdevFind(vm-def, dev-data.hostdev, @@ -3812,9 +3822,9 @@ lxcDomainDetachDeviceHostdevUSBLive
Re: [libvirt] [RESEND][PATCHv5 0/4] write separate module for hostdev passthrough
Resend to list. Regards, Chunyan 2013/9/12 Jim Fehlig jfeh...@suse.com Chunyan Liu wrote: [rebased to latest libvirt code for applying and reviewing the patches] Odd, but I just noticed that this series is not in the list archives, nor is the original V5 you sent on Sept. 2. You're obviously subscribed to the list, so I wouldn't expect the mails to be held for moderation. Makes it difficult for others on the libvirt list to review... Regards, Jim These patches implements a separate module for hostdev passthrough so that it could be shared by different drivers and can maintain a global state of a host device. Plus, add passthrough to libxl driver, and change qemu driver and lxc driver to use hostdev common library instead of their own hostdev APIs. --- Changes to v4: * change the way checking hypervisor driver name to decide whether use pciback or pci-stub as stub driver, instead, using driver callback to handle that. * remove get active/inactive list APIs from hostdev common library since currently no code uses them. * add nodedev-detach/reattach/reset to libxl driver * other fixes to Daniel and Jim's comments v4 is here: https://www.redhat.com/archives/libvir-list/2013-August/msg00806.html Changes to v3: * fix Jim's comments v3 is here: https://www.redhat.com/archives/libvir-list/2013-August/msg00019.html Changes to v2: * add patches for qemu driver and lxc driver, use common library APIs instead of their own hostdev APIs. * add APIs for nodedev-detach and nodedev-reattach calling. * rename functions to use unified prefix 'virHostdev' * use VIR_ONCE_GLOBAL_INIT() as others instead of previous Init and Cleanup. * use VIR_STRDUP instead of strdup * rebase to latest code v2 is here: https://www.redhat.com/archives/libvir-list/2013-June/msg00263.html Chunyan Liu (4): add hostdev passthrough common library add pci passthrough to libxl driver change qemu driver to use hostdev common library change lxc driver to use hostdev common library docs/schemas/domaincommon.rng |1 + po/POTFILES.in|3 +- src/Makefile.am |3 +- src/conf/domain_conf.c|3 +- src/conf/domain_conf.h|1 + src/libvirt_private.syms | 15 + src/libxl/libxl_conf.c| 63 ++ src/libxl/libxl_conf.h|4 + src/libxl/libxl_domain.c |9 + src/libxl/libxl_driver.c | 443 ++- src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 45 +- src/lxc/lxc_hostdev.c | 413 - src/lxc/lxc_hostdev.h | 43 -- src/lxc/lxc_process.c | 21 +- src/qemu/qemu_command.c |1 - src/qemu/qemu_conf.h |9 +- src/qemu/qemu_domain.c|9 + src/qemu/qemu_driver.c| 72 +-- src/qemu/qemu_hostdev.c | 1289 --- src/qemu/qemu_hostdev.h | 72 --- src/qemu/qemu_hotplug.c | 126 ++--- src/qemu/qemu_process.c | 34 +- src/util/virhostdev.c | 1335 + src/util/virhostdev.h | 104 src/util/virpci.c | 28 +- src/util/virpci.h |9 +- src/util/virscsi.c| 26 +- src/util/virscsi.h|8 +- src/util/virusb.c | 27 +- src/util/virusb.h |8 +- 31 files changed, 2195 insertions(+), 2033 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h delete mode 100644 src/qemu/qemu_hostdev.c delete mode 100644 src/qemu/qemu_hostdev.h create mode 100644 src/util/virhostdev.c create mode 100644 src/util/virhostdev.h -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [RESEND][PATCHv5 2/4] add pci passthrough to libxl driver
Add pci passthrough to libxl driver, support attach-device, detach-device and start a vm with pci hostdev specified. Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in |2 +- src/libxl/libxl_conf.c | 63 +++ src/libxl/libxl_conf.h |4 + src/libxl/libxl_driver.c | 443 +- 4 files changed, 510 insertions(+), 2 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index ec205c9..d01cb99 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -159,6 +159,7 @@ src/util/vireventpoll.c src/util/virfile.c src/util/virhash.c src/util/virhook.c +src/util/virhostdev.c src/util/viridentity.c src/util/virinitctl.c src/util/viriptables.c @@ -196,7 +197,6 @@ src/util/viruri.c src/util/virusb.c src/util/virutil.c src/util/virxml.c -src/util/virhostdev.c src/vbox/vbox_MSCOMGlue.c src/vbox/vbox_XPCOMCGlue.c src/vbox/vbox_driver.c diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index d4226b8..31d8f8a 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1128,6 +1128,66 @@ libxlDriverConfigGet(libxlDriverPrivatePtr driver) return cfg; } +int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev) +{ +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +return -1; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +return -1; + +pcidev-domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev-bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev-dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev-func = hostdev-source.subsys.u.pci.addr.function; + +return 0; +} + +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +size_t nhostdevs = def-nhostdevs; +size_t npcidevs = 0; +libxl_device_pci *x_pcidevs; +size_t i, j; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) +return -1; + +for (i = 0, j = 0; i nhostdevs; i++) { +if (l_hostdevs[i]-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (l_hostdevs[i]-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +libxl_device_pci_init(x_pcidevs[j]); + +if (libxlMakePci(l_hostdevs[i], x_pcidevs[j]) 0) +goto error; + +npcidevs++; +j++; +} + +VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs); +d_config-pcidevs = x_pcidevs; +d_config-num_pcidevs = npcidevs; + +return 0; + +error: +for (i = 0; i npcidevs; i++) +libxl_device_pci_dispose(x_pcidevs[i]); + +VIR_FREE(x_pcidevs); +return -1; +} + virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -1176,6 +1236,9 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, if (libxlMakeVfbList(driver, def, d_config) 0) return -1; +if (libxlMakePciList(def, d_config) 0) +return -1; + d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 8ba0ee4..31a955a 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -38,6 +38,7 @@ # include virchrdev.h +# define LIBXL_DRIVER_NAME xenlight # define LIBXL_VNC_PORT_MIN 5900 # define LIBXL_VNC_PORT_MAX 65535 @@ -148,6 +149,9 @@ libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb); int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev); + +int libxlBuildDomainConfig(libxlDriverPrivatePtr driver, virDomainObjPtr vm, libxl_domain_config *d_config); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index e2a6d44..5bddf45 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -52,6 +52,8 @@ #include virsysinfo.h #include viraccessapicheck.h #include viratomic.h +#include virhostdev.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -328,6 +330,7 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason) { libxlDomainObjPrivatePtr priv = vm-privateData; +virHostdevManagerPtr hostdev_mgr; if (libxl_domain_destroy(priv-ctx, vm-def-id, NULL) 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -335,6 +338,10 @@ libxlVmReap(libxlDriverPrivatePtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +virHostdevReAttachDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, + vm-def, VIR_SP_PCI_HOSTDEV); + libxlVmCleanup(driver, vm, reason); return 0; } @@ -553,6 +560,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, int managed_save_fd = -1; libxlDomainObjPrivatePtr priv = vm-privateData
[libvirt] [RESEND][PATCHv5 0/4] write separate module for hostdev passthrough
[rebased to latest libvirt code for applying and reviewing the patches] These patches implements a separate module for hostdev passthrough so that it could be shared by different drivers and can maintain a global state of a host device. Plus, add passthrough to libxl driver, and change qemu driver and lxc driver to use hostdev common library instead of their own hostdev APIs. --- Changes to v4: * change the way checking hypervisor driver name to decide whether use pciback or pci-stub as stub driver, instead, using driver callback to handle that. * remove get active/inactive list APIs from hostdev common library since currently no code uses them. * add nodedev-detach/reattach/reset to libxl driver * other fixes to Daniel and Jim's comments v4 is here: https://www.redhat.com/archives/libvir-list/2013-August/msg00806.html Changes to v3: * fix Jim's comments v3 is here: https://www.redhat.com/archives/libvir-list/2013-August/msg00019.html Changes to v2: * add patches for qemu driver and lxc driver, use common library APIs instead of their own hostdev APIs. * add APIs for nodedev-detach and nodedev-reattach calling. * rename functions to use unified prefix 'virHostdev' * use VIR_ONCE_GLOBAL_INIT() as others instead of previous Init and Cleanup. * use VIR_STRDUP instead of strdup * rebase to latest code v2 is here: https://www.redhat.com/archives/libvir-list/2013-June/msg00263.html Chunyan Liu (4): add hostdev passthrough common library add pci passthrough to libxl driver change qemu driver to use hostdev common library change lxc driver to use hostdev common library docs/schemas/domaincommon.rng |1 + po/POTFILES.in|3 +- src/Makefile.am |3 +- src/conf/domain_conf.c|3 +- src/conf/domain_conf.h|1 + src/libvirt_private.syms | 15 + src/libxl/libxl_conf.c| 63 ++ src/libxl/libxl_conf.h|4 + src/libxl/libxl_domain.c |9 + src/libxl/libxl_driver.c | 443 ++- src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 45 +- src/lxc/lxc_hostdev.c | 413 - src/lxc/lxc_hostdev.h | 43 -- src/lxc/lxc_process.c | 21 +- src/qemu/qemu_command.c |1 - src/qemu/qemu_conf.h |9 +- src/qemu/qemu_domain.c|9 + src/qemu/qemu_driver.c| 72 +-- src/qemu/qemu_hostdev.c | 1289 --- src/qemu/qemu_hostdev.h | 72 --- src/qemu/qemu_hotplug.c | 126 ++--- src/qemu/qemu_process.c | 34 +- src/util/virhostdev.c | 1335 + src/util/virhostdev.h | 104 src/util/virpci.c | 28 +- src/util/virpci.h |9 +- src/util/virscsi.c| 26 +- src/util/virscsi.h|8 +- src/util/virusb.c | 27 +- src/util/virusb.h |8 +- 31 files changed, 2195 insertions(+), 2033 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h delete mode 100644 src/qemu/qemu_hostdev.c delete mode 100644 src/qemu/qemu_hostdev.h create mode 100644 src/util/virhostdev.c create mode 100644 src/util/virhostdev.h -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [RESEND][PATCHv5 4/4] change lxc driver to use hostdev common library
Change lxc driver to use hostdev common library instead of its own APIs in lxc_hostdev.[ch] Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in|1 - src/Makefile.am |1 - src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 45 +++--- src/lxc/lxc_hostdev.c | 413 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 21 ++- 7 files changed, 43 insertions(+), 485 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 2fc7e67..b3b7832 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -61,7 +61,6 @@ src/locking/lock_manager.c src/locking/sanlock_helper.c src/lxc/lxc_cgroup.c src/lxc/lxc_fuse.c -src/lxc/lxc_hostdev.c src/lxc/lxc_container.c src/lxc/lxc_conf.c src/lxc/lxc_controller.c diff --git a/src/Makefile.am b/src/Makefile.am index c3a8ba0..afae0a8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -600,7 +600,6 @@ LXC_DRIVER_SOURCES = \ lxc/lxc_container.c lxc/lxc_container.h \ lxc/lxc_cgroup.c lxc/lxc_cgroup.h \ lxc/lxc_domain.c lxc/lxc_domain.h \ - lxc/lxc_hostdev.c lxc/lxc_hostdev.h \ lxc/lxc_monitor.c lxc/lxc_monitor.h \ lxc/lxc_process.c lxc/lxc_process.h \ lxc/lxc_fuse.c lxc/lxc_fuse.h \ diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index a6208a2..05f2a80 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -92,10 +92,6 @@ struct _virLXCDriver { /* Immutable pointer, self-locking APIs */ virDomainObjListPtr domains; -/* Immutable pointer. Requires lock to be held before - * calling APIs. */ -virUSBDeviceListPtr activeUsbHostdevs; - /* Immutable pointer, self-locking APIs */ virDomainEventStatePtr domainEventState; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index b587c22..098f2f0 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -70,6 +70,7 @@ #include virstring.h #include viraccessapicheck.h #include viraccessapichecklxc.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LXC @@ -1418,9 +1419,6 @@ static int lxcStateInitialize(bool privileged, if (!(lxc_driver-securityManager = lxcSecurityInit(cfg))) goto cleanup; -if ((lxc_driver-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) -goto cleanup; - if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL) goto cleanup; @@ -1535,7 +1533,6 @@ static int lxcStateCleanup(void) virSysinfoDefFree(lxc_driver-hostsysinfo); -virObjectUnref(lxc_driver-activeUsbHostdevs); virObjectUnref(lxc_driver-caps); virObjectUnref(lxc_driver-securityManager); virObjectUnref(lxc_driver-xmlopt); @@ -3214,6 +3211,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, mode_t mode; bool created = false; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if (virDomainHostdevFind(vm-def, def, NULL) = 0) { virReportError(VIR_ERR_OPERATION_FAILED, %s, @@ -3221,6 +3219,13 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (virHostdevPrepareUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, 1, 0) 0) +goto cleanup; + if (virAsprintf(vroot, /proc/%llu/root, (unsigned long long)priv-initpid) 0) goto cleanup; @@ -3296,6 +3301,11 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, ret = 0; cleanup: +virHostdevReAttachUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, + 1); virDomainAuditHostdev(vm, def, attach, ret == 0); if (ret 0 created) unlink(dstfile); @@ -3758,8 +3768,7 @@ cleanup: static int -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, -virDomainObjPtr vm, +lxcDomainDetachDeviceHostdevUSBLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { virLXCDomainObjPrivatePtr priv = vm-privateData; @@ -3768,6 +3777,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, char *dst = NULL; char *vroot = NULL; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if ((idx = virDomainHostdevFind(vm-def, dev-data.hostdev, @@ -3812,9 +3822,9 @@ lxcDomainDetachDeviceHostdevUSBLive
Re: [libvirt] [RESEND][PATCHv5 0/4] write separate module for hostdev passthrough
2013/9/12 Eric Blake ebl...@redhat.com On 09/11/2013 09:25 PM, Chunyan Liu wrote: [rebased to latest libvirt code for applying and reviewing the patches] These patches implements a separate module for hostdev passthrough so that it could be shared by different drivers and can maintain a global state of a host device. Plus, add passthrough to libxl driver, and change qemu driver and lxc driver to use hostdev common library instead of their own hostdev APIs. This did not come through threaded, which makes it a bit harder to track your series (with each patch forming its own thread, a mail client that sorts threads by most recent activity scatters the pieces hither-and-yon as soon as any one patch has a reply). You may want to double-check your git settings for the next patch you send :) Sorry. Resend. -- Eric Blake eblake redhat com+1-919-301-3266 Libvirt virtualization library http://libvirt.org -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [RESEND][PATCHv5 2/4] add pci passthrough to libxl driver
Add pci passthrough to libxl driver, support attach-device, detach-device and start a vm with pci hostdev specified. Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in |2 +- src/libxl/libxl_conf.c | 63 +++ src/libxl/libxl_conf.h |4 + src/libxl/libxl_driver.c | 443 +- 4 files changed, 510 insertions(+), 2 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index ec205c9..d01cb99 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -159,6 +159,7 @@ src/util/vireventpoll.c src/util/virfile.c src/util/virhash.c src/util/virhook.c +src/util/virhostdev.c src/util/viridentity.c src/util/virinitctl.c src/util/viriptables.c @@ -196,7 +197,6 @@ src/util/viruri.c src/util/virusb.c src/util/virutil.c src/util/virxml.c -src/util/virhostdev.c src/vbox/vbox_MSCOMGlue.c src/vbox/vbox_XPCOMCGlue.c src/vbox/vbox_driver.c diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index d4226b8..31d8f8a 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1128,6 +1128,66 @@ libxlDriverConfigGet(libxlDriverPrivatePtr driver) return cfg; } +int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev) +{ +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +return -1; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +return -1; + +pcidev-domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev-bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev-dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev-func = hostdev-source.subsys.u.pci.addr.function; + +return 0; +} + +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +size_t nhostdevs = def-nhostdevs; +size_t npcidevs = 0; +libxl_device_pci *x_pcidevs; +size_t i, j; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) +return -1; + +for (i = 0, j = 0; i nhostdevs; i++) { +if (l_hostdevs[i]-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (l_hostdevs[i]-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +libxl_device_pci_init(x_pcidevs[j]); + +if (libxlMakePci(l_hostdevs[i], x_pcidevs[j]) 0) +goto error; + +npcidevs++; +j++; +} + +VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs); +d_config-pcidevs = x_pcidevs; +d_config-num_pcidevs = npcidevs; + +return 0; + +error: +for (i = 0; i npcidevs; i++) +libxl_device_pci_dispose(x_pcidevs[i]); + +VIR_FREE(x_pcidevs); +return -1; +} + virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -1176,6 +1236,9 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, if (libxlMakeVfbList(driver, def, d_config) 0) return -1; +if (libxlMakePciList(def, d_config) 0) +return -1; + d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 8ba0ee4..31a955a 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -38,6 +38,7 @@ # include virchrdev.h +# define LIBXL_DRIVER_NAME xenlight # define LIBXL_VNC_PORT_MIN 5900 # define LIBXL_VNC_PORT_MAX 65535 @@ -148,6 +149,9 @@ libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb); int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev); + +int libxlBuildDomainConfig(libxlDriverPrivatePtr driver, virDomainObjPtr vm, libxl_domain_config *d_config); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index e2a6d44..5bddf45 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -52,6 +52,8 @@ #include virsysinfo.h #include viraccessapicheck.h #include viratomic.h +#include virhostdev.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -328,6 +330,7 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason) { libxlDomainObjPrivatePtr priv = vm-privateData; +virHostdevManagerPtr hostdev_mgr; if (libxl_domain_destroy(priv-ctx, vm-def-id, NULL) 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -335,6 +338,10 @@ libxlVmReap(libxlDriverPrivatePtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +virHostdevReAttachDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, + vm-def, VIR_SP_PCI_HOSTDEV); + libxlVmCleanup(driver, vm, reason); return 0; } @@ -553,6 +560,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, int managed_save_fd = -1; libxlDomainObjPrivatePtr priv = vm-privateData
[libvirt] [PATCH] add migration APIs to libxl driver
--- src/libxl/libxl_conf.h |4 + src/libxl/libxl_driver.c | 641 ++ src/libxl/libxl_driver.h |5 + 3 files changed, 650 insertions(+), 0 deletions(-) diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 8ba0ee4..2041cc2 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -41,6 +41,9 @@ # define LIBXL_VNC_PORT_MIN 5900 # define LIBXL_VNC_PORT_MAX 65535 +# define LIBXL_MIGRATION_PORT_MIN 49152 +# define LIBXL_MIGRATION_PORT_MAX 49216 + # define LIBXL_CONFIG_DIR SYSCONFDIR /libvirt/libxl # define LIBXL_AUTOSTART_DIR LIBXL_CONFIG_DIR /autostart # define LIBXL_STATE_DIR LOCALSTATEDIR /run/libvirt/libxl @@ -109,6 +112,7 @@ struct _libxlDriverPrivate { /* Immutable pointer, self-locking APIs */ virPortAllocatorPtr reservedVNCPorts; +virPortAllocatorPtr reservedMigPorts; /* Immutable pointer, lockless APIs*/ virSysinfoDefPtr hostsysinfo; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index e2a6d44..93b7153 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -32,6 +32,12 @@ #include libxl_utils.h #include fcntl.h #include regex.h +#include stdlib.h +#include string.h +#include sys/types.h +#include sys/socket.h +#include arpa/inet.h +#include netdb.h #include internal.h #include virlog.h @@ -52,6 +58,7 @@ #include virsysinfo.h #include viraccessapicheck.h #include viratomic.h +#include rpc/virnetsocket.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -69,6 +76,20 @@ static libxlDriverPrivatePtr libxl_driver = NULL; +typedef struct _libxlMigrateReceiveArgs { +virConnectPtr conn; +virDomainObjPtr vm; + +/* for freeing listen sockets */ +virNetSocketPtr *socks; +size_t nsocks; +} libxlMigrateReceiveArgs; + +static const char libxlMigrateReceiverReady[]= +libvirt libxl migration receiver ready, send binary domain data; +static const char libxlMigrateReceiverFinish[]= +domain received, ready to unpause; + /* Function declarations */ static int libxlDomainManagedSaveLoad(virDomainObjPtr vm, @@ -836,6 +857,12 @@ libxlStateInitialize(bool privileged, LIBXL_VNC_PORT_MAX))) goto error; +/* Allocate bitmap for migration port reservation */ +if (!(libxl_driver-reservedMigPorts = + virPortAllocatorNew(LIBXL_MIGRATION_PORT_MIN, + LIBXL_MIGRATION_PORT_MAX))) +goto error; + if (!(libxl_driver-domains = virDomainObjListNew())) goto error; @@ -4175,11 +4202,620 @@ libxlConnectSupportsFeature(virConnectPtr conn, int feature) switch (feature) { case VIR_DRV_FEATURE_TYPED_PARAM_STRING: return 1; +case VIR_DRV_FEATURE_MIGRATION_V3: +return 1; default: return 0; } } +static int +libxlCheckMessageBanner(int fd, const char *banner, int banner_sz) +{ +char buf[banner_sz]; +int ret = 0; + +do { +ret = saferead(fd, buf, banner_sz); +} while (ret == -1 errno == EAGAIN); + +if (ret != banner_sz || memcmp(buf, banner, banner_sz)) { +return -1; +} + +return 0; +} + +static char * +libxlDomainMigrateBegin3(virDomainPtr domain, + const char *xmlin, + char **cookieout ATTRIBUTE_UNUSED, + int *cookieoutlen ATTRIBUTE_UNUSED, + unsigned long flags, + const char *dname ATTRIBUTE_UNUSED, + unsigned long resource ATTRIBUTE_UNUSED) +{ +libxlDriverPrivatePtr driver = domain-conn-privateData; +libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); +virDomainObjPtr vm; +virDomainDefPtr def = NULL; +char *xml = NULL; + +virCheckFlags(LIBXL_MIGRATION_FLAGS, NULL); + +vm = virDomainObjListFindByUUID(driver-domains, domain-uuid); +if (!vm) { +char uuidstr[VIR_UUID_STRING_BUFLEN]; +virUUIDFormat(domain-uuid, uuidstr); +virReportError(VIR_ERR_OPERATION_INVALID, + _(no domain with matching uuid '%s'), uuidstr); +goto cleanup; +} + +if (!virDomainObjIsActive(vm)) { +virReportError(VIR_ERR_OPERATION_INVALID, %s, + _(domain is not running)); +goto cleanup; +} + +if (virDomainMigrateBegin3EnsureACL(domain-conn, vm-def) 0) +goto cleanup; + +if (xmlin) { +if (!(def = virDomainDefParseString(xmlin, cfg-caps, +driver-xmlopt, +1 VIR_DOMAIN_VIRT_XEN, +VIR_DOMAIN_XML_INACTIVE))) +goto cleanup; + +xml = virDomainDefFormat(def, VIR_DOMAIN_XML_SECURE); +} else { +xml = virDomainDefFormat(vm-def, VIR_DOMAIN_XML_SECURE); +} + +cleanup: +virDomainDefFree(def); +if (vm) +
[libvirt] [PATCH] add nocow feature option to vol-create
Btrfs has terrible performance when hosting VM images, even more when the guest in those VM are also using btrfs as file system. One way to mitigate this bad performance is to turn off COW attributes on VM files (since having copy on write for this kind of data is not useful). According to 'chattr' manpage, NOCOW could be set to new or empty file only on btrfs, so this patch tries to add nocow feature option in volume xml and handle it in vol-create, so that users could have a chance to set NOCOW to a new volume if that happens on a btrfs like file system. Signed-off-by: Chunyan Liu cy...@suse.com --- This is a revised version to: http://www.redhat.com/archives/libvir-list/2013-December/msg00303.html Changes: * fix Daniel's comments --- docs/formatstorage.html.in | 12 +--- docs/schemas/storagefilefeatures.rng |3 ++ src/conf/storage_conf.c |9 -- src/storage/storage_backend.c|4 +- src/storage/storage_backend_fs.c | 48 ++ src/util/virstoragefile.c|1 + src/util/virstoragefile.h|1 + 7 files changed, 69 insertions(+), 9 deletions(-) diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index a089a31..3de1a2b 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -385,6 +385,7 @@ lt;compatgt;1.1lt;/compatgt; lt;featuresgt; lt;lazy_refcounts/gt; +lt;nocow/gt; lt;/featuresgt; lt;/targetgt;/pre @@ -423,11 +424,14 @@ span class=sinceSince 1.1.0/span /dd dtcodefeatures/code/dt - ddFormat-specific features. Only used for codeqcow2/code now. -Valid sub-elements are: -ul + ddFormat-specific features. Valid sub-elements are: + ul licodelt;lazy_refcounts/gt;/code - allow delayed reference - counter updates. span class=sinceSince 1.1.0/span/li + counter updates. Only used for codeqcow2/code now. + span class=sinceSince 1.1.0/span/li + licodelt;nocow/gt;/code - turn off copy-on-write. Only valid + to volume on codebtrfs/code, can improve performance. + span class=sinceSince 1.2.2/span/li /ul /dd /dl diff --git a/docs/schemas/storagefilefeatures.rng b/docs/schemas/storagefilefeatures.rng index 424b4e2..0cf3513 100644 --- a/docs/schemas/storagefilefeatures.rng +++ b/docs/schemas/storagefilefeatures.rng @@ -17,6 +17,9 @@ element name='lazy_refcounts' empty/ /element + element name='nocow' +empty/ + /element /optional /interleave /element diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 22e38c1..b6409a6 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -1398,9 +1398,6 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, if ((n = virXPathNodeSet(./target/features/*, ctxt, nodes)) 0) goto error; -if (!ret-target.compat VIR_STRDUP(ret-target.compat, 1.1) 0) -goto error; - if (!(ret-target.features = virBitmapNew(VIR_STORAGE_FILE_FEATURE_LAST))) goto error; @@ -1412,6 +1409,12 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, (const char*)nodes[i]-name); goto error; } + +if (f == VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS) { +if (!ret-target.compat VIR_STRDUP(ret-target.compat, 1.1) 0) +goto error; +} + ignore_value(virBitmapSetBit(ret-target.features, f)); } VIR_FREE(nodes); diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index b08d646..b4ab866 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -423,7 +423,7 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED, operation_flags |= VIR_FILE_OPEN_FORK; if ((fd = virFileOpenAs(vol-target.path, -O_RDWR | O_CREAT | O_EXCL, +O_RDWR | O_CREAT, vol-target.perms.mode, vol-target.perms.uid, vol-target.perms.gid, @@ -729,7 +729,7 @@ virStorageBackendCreateQemuImgOpts(char **opts, break; /* coverity[dead_error_begin] */ -case VIR_STORAGE_FILE_FEATURE_LAST: +default: ; } virBufferAsprintf(buf, %s,, diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 95783be..dc26f6d 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -51,6 +51,13 @@ #include virfile.h #include virlog.h #include virstring.h +#ifdef __linux__ +# include sys/ioctl.h +# include
[libvirt] [v9 4/6] change lxc driver to use hostdev common library
Change lxc driver to use hostdev common library instead of APIs in lxc_hostdev.[ch] Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in|1 - src/Makefile.am |1 - src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 47 --- src/lxc/lxc_hostdev.c | 416 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 24 +++- 7 files changed, 48 insertions(+), 488 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 9e71db3..94017c6 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -61,7 +61,6 @@ src/locking/lock_manager.c src/locking/sanlock_helper.c src/lxc/lxc_cgroup.c src/lxc/lxc_fuse.c -src/lxc/lxc_hostdev.c src/lxc/lxc_container.c src/lxc/lxc_conf.c src/lxc/lxc_controller.c diff --git a/src/Makefile.am b/src/Makefile.am index 8b4a25c..96563dc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -619,7 +619,6 @@ LXC_DRIVER_SOURCES = \ lxc/lxc_container.c lxc/lxc_container.h \ lxc/lxc_cgroup.c lxc/lxc_cgroup.h \ lxc/lxc_domain.c lxc/lxc_domain.h \ - lxc/lxc_hostdev.c lxc/lxc_hostdev.h \ lxc/lxc_monitor.c lxc/lxc_monitor.h \ lxc/lxc_process.c lxc/lxc_process.h \ lxc/lxc_fuse.c lxc/lxc_fuse.h \ diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index e04dcdd..5be159b 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -93,10 +93,6 @@ struct _virLXCDriver { /* Immutable pointer, self-locking APIs */ virDomainObjListPtr domains; -/* Immutable pointer. Requires lock to be held before - * calling APIs. */ -virUSBDeviceListPtr activeUsbHostdevs; - /* Immutable pointer, self-locking APIs */ virObjectEventStatePtr domainEventState; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 7e56a59..2cfa1cd 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -70,6 +70,7 @@ #include virstring.h #include viraccessapicheck.h #include viraccessapichecklxc.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LXC @@ -1524,9 +1525,6 @@ static int lxcStateInitialize(bool privileged, if (!(lxc_driver-securityManager = lxcSecurityInit(cfg))) goto cleanup; -if ((lxc_driver-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) -goto cleanup; - if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL) goto cleanup; @@ -1641,7 +1639,6 @@ static int lxcStateCleanup(void) virSysinfoDefFree(lxc_driver-hostsysinfo); -virObjectUnref(lxc_driver-activeUsbHostdevs); virObjectUnref(lxc_driver-caps); virObjectUnref(lxc_driver-securityManager); virObjectUnref(lxc_driver-xmlopt); @@ -3279,6 +3276,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, mode_t mode; bool created = false; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if (virDomainHostdevFind(vm-def, def, NULL) = 0) { virReportError(VIR_ERR_OPERATION_FAILED, %s, @@ -3286,6 +3284,14 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL || +virHostdevPrepareUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, 1, 0) 0) +return -1; + if (virAsprintf(vroot, /proc/%llu/root, (unsigned long long)priv-initpid) 0) goto cleanup; @@ -3361,6 +3367,11 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, ret = 0; cleanup: +virHostdevReAttachUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, + 1); virDomainAuditHostdev(vm, def, attach, ret == 0); if (ret 0 created) unlink(dstfile); @@ -3823,8 +3834,7 @@ cleanup: static int -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, -virDomainObjPtr vm, +lxcDomainDetachDeviceHostdevUSBLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { virLXCDomainObjPrivatePtr priv = vm-privateData; @@ -3833,6 +3843,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, char *dst = NULL; char *vroot = NULL; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if ((idx = virDomainHostdevFind(vm-def, dev-data.hostdev, @@ -3877,9 +3888,10
[libvirt] [v9 6/6] add pci passthrough to libxl driver
Add pci passthrough to libxl driver, support attach-device, detach-device and start a vm with pci hostdev specified. Signed-off-by: Chunyan Liu cy...@suse.com --- src/libxl/libxl_conf.c | 63 +++ src/libxl/libxl_conf.h |4 + src/libxl/libxl_driver.c | 448 +- 3 files changed, 514 insertions(+), 1 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 04d01af..2a7e78a 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1134,6 +1134,66 @@ libxlDriverConfigGet(libxlDriverPrivatePtr driver) return cfg; } +int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev) +{ +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +return -1; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +return -1; + +pcidev-domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev-bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev-dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev-func = hostdev-source.subsys.u.pci.addr.function; + +return 0; +} + +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +size_t nhostdevs = def-nhostdevs; +size_t npcidevs = 0; +libxl_device_pci *x_pcidevs; +size_t i, j; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) +return -1; + +for (i = 0, j = 0; i nhostdevs; i++) { +if (l_hostdevs[i]-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (l_hostdevs[i]-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +libxl_device_pci_init(x_pcidevs[j]); + +if (libxlMakePci(l_hostdevs[i], x_pcidevs[j]) 0) +goto error; + +npcidevs++; +j++; +} + +VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs); +d_config-pcidevs = x_pcidevs; +d_config-num_pcidevs = npcidevs; + +return 0; + +error: +for (i = 0; i npcidevs; i++) +libxl_device_pci_dispose(x_pcidevs[i]); + +VIR_FREE(x_pcidevs); +return -1; +} + virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -1182,6 +1242,9 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, if (libxlMakeVfbList(driver, def, d_config) 0) return -1; +if (libxlMakePciList(def, d_config) 0) +return -1; + d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index f743541..65c3553 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -39,6 +39,7 @@ # include virchrdev.h +# define LIBXL_DRIVER_NAME xenlight # define LIBXL_VNC_PORT_MIN 5900 # define LIBXL_VNC_PORT_MAX 65535 @@ -151,6 +152,9 @@ libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb); int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev); + +int libxlBuildDomainConfig(libxlDriverPrivatePtr driver, virDomainObjPtr vm, libxl_domain_config *d_config); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 61e3516..e3b0e35 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -52,6 +52,7 @@ #include virsysinfo.h #include viraccessapicheck.h #include viratomic.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -328,6 +329,7 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason) { libxlDomainObjPrivatePtr priv = vm-privateData; +virHostdevManagerPtr hostdev_mgr; if (libxl_domain_destroy(priv-ctx, vm-def-id, NULL) 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -335,6 +337,11 @@ libxlVmReap(libxlDriverPrivatePtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr != NULL) +virHostdevReAttachDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, + vm-def, VIR_SP_PCI_HOSTDEV); + libxlVmCleanup(driver, vm, reason); return 0; } @@ -558,6 +565,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, #ifdef LIBXL_HAVE_DOMAIN_CREATE_RESTORE_PARAMS libxl_domain_restore_params params; #endif +virHostdevManagerPtr hostdev_mgr; if (libxlDomainObjPrivateInitCtx(vm) 0) goto error; @@ -616,6 +624,13 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, goto error; } +VIR_DEBUG(Preparing host PCI devices); +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL || +virHostdevPrepareDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, +vm-def, VIR_SP_PCI_HOSTDEV) 0) +goto error; + /* use
[libvirt] [v9 0/6] Write separate module for hostdev passthrough
These patches implements a separate module for hostdev passthrough so that it could be shared by different drivers and can maintain a global state of a host device. patch 1/6: extract hostdev passthrough function from qemu_hostdev.c and make it reusable by multiple drivers. patch 2/6: add a unit test for hostdev common library. patch 3/6: switch qemu driver to use the common library instead of its own hostdev passthrough APIs. patch 4/6: switch lxc driver to use the common library instead of its own hostdev passthrough APIs. patch 5/6: add a hostdev pci backend type for xen usage. patch 6/6: add pci passthrough to libxl driver. --- Changes * rebase to lasest source code * fix ioctl return value in virHostdevHostSupportsPassthroughKVM() Chunyan Liu (6): add hostdev passthrough common library add unit test for hostdev common library change qemu driver to use hostdev common library change lxc driver to use hostdev common library add hostdev pci backend type for xen add pci passthrough to libxl driver docs/schemas/domaincommon.rng |1 + po/POTFILES.in |3 +- src/Makefile.am|3 +- src/conf/domain_conf.c |3 +- src/conf/domain_conf.h |1 + src/libvirt_private.syms | 21 + src/libxl/libxl_conf.c | 63 + src/libxl/libxl_conf.h |4 + src/libxl/libxl_domain.c |9 + src/libxl/libxl_driver.c | 448 +- src/lxc/lxc_conf.h |4 - src/lxc/lxc_driver.c | 47 +- src/lxc/lxc_hostdev.c | 413 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 24 +- src/qemu/qemu_command.c|4 +- src/qemu/qemu_conf.h |9 +- src/qemu/qemu_domain.c | 22 + src/qemu/qemu_driver.c | 81 +- src/qemu/qemu_hostdev.c| 1454 - src/qemu/qemu_hostdev.h| 76 - src/qemu/qemu_hotplug.c| 136 +- src/qemu/qemu_process.c| 40 +- src/util/virhostdev.c | 1703 src/util/virhostdev.h | 134 ++ src/util/virpci.c | 30 +- src/util/virpci.h |9 +- src/util/virscsi.c | 28 +- src/util/virscsi.h |8 +- src/util/virusb.c | 29 +- src/util/virusb.h |8 +- tests/Makefile.am |5 + .../qemuxml2argv-hostdev-pci-address.xml |1 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml |1 + tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml|2 + tests/virhostdevtest.c | 481 ++ tests/virpcimock.c | 23 +- 37 files changed, 3159 insertions(+), 2212 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h delete mode 100644 src/qemu/qemu_hostdev.c delete mode 100644 src/qemu/qemu_hostdev.h create mode 100644 src/util/virhostdev.c create mode 100644 src/util/virhostdev.h create mode 100644 tests/virhostdevtest.c -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [v9 5/6] add hostdev pci backend type for xen
Add VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN. For legacy xen, it will use pciback as stub driver. Signed-off-by: Chunyan Liu cy...@suse.com --- docs/schemas/domaincommon.rng |1 + src/conf/domain_conf.c|3 ++- src/conf/domain_conf.h|1 + src/libxl/libxl_domain.c |9 + src/qemu/qemu_command.c |3 +-- src/qemu/qemu_hotplug.c |4 +--- src/util/virhostdev.c | 12 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 86a60c9..45625ca 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3337,6 +3337,7 @@ choice valuekvm/value valuevfio/value + valuexen/value /choice /attribute empty/ diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 416d96e..713a306 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -617,7 +617,8 @@ VIR_ENUM_IMPL(virDomainHostdevSubsysPciBackend, VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST, default, kvm, - vfio) + vfio, + xen) VIR_ENUM_IMPL(virDomainHostdevCaps, VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST, storage, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 647d115..5068b09 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -414,6 +414,7 @@ typedef enum { VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT, /* detect automaticaly, prefer VFIO */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM,/* force legacy kvm style */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO, /* force vfio */ +VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN,/* force legacy xen style, use pciback */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST } virDomainHostdevSubsysPciBackendType; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index e72c483..36dd2f5 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -392,6 +392,15 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, STRNEQ(def-os.type, hvm)) dev-data.chr-targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN; +if (dev-type == VIR_DOMAIN_DEVICE_HOSTDEV) { +virDomainHostdevDefPtr hostdev = dev-data.hostdev; + +if (hostdev-mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS +hostdev-source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI +hostdev-source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) +hostdev-source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; +} + return 0; } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 59c3968..e3513fc 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5534,8 +5534,7 @@ qemuBuildPCIHostdevDevStr(virDomainDefPtr def, virBufferAddLit(buf, vfio-pci); break; -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: +default: virReportError(VIR_ERR_INTERNAL_ERROR, _(invalid PCI passthrough type '%s'), virDomainHostdevSubsysPciBackendTypeToString(backend)); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 8ffa663..1ac8eed 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1196,9 +1196,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver, virProcessSetMaxMemLock(vm-pid, memKB * 1024); break; -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: +default: break; } diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index 3ed60d5..3f01819 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -373,6 +373,13 @@ virHostdevGetPciHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs) } break; +case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN : +if (virPCIDeviceSetStubDriver(dev, pciback) 0) { +virObjectUnref(list); +return NULL; +} +break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM : case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) { @@ -1191,6 +1198,11 @@ virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, goto cleanup; break; +case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN : +if (virPCIDeviceSetStubDriver(dev, pciback) 0) +goto cleanup; +break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM : case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) -- 1.6.0.2 -- libvir-list mailing list
[libvirt] [v9 2/6] add unit test for hostdev common library
Add unit test for hostdev common library. Current tests are based on virpcimock. Signed-off-by: Chunyan Liu cy...@suse.com --- tests/Makefile.am |5 + tests/virhostdevtest.c | 481 tests/virpcimock.c | 23 +++- 3 files changed, 508 insertions(+), 1 deletions(-) create mode 100644 tests/virhostdevtest.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 568b7a0..3e66d8c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -141,6 +141,7 @@ test_programs = virshtest sockettest \ virportallocatortest \ sysinfotest \ virstoragetest \ + virhostdevtest \ $(NULL) if WITH_REMOTE @@ -754,6 +755,10 @@ vircgroupmock_la_CFLAGS = $(AM_CFLAGS) vircgroupmock_la_LDFLAGS = -module -avoid-version \ -rpath /evil/libtool/hack/to/force/shared/lib/creation +virhostdevtest_SOURCES = \ + virhostdevtest.c testutils.h testutils.c +virhostdevtest_LDADD = $(LDADDS) + virpcitest_SOURCES = \ virpcitest.c testutils.h testutils.c virpcitest_LDADD = $(LDADDS) diff --git a/tests/virhostdevtest.c b/tests/virhostdevtest.c new file mode 100644 index 000..5b45548 --- /dev/null +++ b/tests/virhostdevtest.c @@ -0,0 +1,481 @@ +/* + * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * http://www.gnu.org/licenses/. + * + * Author: Chunyan Liu cy...@suse.com + */ + +#include config.h + +#include testutils.h + +#ifdef __linux__ + +# include stdlib.h +# include stdio.h +# include sys/types.h +# include sys/stat.h +# include fcntl.h +# include virhostdev.h + +# define VIR_FROM_THIS VIR_FROM_NONE + +# define CHECK_LIST_COUNT(list, cnt)\ +if ((count = virPCIDeviceListCount(list)) != cnt) { \ +virReportError(VIR_ERR_INTERNAL_ERROR, \ + Unexpected count of items in #list : %d,\ + expecting %zu, count, (size_t) cnt); \ +goto cleanup; \ +} + +#ifdef DEBUG +#define DPRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__) +#else +#define DPRINTF(fmt, ...) do { } while (0) +#endif + +#define TEST_STATE_DIR abs_builddir /hostdevmgr +static const char *drv_name = test_driver; +static const char *dom_name = test_domain; +static const unsigned char *uuid = +(unsigned char *)(f92360b0-2541-8791-fb32-d1f838811541); +static int nhostdevs = 3; +static virDomainHostdevDefPtr hostdevs[] = {NULL, NULL, NULL}; +static virPCIDevicePtr dev[] = {NULL, NULL, NULL}; +static virHostdevManagerPtr mgr = NULL; + +static void +myCleanup(void) +{ +size_t i; +for (i = 0; i nhostdevs; i++) { + virPCIDeviceFree(dev[i]); + virDomainHostdevDefFree(hostdevs[i]); +} + +if (mgr) { +virObjectUnref(mgr-activePciHostdevs); +virObjectUnref(mgr-inactivePciHostdevs); +virObjectUnref(mgr-activeUsbHostdevs); +VIR_FREE(mgr-stateDir); +VIR_FREE(mgr); +} +} + +static int +myInit(void) +{ +size_t i; + +for (i = 0; i nhostdevs; i++) { +virDomainHostdevSubsys subsys; +hostdevs[i] = virDomainHostdevDefAlloc(); +if (!hostdevs[i]) +goto cleanup; +hostdevs[i]-mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS; +subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI; +subsys.u.pci.addr.domain = 0; +subsys.u.pci.addr.bus = 0; +subsys.u.pci.addr.slot = i + 1; +subsys.u.pci.addr.function = 0; +subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM; +hostdevs[i]-source.subsys = subsys; +} + +for (i = 0; i nhostdevs; i++) { +if (!(dev[i] = virPCIDeviceNew(0, 0, i + 1, 0)) || +virPCIDeviceSetStubDriver(dev[i], pci-stub) 0) +goto cleanup; +} + +if (VIR_ALLOC(mgr) 0) +goto cleanup; +if ((mgr-activePciHostdevs = virPCIDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-inactivePciHostdevs = virPCIDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-activeScsiHostdevs = virSCSIDeviceListNew()) == NULL) +goto cleanup; +if (VIR_STRDUP(mgr-stateDir
[libvirt] [v10 5/6] add hostdev pci backend type for xen
Add VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN. For legacy xen, it will use pciback as stub driver. Signed-off-by: Chunyan Liu cy...@suse.com --- docs/schemas/domaincommon.rng |1 + src/conf/domain_conf.c|3 ++- src/conf/domain_conf.h|1 + src/libxl/libxl_domain.c |9 + src/qemu/qemu_command.c |3 +-- src/qemu/qemu_hotplug.c |4 +--- src/util/virhostdev.c | 12 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 86a60c9..45625ca 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3337,6 +3337,7 @@ choice valuekvm/value valuevfio/value + valuexen/value /choice /attribute empty/ diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 416d96e..713a306 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -617,7 +617,8 @@ VIR_ENUM_IMPL(virDomainHostdevSubsysPciBackend, VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST, default, kvm, - vfio) + vfio, + xen) VIR_ENUM_IMPL(virDomainHostdevCaps, VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST, storage, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 647d115..5068b09 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -414,6 +414,7 @@ typedef enum { VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT, /* detect automaticaly, prefer VFIO */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM,/* force legacy kvm style */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO, /* force vfio */ +VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN,/* force legacy xen style, use pciback */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST } virDomainHostdevSubsysPciBackendType; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index e72c483..36dd2f5 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -392,6 +392,15 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, STRNEQ(def-os.type, hvm)) dev-data.chr-targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN; +if (dev-type == VIR_DOMAIN_DEVICE_HOSTDEV) { +virDomainHostdevDefPtr hostdev = dev-data.hostdev; + +if (hostdev-mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS +hostdev-source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI +hostdev-source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) +hostdev-source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; +} + return 0; } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 59c3968..e3513fc 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5534,8 +5534,7 @@ qemuBuildPCIHostdevDevStr(virDomainDefPtr def, virBufferAddLit(buf, vfio-pci); break; -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: +default: virReportError(VIR_ERR_INTERNAL_ERROR, _(invalid PCI passthrough type '%s'), virDomainHostdevSubsysPciBackendTypeToString(backend)); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 8ffa663..1ac8eed 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1196,9 +1196,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver, virProcessSetMaxMemLock(vm-pid, memKB * 1024); break; -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: +default: break; } diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index 86d9e0a..68d3e7c 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -373,6 +373,13 @@ virHostdevGetPciHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs) } break; +case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN : +if (virPCIDeviceSetStubDriver(dev, pciback) 0) { +virObjectUnref(list); +return NULL; +} +break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM : case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) { @@ -1191,6 +1198,11 @@ virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, goto cleanup; break; +case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN : +if (virPCIDeviceSetStubDriver(dev, pciback) 0) +goto cleanup; +break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM : case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) -- 1.6.0.2 -- libvir-list mailing list
[libvirt] [v10 0/6] Write separate module for hostdev passthrough
These patches implements a separate module for hostdev passthrough so that it could be shared by different drivers and can maintain a global state of a host device. patch 1/6: extract hostdev passthrough function from qemu_hostdev.c and make it reusable by multiple drivers. patch 2/6: add a unit test for hostdev common library. patch 3/6: switch qemu driver to use the common library instead of its own hostdev passthrough APIs. patch 4/6: switch lxc driver to use the common library instead of its own hostdev passthrough APIs. patch 5/6: add a hostdev pci backend type for xen usage. patch 6/6: add pci passthrough to libxl driver. --- Changes * change copyright to 2014 * use VIR_DEBUG instead of self-defined DPRINTF in virhostdevtest.c * rebase to lasest source code Chunyan Liu (6): add hostdev passthrough common library add unit test to hostdev common library change qemu driver to use hostdev common library change lxc driver to use hostdev common library add hostdev pci backend type for xen add pci passthrough to libxl driver .gnulib|2 +- docs/schemas/domaincommon.rng |1 + po/POTFILES.in |3 +- src/Makefile.am|3 +- src/conf/domain_conf.c |3 +- src/conf/domain_conf.h |1 + src/libvirt_private.syms | 21 + src/libxl/libxl_conf.c | 63 + src/libxl/libxl_conf.h |4 + src/libxl/libxl_domain.c |9 + src/libxl/libxl_driver.c | 448 +- src/lxc/lxc_conf.h |4 - src/lxc/lxc_driver.c | 47 +- src/lxc/lxc_hostdev.c | 413 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 24 +- src/qemu/qemu_command.c|4 +- src/qemu/qemu_conf.h |9 +- src/qemu/qemu_domain.c | 22 + src/qemu/qemu_driver.c | 81 +- src/qemu/qemu_hostdev.c| 1454 - src/qemu/qemu_hostdev.h| 76 - src/qemu/qemu_hotplug.c| 136 +- src/qemu/qemu_process.c| 40 +- src/util/virhostdev.c | 1703 src/util/virhostdev.h | 134 ++ src/util/virpci.c | 30 +- src/util/virpci.h |9 +- src/util/virscsi.c | 28 +- src/util/virscsi.h |8 +- src/util/virusb.c | 29 +- src/util/virusb.h |8 +- tests/Makefile.am |5 + .../qemuxml2argv-hostdev-pci-address.xml |1 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml |1 + tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml|2 + tests/virhostdevtest.c | 473 ++ tests/virpcimock.c | 23 +- 38 files changed, 3152 insertions(+), 2213 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h delete mode 100644 src/qemu/qemu_hostdev.c delete mode 100644 src/qemu/qemu_hostdev.h create mode 100644 src/util/virhostdev.c create mode 100644 src/util/virhostdev.h create mode 100644 tests/virhostdevtest.c -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [v10 4/6] change lxc driver to use hostdev common library
Change lxc driver to use hostdev common library instead of APIs in lxc_hostdev.[ch] Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in|1 - src/Makefile.am |1 - src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 47 --- src/lxc/lxc_hostdev.c | 416 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 24 +++- 7 files changed, 48 insertions(+), 488 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 9e71db3..94017c6 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -61,7 +61,6 @@ src/locking/lock_manager.c src/locking/sanlock_helper.c src/lxc/lxc_cgroup.c src/lxc/lxc_fuse.c -src/lxc/lxc_hostdev.c src/lxc/lxc_container.c src/lxc/lxc_conf.c src/lxc/lxc_controller.c diff --git a/src/Makefile.am b/src/Makefile.am index 8b4a25c..96563dc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -619,7 +619,6 @@ LXC_DRIVER_SOURCES = \ lxc/lxc_container.c lxc/lxc_container.h \ lxc/lxc_cgroup.c lxc/lxc_cgroup.h \ lxc/lxc_domain.c lxc/lxc_domain.h \ - lxc/lxc_hostdev.c lxc/lxc_hostdev.h \ lxc/lxc_monitor.c lxc/lxc_monitor.h \ lxc/lxc_process.c lxc/lxc_process.h \ lxc/lxc_fuse.c lxc/lxc_fuse.h \ diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index e04dcdd..5be159b 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -93,10 +93,6 @@ struct _virLXCDriver { /* Immutable pointer, self-locking APIs */ virDomainObjListPtr domains; -/* Immutable pointer. Requires lock to be held before - * calling APIs. */ -virUSBDeviceListPtr activeUsbHostdevs; - /* Immutable pointer, self-locking APIs */ virObjectEventStatePtr domainEventState; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 7e56a59..2cfa1cd 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -70,6 +70,7 @@ #include virstring.h #include viraccessapicheck.h #include viraccessapichecklxc.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LXC @@ -1524,9 +1525,6 @@ static int lxcStateInitialize(bool privileged, if (!(lxc_driver-securityManager = lxcSecurityInit(cfg))) goto cleanup; -if ((lxc_driver-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) -goto cleanup; - if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL) goto cleanup; @@ -1641,7 +1639,6 @@ static int lxcStateCleanup(void) virSysinfoDefFree(lxc_driver-hostsysinfo); -virObjectUnref(lxc_driver-activeUsbHostdevs); virObjectUnref(lxc_driver-caps); virObjectUnref(lxc_driver-securityManager); virObjectUnref(lxc_driver-xmlopt); @@ -3279,6 +3276,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, mode_t mode; bool created = false; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if (virDomainHostdevFind(vm-def, def, NULL) = 0) { virReportError(VIR_ERR_OPERATION_FAILED, %s, @@ -3286,6 +3284,14 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL || +virHostdevPrepareUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, 1, 0) 0) +return -1; + if (virAsprintf(vroot, /proc/%llu/root, (unsigned long long)priv-initpid) 0) goto cleanup; @@ -3361,6 +3367,11 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, ret = 0; cleanup: +virHostdevReAttachUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, + 1); virDomainAuditHostdev(vm, def, attach, ret == 0); if (ret 0 created) unlink(dstfile); @@ -3823,8 +3834,7 @@ cleanup: static int -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, -virDomainObjPtr vm, +lxcDomainDetachDeviceHostdevUSBLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { virLXCDomainObjPrivatePtr priv = vm-privateData; @@ -3833,6 +3843,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, char *dst = NULL; char *vroot = NULL; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if ((idx = virDomainHostdevFind(vm-def, dev-data.hostdev, @@ -3877,9 +3888,10
[libvirt] [v10 6/6] add pci passthrough to libxl driver
Add pci passthrough to libxl driver, support attach-device, detach-device and start a vm with pci hostdev specified. Signed-off-by: Chunyan Liu cy...@suse.com --- src/libxl/libxl_conf.c | 63 +++ src/libxl/libxl_conf.h |4 + src/libxl/libxl_driver.c | 448 +- 3 files changed, 514 insertions(+), 1 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 04d01af..2a7e78a 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1134,6 +1134,66 @@ libxlDriverConfigGet(libxlDriverPrivatePtr driver) return cfg; } +int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev) +{ +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +return -1; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +return -1; + +pcidev-domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev-bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev-dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev-func = hostdev-source.subsys.u.pci.addr.function; + +return 0; +} + +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +size_t nhostdevs = def-nhostdevs; +size_t npcidevs = 0; +libxl_device_pci *x_pcidevs; +size_t i, j; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) +return -1; + +for (i = 0, j = 0; i nhostdevs; i++) { +if (l_hostdevs[i]-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (l_hostdevs[i]-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +libxl_device_pci_init(x_pcidevs[j]); + +if (libxlMakePci(l_hostdevs[i], x_pcidevs[j]) 0) +goto error; + +npcidevs++; +j++; +} + +VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs); +d_config-pcidevs = x_pcidevs; +d_config-num_pcidevs = npcidevs; + +return 0; + +error: +for (i = 0; i npcidevs; i++) +libxl_device_pci_dispose(x_pcidevs[i]); + +VIR_FREE(x_pcidevs); +return -1; +} + virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -1182,6 +1242,9 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, if (libxlMakeVfbList(driver, def, d_config) 0) return -1; +if (libxlMakePciList(def, d_config) 0) +return -1; + d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index f743541..65c3553 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -39,6 +39,7 @@ # include virchrdev.h +# define LIBXL_DRIVER_NAME xenlight # define LIBXL_VNC_PORT_MIN 5900 # define LIBXL_VNC_PORT_MAX 65535 @@ -151,6 +152,9 @@ libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb); int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev); + +int libxlBuildDomainConfig(libxlDriverPrivatePtr driver, virDomainObjPtr vm, libxl_domain_config *d_config); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 61e3516..e3b0e35 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -52,6 +52,7 @@ #include virsysinfo.h #include viraccessapicheck.h #include viratomic.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -328,6 +329,7 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason) { libxlDomainObjPrivatePtr priv = vm-privateData; +virHostdevManagerPtr hostdev_mgr; if (libxl_domain_destroy(priv-ctx, vm-def-id, NULL) 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -335,6 +337,11 @@ libxlVmReap(libxlDriverPrivatePtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr != NULL) +virHostdevReAttachDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, + vm-def, VIR_SP_PCI_HOSTDEV); + libxlVmCleanup(driver, vm, reason); return 0; } @@ -558,6 +565,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, #ifdef LIBXL_HAVE_DOMAIN_CREATE_RESTORE_PARAMS libxl_domain_restore_params params; #endif +virHostdevManagerPtr hostdev_mgr; if (libxlDomainObjPrivateInitCtx(vm) 0) goto error; @@ -616,6 +624,13 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, goto error; } +VIR_DEBUG(Preparing host PCI devices); +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL || +virHostdevPrepareDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, +vm-def, VIR_SP_PCI_HOSTDEV) 0) +goto error; + /* use
[libvirt] [v10 2/6] add unit test to hostdev common library
Add unit test for hostdev common library. Current tests are based on virpcimock. Signed-off-by: Chunyan Liu cy...@suse.com --- tests/Makefile.am |5 + tests/virhostdevtest.c | 473 tests/virpcimock.c | 23 +++- 3 files changed, 500 insertions(+), 1 deletions(-) create mode 100644 tests/virhostdevtest.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 568b7a0..3e66d8c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -141,6 +141,7 @@ test_programs = virshtest sockettest \ virportallocatortest \ sysinfotest \ virstoragetest \ + virhostdevtest \ $(NULL) if WITH_REMOTE @@ -754,6 +755,10 @@ vircgroupmock_la_CFLAGS = $(AM_CFLAGS) vircgroupmock_la_LDFLAGS = -module -avoid-version \ -rpath /evil/libtool/hack/to/force/shared/lib/creation +virhostdevtest_SOURCES = \ + virhostdevtest.c testutils.h testutils.c +virhostdevtest_LDADD = $(LDADDS) + virpcitest_SOURCES = \ virpcitest.c testutils.h testutils.c virpcitest_LDADD = $(LDADDS) diff --git a/tests/virhostdevtest.c b/tests/virhostdevtest.c new file mode 100644 index 000..2dd9370 --- /dev/null +++ b/tests/virhostdevtest.c @@ -0,0 +1,473 @@ +/* + * Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * http://www.gnu.org/licenses/. + * + * Author: Chunyan Liu cy...@suse.com + */ + +#include config.h + +#include testutils.h + +#ifdef __linux__ + +# include stdlib.h +# include stdio.h +# include sys/types.h +# include sys/stat.h +# include fcntl.h +# include virlog.h +# include virhostdev.h + +# define VIR_FROM_THIS VIR_FROM_NONE + +# define CHECK_LIST_COUNT(list, cnt)\ +if ((count = virPCIDeviceListCount(list)) != cnt) { \ +virReportError(VIR_ERR_INTERNAL_ERROR, \ + Unexpected count of items in #list : %d,\ + expecting %zu, count, (size_t) cnt); \ +goto cleanup; \ +} + +# define TEST_STATE_DIR abs_builddir /hostdevmgr +static const char *drv_name = test_driver; +static const char *dom_name = test_domain; +static const unsigned char *uuid = +(unsigned char *)(f92360b0-2541-8791-fb32-d1f838811541); +static int nhostdevs = 3; +static virDomainHostdevDefPtr hostdevs[] = {NULL, NULL, NULL}; +static virPCIDevicePtr dev[] = {NULL, NULL, NULL}; +static virHostdevManagerPtr mgr = NULL; + +static void +myCleanup(void) +{ +size_t i; +for (i = 0; i nhostdevs; i++) { + virPCIDeviceFree(dev[i]); + virDomainHostdevDefFree(hostdevs[i]); +} + +if (mgr) { +virObjectUnref(mgr-activePciHostdevs); +virObjectUnref(mgr-inactivePciHostdevs); +virObjectUnref(mgr-activeUsbHostdevs); +VIR_FREE(mgr-stateDir); +VIR_FREE(mgr); +} +} + +static int +myInit(void) +{ +size_t i; + +for (i = 0; i nhostdevs; i++) { +virDomainHostdevSubsys subsys; +hostdevs[i] = virDomainHostdevDefAlloc(); +if (!hostdevs[i]) +goto cleanup; +hostdevs[i]-mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS; +subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI; +subsys.u.pci.addr.domain = 0; +subsys.u.pci.addr.bus = 0; +subsys.u.pci.addr.slot = i + 1; +subsys.u.pci.addr.function = 0; +subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM; +hostdevs[i]-source.subsys = subsys; +} + +for (i = 0; i nhostdevs; i++) { +if (!(dev[i] = virPCIDeviceNew(0, 0, i + 1, 0)) || +virPCIDeviceSetStubDriver(dev[i], pci-stub) 0) +goto cleanup; +} + +if (VIR_ALLOC(mgr) 0) +goto cleanup; +if ((mgr-activePciHostdevs = virPCIDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-inactivePciHostdevs = virPCIDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-activeScsiHostdevs = virSCSIDeviceListNew()) == NULL) +goto cleanup; +if (VIR_STRDUP(mgr-stateDir, TEST_STATE_DIR) 0) +goto cleanup; +if (virFileMakePath(mgr-stateDir) 0) +goto cleanup
Re: [libvirt] [PATCH] add nocow feature option to vol-create
2014/1/15 Michal Privoznik mpriv...@redhat.com On 24.12.2013 09:56, Chunyan Liu wrote: Btrfs has terrible performance when hosting VM images, even more when the guest in those VM are also using btrfs as file system. One way to mitigate this bad performance is to turn off COW attributes on VM files (since having copy on write for this kind of data is not useful). According to 'chattr' manpage, NOCOW could be set to new or empty file only on btrfs, so this patch tries to add nocow feature option in volume xml and handle it in vol-create, so that users could have a chance to set NOCOW to a new volume if that happens on a btrfs like file system. Signed-off-by: Chunyan Liu cy...@suse.com --- This is a revised version to: http://www.redhat.com/archives/libvir-list/2013-December/msg00303.html Changes: * fix Daniel's comments --- docs/formatstorage.html.in | 12 +--- docs/schemas/storagefilefeatures.rng |3 ++ src/conf/storage_conf.c |9 -- src/storage/storage_backend.c|4 +- src/storage/storage_backend_fs.c | 48 ++ src/util/virstoragefile.c|1 + src/util/virstoragefile.h|1 + 7 files changed, 69 insertions(+), 9 deletions(-) Can you add a testcase that (at least) checks the RNG scheme? The more your test tests the better. Michal, thanks for your comment. Sorry for late response. I'm on vacation these days. Sure, I can add some testcase for that. diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index a089a31..3de1a2b 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -385,6 +385,7 @@ lt;compatgt;1.1lt;/compatgt; lt;featuresgt; lt;lazy_refcounts/gt; +lt;nocow/gt; lt;/featuresgt; lt;/targetgt;/pre @@ -423,11 +424,14 @@ span class=sinceSince 1.1.0/span /dd dtcodefeatures/code/dt - ddFormat-specific features. Only used for codeqcow2/code now. -Valid sub-elements are: -ul + ddFormat-specific features. Valid sub-elements are: + ul licodelt;lazy_refcounts/gt;/code - allow delayed reference - counter updates. span class=sinceSince 1.1.0/span/li + counter updates. Only used for codeqcow2/code now. + span class=sinceSince 1.1.0/span/li + licodelt;nocow/gt;/code - turn off copy-on-write. Only valid + to volume on codebtrfs/code, can improve performance. + span class=sinceSince 1.2.2/span/li /ul /dd /dl diff --git a/docs/schemas/storagefilefeatures.rng b/docs/schemas/storagefilefeatures.rng index 424b4e2..0cf3513 100644 --- a/docs/schemas/storagefilefeatures.rng +++ b/docs/schemas/storagefilefeatures.rng @@ -17,6 +17,9 @@ element name='lazy_refcounts' empty/ /element + element name='nocow' +empty/ + /element /optional /interleave /element diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 22e38c1..b6409a6 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -1398,9 +1398,6 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, if ((n = virXPathNodeSet(./target/features/*, ctxt, nodes)) 0) goto error; -if (!ret-target.compat VIR_STRDUP(ret-target.compat, 1.1) 0) -goto error; - if (!(ret-target.features = virBitmapNew(VIR_STORAGE_FILE_FEATURE_LAST))) goto error; @@ -1412,6 +1409,12 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, (const char*)nodes[i]-name); goto error; } + +if (f == VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS) { +if (!ret-target.compat VIR_STRDUP(ret-target.compat, 1.1) 0) +goto error; +} + ignore_value(virBitmapSetBit(ret-target.features, f)); } VIR_FREE(nodes); diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index b08d646..b4ab866 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -423,7 +423,7 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED, operation_flags |= VIR_FILE_OPEN_FORK; if ((fd = virFileOpenAs(vol-target.path, -O_RDWR | O_CREAT | O_EXCL, +O_RDWR | O_CREAT, I don't think this is safe. I see why are you doing this [2], but what if user hadn't specified nocow feature? Then we might overwrite an existing file. And we want to do that. I'm aware of the overwrite issue. But in fact
[libvirt] [v11 5/6] add hostdev pci backend type for xen
Add VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN. For legacy xen, it will use pciback as stub driver. Signed-off-by: Chunyan Liu cy...@suse.com --- docs/schemas/domaincommon.rng |1 + src/conf/domain_conf.c|3 ++- src/conf/domain_conf.h|1 + src/libxl/libxl_domain.c |9 + src/qemu/qemu_command.c |3 +-- src/qemu/qemu_hotplug.c |4 +--- src/util/virhostdev.c | 12 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 7f55f24..9f5c47d 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3376,6 +3376,7 @@ choice valuekvm/value valuevfio/value + valuexen/value /choice /attribute empty/ diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 28e24f9..69b10c9 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -623,7 +623,8 @@ VIR_ENUM_IMPL(virDomainHostdevSubsysPciBackend, VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST, default, kvm, - vfio) + vfio, + xen) VIR_ENUM_IMPL(virDomainHostdevCaps, VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST, storage, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d8f2e49..7a00cad 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -414,6 +414,7 @@ typedef enum { VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT, /* detect automaticaly, prefer VFIO */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM,/* force legacy kvm style */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO, /* force vfio */ +VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN,/* force legacy xen style, use pciback */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST } virDomainHostdevSubsysPciBackendType; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index e72c483..36dd2f5 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -392,6 +392,15 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, STRNEQ(def-os.type, hvm)) dev-data.chr-targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN; +if (dev-type == VIR_DOMAIN_DEVICE_HOSTDEV) { +virDomainHostdevDefPtr hostdev = dev-data.hostdev; + +if (hostdev-mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS +hostdev-source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI +hostdev-source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) +hostdev-source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; +} + return 0; } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c6d075f..3809a1c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5537,8 +5537,7 @@ qemuBuildPCIHostdevDevStr(virDomainDefPtr def, virBufferAddLit(buf, vfio-pci); break; -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: +default: virReportError(VIR_ERR_INTERNAL_ERROR, _(invalid PCI passthrough type '%s'), virDomainHostdevSubsysPciBackendTypeToString(backend)); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index badf7c7..8a69727 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1194,9 +1194,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver, virProcessSetMaxMemLock(vm-pid, memKB * 1024); break; -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: +default: break; } diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index fa178e2..85d9e8d 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -373,6 +373,13 @@ virHostdevGetPciHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs) } break; +case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN : +if (virPCIDeviceSetStubDriver(dev, pciback) 0) { +virObjectUnref(list); +return NULL; +} +break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM : case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) { @@ -1192,6 +1199,11 @@ virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, goto cleanup; break; +case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN : +if (virPCIDeviceSetStubDriver(dev, pciback) 0) +goto cleanup; +break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM : case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) -- 1.6.0.2 -- libvir-list mailing list
[libvirt] [v11 0/6] Write separate module for hostdev passthrough
These patches implements a separate module for hostdev passthrough so that it could be shared by different drivers and can maintain a global state of a host device. patch 1/6: extract hostdev passthrough function from qemu_hostdev.c and make it reusable by multiple drivers. patch 2/6: add a unit test for hostdev common library. patch 3/6: switch qemu driver to use the common library instead of its own hostdev passthrough APIs. patch 4/6: switch lxc driver to use the common library instead of its own hostdev passthrough APIs. patch 5/6: add a hostdev pci backend type for xen usage. patch 6/6: add pci passthrough to libxl driver. --- Changes * rebase to lastest changes in src/util/virscsi.c, src/qemu/qemu_process.c, tests/virpcimock.c, etc. Chunyan Liu (6): add hostdev passthrough common library add unit test for hostdev common library change qemu driver to use hostdev common library change lxc driver to use hostdev common library add hostdev pci backend type for xen add pci passthrough to libxl driver docs/schemas/domaincommon.rng |1 + po/POTFILES.in |3 +- src/Makefile.am|3 +- src/conf/domain_conf.c |3 +- src/conf/domain_conf.h |1 + src/libvirt_private.syms | 21 + src/libxl/libxl_conf.c | 63 + src/libxl/libxl_conf.h |4 + src/libxl/libxl_domain.c |9 + src/libxl/libxl_driver.c | 448 +- src/lxc/lxc_conf.h |4 - src/lxc/lxc_driver.c | 47 +- src/lxc/lxc_hostdev.c | 413 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 24 +- src/qemu/qemu_command.c|4 +- src/qemu/qemu_conf.h |9 +- src/qemu/qemu_domain.c | 22 + src/qemu/qemu_driver.c | 81 +- src/qemu/qemu_hostdev.c| 1457 - src/qemu/qemu_hostdev.h| 76 - src/qemu/qemu_hotplug.c| 136 +- src/qemu/qemu_process.c| 40 +- src/util/virhostdev.c | 1706 src/util/virhostdev.h | 134 ++ src/util/virpci.c | 30 +- src/util/virpci.h |9 +- src/util/virscsi.c | 28 +- src/util/virscsi.h |8 +- src/util/virusb.c | 29 +- src/util/virusb.h |8 +- tests/Makefile.am |5 + .../qemuxml2argv-hostdev-pci-address.xml |1 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml |1 + tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml|2 + tests/virhostdevtest.c | 473 ++ 36 files changed, 3132 insertions(+), 2214 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h delete mode 100644 src/qemu/qemu_hostdev.c delete mode 100644 src/qemu/qemu_hostdev.h create mode 100644 src/util/virhostdev.c create mode 100644 src/util/virhostdev.h create mode 100644 tests/virhostdevtest.c -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [v11 6/6] add pci passthrough to libxl driver
Add pci passthrough to libxl driver, support attach-device, detach-device and start a vm with pci hostdev specified. Signed-off-by: Chunyan Liu cy...@suse.com --- src/libxl/libxl_conf.c | 63 +++ src/libxl/libxl_conf.h |4 + src/libxl/libxl_driver.c | 448 +- 3 files changed, 514 insertions(+), 1 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 4cefadf..54f9f9c 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1141,6 +1141,66 @@ libxlDriverConfigGet(libxlDriverPrivatePtr driver) return cfg; } +int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev) +{ +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +return -1; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +return -1; + +pcidev-domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev-bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev-dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev-func = hostdev-source.subsys.u.pci.addr.function; + +return 0; +} + +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +size_t nhostdevs = def-nhostdevs; +size_t npcidevs = 0; +libxl_device_pci *x_pcidevs; +size_t i, j; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) +return -1; + +for (i = 0, j = 0; i nhostdevs; i++) { +if (l_hostdevs[i]-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (l_hostdevs[i]-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +libxl_device_pci_init(x_pcidevs[j]); + +if (libxlMakePci(l_hostdevs[i], x_pcidevs[j]) 0) +goto error; + +npcidevs++; +j++; +} + +VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs); +d_config-pcidevs = x_pcidevs; +d_config-num_pcidevs = npcidevs; + +return 0; + +error: +for (i = 0; i npcidevs; i++) +libxl_device_pci_dispose(x_pcidevs[i]); + +VIR_FREE(x_pcidevs); +return -1; +} + virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -1189,6 +1249,9 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, if (libxlMakeVfbList(driver, def, d_config) 0) return -1; +if (libxlMakePciList(def, d_config) 0) +return -1; + d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index f743541..65c3553 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -39,6 +39,7 @@ # include virchrdev.h +# define LIBXL_DRIVER_NAME xenlight # define LIBXL_VNC_PORT_MIN 5900 # define LIBXL_VNC_PORT_MAX 65535 @@ -151,6 +152,9 @@ libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb); int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev); + +int libxlBuildDomainConfig(libxlDriverPrivatePtr driver, virDomainObjPtr vm, libxl_domain_config *d_config); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index fc0efa2..4f156be 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -52,6 +52,7 @@ #include virsysinfo.h #include viraccessapicheck.h #include viratomic.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -328,6 +329,7 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason) { libxlDomainObjPrivatePtr priv = vm-privateData; +virHostdevManagerPtr hostdev_mgr; if (libxl_domain_destroy(priv-ctx, vm-def-id, NULL) 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -335,6 +337,11 @@ libxlVmReap(libxlDriverPrivatePtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr != NULL) +virHostdevReAttachDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, + vm-def, VIR_SP_PCI_HOSTDEV); + libxlVmCleanup(driver, vm, reason); return 0; } @@ -558,6 +565,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, #ifdef LIBXL_HAVE_DOMAIN_CREATE_RESTORE_PARAMS libxl_domain_restore_params params; #endif +virHostdevManagerPtr hostdev_mgr; if (libxlDomainObjPrivateInitCtx(vm) 0) goto error; @@ -616,6 +624,13 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, goto error; } +VIR_DEBUG(Preparing host PCI devices); +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL || +virHostdevPrepareDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, +vm-def, VIR_SP_PCI_HOSTDEV) 0) +goto error; + /* use
[libvirt] [v11 4/6] change lxc driver to use hostdev common library
Change lxc driver to use hostdev common library instead of APIs in lxc_hostdev.[ch] Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in|1 - src/Makefile.am |1 - src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 47 --- src/lxc/lxc_hostdev.c | 416 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 24 +++- 7 files changed, 48 insertions(+), 488 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 9e71db3..94017c6 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -61,7 +61,6 @@ src/locking/lock_manager.c src/locking/sanlock_helper.c src/lxc/lxc_cgroup.c src/lxc/lxc_fuse.c -src/lxc/lxc_hostdev.c src/lxc/lxc_container.c src/lxc/lxc_conf.c src/lxc/lxc_controller.c diff --git a/src/Makefile.am b/src/Makefile.am index e8b6fc4..20ceec2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -619,7 +619,6 @@ LXC_DRIVER_SOURCES = \ lxc/lxc_container.c lxc/lxc_container.h \ lxc/lxc_cgroup.c lxc/lxc_cgroup.h \ lxc/lxc_domain.c lxc/lxc_domain.h \ - lxc/lxc_hostdev.c lxc/lxc_hostdev.h \ lxc/lxc_monitor.c lxc/lxc_monitor.h \ lxc/lxc_process.c lxc/lxc_process.h \ lxc/lxc_fuse.c lxc/lxc_fuse.h \ diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index e04dcdd..5be159b 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -93,10 +93,6 @@ struct _virLXCDriver { /* Immutable pointer, self-locking APIs */ virDomainObjListPtr domains; -/* Immutable pointer. Requires lock to be held before - * calling APIs. */ -virUSBDeviceListPtr activeUsbHostdevs; - /* Immutable pointer, self-locking APIs */ virObjectEventStatePtr domainEventState; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 982f3fc..3a62638 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -70,6 +70,7 @@ #include virstring.h #include viraccessapicheck.h #include viraccessapichecklxc.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LXC @@ -1526,9 +1527,6 @@ static int lxcStateInitialize(bool privileged, if (!(lxc_driver-securityManager = lxcSecurityInit(cfg))) goto cleanup; -if ((lxc_driver-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) -goto cleanup; - if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL) goto cleanup; @@ -1643,7 +1641,6 @@ static int lxcStateCleanup(void) virSysinfoDefFree(lxc_driver-hostsysinfo); -virObjectUnref(lxc_driver-activeUsbHostdevs); virObjectUnref(lxc_driver-caps); virObjectUnref(lxc_driver-securityManager); virObjectUnref(lxc_driver-xmlopt); @@ -3903,6 +3900,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, mode_t mode; bool created = false; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if (virDomainHostdevFind(vm-def, def, NULL) = 0) { virReportError(VIR_ERR_OPERATION_FAILED, %s, @@ -3910,6 +3908,14 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL || +virHostdevPrepareUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, 1, 0) 0) +return -1; + if (virAsprintf(vroot, /proc/%llu/root, (unsigned long long)priv-initpid) 0) goto cleanup; @@ -3985,6 +3991,11 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, ret = 0; cleanup: +virHostdevReAttachUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, + 1); virDomainAuditHostdev(vm, def, attach, ret == 0); if (ret 0 created) unlink(dstfile); @@ -4447,8 +4458,7 @@ cleanup: static int -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, -virDomainObjPtr vm, +lxcDomainDetachDeviceHostdevUSBLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { virLXCDomainObjPrivatePtr priv = vm-privateData; @@ -4457,6 +4467,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, char *dst = NULL; char *vroot = NULL; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if ((idx = virDomainHostdevFind(vm-def, dev-data.hostdev, @@ -4501,9 +4512,10
[libvirt] [v11 2/6] add unit test for hostdev common library
Add unit test for hostdev common library. Current tests are based on virpcimock. Signed-off-by: Chunyan Liu cy...@suse.com --- tests/Makefile.am |5 + tests/virhostdevtest.c | 473 2 files changed, 478 insertions(+), 0 deletions(-) create mode 100644 tests/virhostdevtest.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 568b7a0..3e66d8c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -141,6 +141,7 @@ test_programs = virshtest sockettest \ virportallocatortest \ sysinfotest \ virstoragetest \ + virhostdevtest \ $(NULL) if WITH_REMOTE @@ -754,6 +755,10 @@ vircgroupmock_la_CFLAGS = $(AM_CFLAGS) vircgroupmock_la_LDFLAGS = -module -avoid-version \ -rpath /evil/libtool/hack/to/force/shared/lib/creation +virhostdevtest_SOURCES = \ + virhostdevtest.c testutils.h testutils.c +virhostdevtest_LDADD = $(LDADDS) + virpcitest_SOURCES = \ virpcitest.c testutils.h testutils.c virpcitest_LDADD = $(LDADDS) diff --git a/tests/virhostdevtest.c b/tests/virhostdevtest.c new file mode 100644 index 000..2dd9370 --- /dev/null +++ b/tests/virhostdevtest.c @@ -0,0 +1,473 @@ +/* + * Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * http://www.gnu.org/licenses/. + * + * Author: Chunyan Liu cy...@suse.com + */ + +#include config.h + +#include testutils.h + +#ifdef __linux__ + +# include stdlib.h +# include stdio.h +# include sys/types.h +# include sys/stat.h +# include fcntl.h +# include virlog.h +# include virhostdev.h + +# define VIR_FROM_THIS VIR_FROM_NONE + +# define CHECK_LIST_COUNT(list, cnt)\ +if ((count = virPCIDeviceListCount(list)) != cnt) { \ +virReportError(VIR_ERR_INTERNAL_ERROR, \ + Unexpected count of items in #list : %d,\ + expecting %zu, count, (size_t) cnt); \ +goto cleanup; \ +} + +# define TEST_STATE_DIR abs_builddir /hostdevmgr +static const char *drv_name = test_driver; +static const char *dom_name = test_domain; +static const unsigned char *uuid = +(unsigned char *)(f92360b0-2541-8791-fb32-d1f838811541); +static int nhostdevs = 3; +static virDomainHostdevDefPtr hostdevs[] = {NULL, NULL, NULL}; +static virPCIDevicePtr dev[] = {NULL, NULL, NULL}; +static virHostdevManagerPtr mgr = NULL; + +static void +myCleanup(void) +{ +size_t i; +for (i = 0; i nhostdevs; i++) { + virPCIDeviceFree(dev[i]); + virDomainHostdevDefFree(hostdevs[i]); +} + +if (mgr) { +virObjectUnref(mgr-activePciHostdevs); +virObjectUnref(mgr-inactivePciHostdevs); +virObjectUnref(mgr-activeUsbHostdevs); +VIR_FREE(mgr-stateDir); +VIR_FREE(mgr); +} +} + +static int +myInit(void) +{ +size_t i; + +for (i = 0; i nhostdevs; i++) { +virDomainHostdevSubsys subsys; +hostdevs[i] = virDomainHostdevDefAlloc(); +if (!hostdevs[i]) +goto cleanup; +hostdevs[i]-mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS; +subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI; +subsys.u.pci.addr.domain = 0; +subsys.u.pci.addr.bus = 0; +subsys.u.pci.addr.slot = i + 1; +subsys.u.pci.addr.function = 0; +subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM; +hostdevs[i]-source.subsys = subsys; +} + +for (i = 0; i nhostdevs; i++) { +if (!(dev[i] = virPCIDeviceNew(0, 0, i + 1, 0)) || +virPCIDeviceSetStubDriver(dev[i], pci-stub) 0) +goto cleanup; +} + +if (VIR_ALLOC(mgr) 0) +goto cleanup; +if ((mgr-activePciHostdevs = virPCIDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-inactivePciHostdevs = virPCIDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-activeScsiHostdevs = virSCSIDeviceListNew()) == NULL) +goto cleanup; +if (VIR_STRDUP(mgr-stateDir, TEST_STATE_DIR) 0) +goto cleanup; +if (virFileMakePath(mgr-stateDir) 0) +goto cleanup; + +return 0; + +cleanup: +myCleanup
[libvirt] [PATCH v12 00/11] Write separate module for hostdev passthrough
These patches implements a separate module for hostdev passthrough so that it could be shared by different drivers and can maintain a global state of a host device. patch 1/11: pci/usb/scsi used_by should include driver and domain info to check conflict among different drivers. patch 2/11~5/11: extract qemu specific code outside, to prepare for hostdev common library patch 6/11: move hostdev functions from qemu_hostdev.c to common library and maintain insistent device state. patch 7/11: add a unit test for hostdev common library. patch 8/11: switch qemu driver to use the common library instead of its own hostdev passthrough APIs. patch 9/11: switch lxc driver to use the common library instead of its own hostdev passthrough APIs. patch 10/11: add a hostdev pci backend type for xen usage. patch 11/11: add pci passthrough to libxl driver. --- Changes to v11: * rebase to latest shareable scsi hostdev changes * split v11 1/6 (add hostdev common library): add some small patches to extract qemu specific codes outside first before adding hostdev common library patch, for easier review. Chunyan Liu (11): change used_by: specify both driver and domain qemu_hostdev: move cfg-relaxedACS as a flag qemu_hostdev: move COLD_BOOT as a flag qemu_hostdev: parse BACKEND_DEFAULT outside qemu_hostdev: add/remove share device outside add hostdev passthrough common library add unit test for hostdev common library change qemu driver to use hostdev common library change lxc driver to use hostdev common library add hostdev pci backend type for xen add pci passthrough for libxl driver .gitignore |1 + docs/schemas/domaincommon.rng |1 + po/POTFILES.in |3 +- src/Makefile.am|3 +- src/conf/domain_conf.c |3 +- src/conf/domain_conf.h |1 + src/libvirt_private.syms | 21 + src/libxl/libxl_conf.c | 63 + src/libxl/libxl_conf.h |4 + src/libxl/libxl_domain.c |9 + src/libxl/libxl_driver.c | 448 +- src/lxc/lxc_conf.h |4 - src/lxc/lxc_driver.c | 47 +- src/lxc/lxc_hostdev.c | 413 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 24 +- src/qemu/qemu_command.c|4 +- src/qemu/qemu_conf.h | 11 +- src/qemu/qemu_domain.c | 22 + src/qemu/qemu_driver.c | 83 +- src/qemu/qemu_hostdev.c| 89 +- src/qemu/qemu_hostdev.h|5 +- src/qemu/qemu_hotplug.c| 144 +- src/qemu/qemu_process.c| 61 +- src/util/virhostdev.c | 1787 src/util/virhostdev.h | 134 ++ src/util/virpci.c | 30 +- src/util/virpci.h |9 +- src/util/virscsi.c | 30 +- src/util/virscsi.h |7 +- src/util/virusb.c | 29 +- src/util/virusb.h |8 +- tests/Makefile.am |5 + .../qemuxml2argv-hostdev-pci-address.xml |1 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml |1 + tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml|2 + tests/virhostdevtest.c | 473 ++ tests/virscsitest.c|6 +- 38 files changed, 3292 insertions(+), 737 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h create mode 100644 src/util/virhostdev.c create mode 100644 src/util/virhostdev.h create mode 100644 tests/virhostdevtest.c -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v12 02/11] qemu_hostdev: move cfg-relaxedACS as a flag
For extracting hostdev codes from qemu_hostdev.c to common library, change qemu specific cfg-relaxedACS handling to be a flag, and pass it to hostdev functions. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 11 +++ src/qemu/qemu_hostdev.h | 10 -- src/qemu/qemu_hotplug.c |7 ++- src/qemu/qemu_process.c |5 - 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 01c24f9..0d313c0 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -650,7 +650,8 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, const unsigned char *uuid, virDomainHostdevDefPtr *hostdevs, int nhostdevs, - virQEMUCapsPtr qemuCaps) + virQEMUCapsPtr qemuCaps, + unsigned int flags) { virPCIDeviceListPtr pcidevs = NULL; int last_processed_hostdev_vf = -1; @@ -682,8 +683,9 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, for (i = 0; i virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); virPCIDevicePtr other; +bool strict_acs_check = !!(flags VIR_STRICT_ACS_CHECK); -if (!virPCIDeviceIsAssignable(dev, !cfg-relaxedACS)) { +if (!virPCIDeviceIsAssignable(dev, strict_acs_check)) { virReportError(VIR_ERR_OPERATION_INVALID, _(PCI device %s is not assignable), virPCIDeviceGetName(dev)); @@ -1187,14 +1189,15 @@ int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - bool coldBoot) + bool coldBoot, + unsigned int flags) { if (!def-nhostdevs) return 0; if (qemuPrepareHostdevPCIDevices(driver, def-name, def-uuid, def-hostdevs, def-nhostdevs, - qemuCaps) 0) + qemuCaps, flags) 0) return -1; if (qemuPrepareHostUSBDevices(driver, def, coldBoot) 0) diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h index ffb3167..ab7fb9f 100644 --- a/src/qemu/qemu_hostdev.h +++ b/src/qemu/qemu_hostdev.h @@ -27,6 +27,10 @@ # include qemu_conf.h # include domain_conf.h +typedef enum { + VIR_STRICT_ACS_CHECK = (1 0), /* strict acs check */ +} qemuHostdevFlag; + int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, virDomainDefPtr def); int qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, @@ -40,7 +44,8 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, const unsigned char *uuid, virDomainHostdevDefPtr *hostdevs, int nhostdevs, - virQEMUCapsPtr qemuCaps); + virQEMUCapsPtr qemuCaps, + unsigned int flags); int qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, bool mandatory, virUSBDevicePtr *usb); @@ -54,7 +59,8 @@ int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - bool coldBoot); + bool coldBoot, + unsigned int flags); void qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, const char *name, virDomainHostdevDefPtr *hostdevs, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 7066be6..c47c5e8 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1154,12 +1154,16 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver, bool teardownlabel = false; int backend; unsigned long long memKB; +virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); +unsigned int flags = 0; if (VIR_REALLOC_N(vm-def-hostdevs, vm-def-nhostdevs + 1) 0) return -1; +if (!cfg-relaxedACS) +flags |= VIR_STRICT_ACS_CHECK; if (qemuPrepareHostdevPCIDevices(driver, vm-def-name, vm-def-uuid, - hostdev, 1, priv-qemuCaps) 0) + hostdev, 1, priv-qemuCaps, flags) 0) return -1; /* this could have been changed by qemuPrepareHostdevPCIDevices */ @@ -1254,6 +1258,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver, VIR_FREE(devstr); VIR_FREE(configfd_name
[libvirt] [PATCH v12 01/11] change used_by: specify both driver and domain
Add driver info to used_by, to avoid conflict among different drivers if there are more than one drivers existing and using the hostdev. Signed-off-by: Chunyan Liu cy...@suse.com --- src/lxc/lxc_hostdev.c | 11 +++ src/qemu/qemu_conf.h|2 ++ src/qemu/qemu_driver.c |8 src/qemu/qemu_hostdev.c | 41 + src/util/virpci.c | 30 +++--- src/util/virpci.h |9 ++--- src/util/virscsi.c | 30 ++ src/util/virscsi.h |7 +-- src/util/virusb.c | 29 ++--- src/util/virusb.h |8 ++-- tests/virscsitest.c |6 +++--- 11 files changed, 125 insertions(+), 56 deletions(-) diff --git a/src/lxc/lxc_hostdev.c b/src/lxc/lxc_hostdev.c index 3b371fc..77ce965 100644 --- a/src/lxc/lxc_hostdev.c +++ b/src/lxc/lxc_hostdev.c @@ -60,7 +60,7 @@ virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, continue; } -virUSBDeviceSetUsedBy(usb, def-name); +virUSBDeviceSetUsedBy(usb, QEMU, def-name); virObjectLock(driver-activeUsbHostdevs); if (virUSBDeviceListAdd(driver-activeUsbHostdevs, usb) 0) { @@ -90,7 +90,9 @@ virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver, for (i = 0; i count; i++) { virUSBDevicePtr usb = virUSBDeviceListGet(list, i); if ((tmp = virUSBDeviceListFind(driver-activeUsbHostdevs, usb))) { -const char *other_name = virUSBDeviceGetUsedBy(tmp); +const char *other_name = NULL; +const char *other_drvname = NULL; +virUSBDeviceGetUsedBy(tmp, other_drvname, other_name); if (other_name) virReportError(VIR_ERR_OPERATION_INVALID, @@ -103,7 +105,7 @@ virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver, goto error; } -virUSBDeviceSetUsedBy(usb, name); +virUSBDeviceSetUsedBy(usb, QEMU, name); VIR_DEBUG(Adding %03d.%03d dom=%s to activeUsbHostdevs, virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name); /* @@ -352,6 +354,7 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver, virDomainHostdevDefPtr hostdev = hostdevs[i]; virUSBDevicePtr usb, tmp; const char *used_by = NULL; +const char *used_by_drvname = NULL; if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; @@ -389,7 +392,7 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver, continue; } -used_by = virUSBDeviceGetUsedBy(tmp); +virUSBDeviceGetUsedBy(tmp, used_by_drvname, used_by); if (STREQ_NULLABLE(used_by, name)) { VIR_DEBUG(Removing %03d.%03d dom=%s from activeUsbHostdevs, hostdev-source.subsys.u.usb.bus, diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 1f44a76..158cc1a 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -53,6 +53,8 @@ # error Port me # endif +# define QEMU_DRIVER_NAME QEMU + typedef struct _virQEMUDriver virQEMUDriver; typedef virQEMUDriver *virQEMUDriverPtr; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 59e018d..1fe8992 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -97,8 +97,6 @@ #define VIR_FROM_THIS VIR_FROM_QEMU -#define QEMU_DRIVER_NAME QEMU - #define QEMU_NB_MEM_PARAM 3 #define QEMU_NB_BLOCK_IO_TUNE_PARAM 6 @@ -11325,7 +11323,9 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) virObjectLock(driver-inactivePciHostdevs); other = virPCIDeviceListFind(driver-activePciHostdevs, pci); if (other) { -const char *other_name = virPCIDeviceGetUsedBy(other); +const char *other_name = NULL; +const char *other_drvname = NULL; +virPCIDeviceGetUsedBy(other, other_drvname, other_name); if (other_name) virReportError(VIR_ERR_OPERATION_INVALID, @@ -16684,7 +16684,7 @@ static virDriver qemuDriver = { static virStateDriver qemuStateDriver = { -.name = QEMU, +.name = QEMU_DRIVER_NAME, .stateInitialize = qemuStateInitialize, .stateAutoStart = qemuStateAutoStart, .stateCleanup = qemuStateCleanup, diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 1b16386..01c24f9 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -177,7 +177,7 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, goto cleanup; } -virPCIDeviceSetUsedBy(dev, def-name); +virPCIDeviceSetUsedBy(dev, QEMU_DRIVER_NAME, def-name); /* Setup the original states for the PCI device */ virPCIDeviceSetUnbindFromStub(dev, hostdev-origstates.states.pci.unbind_from_stub); @@ -230,7 +230,7 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, continue; } -virUSBDeviceSetUsedBy(usb
[libvirt] [PATCH v12 05/11] qemu_hostdev: add/remove share device outside
For extracting hostdev codes from qemu_hostdev.c to common library, move add/remove a shareable csi hostdev to/from shared device table outside hostdev functions. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |9 - src/qemu/qemu_hotplug.c | 14 ++ src/qemu/qemu_process.c | 28 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 80552cd..cfdfb03 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -1061,9 +1061,6 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; dev.data.hostdev = hostdevs[i]; -if (qemuAddSharedDevice(driver, dev, name) 0) -return -1; - if (qemuSetUnprivSGIO(dev) 0) return -1; } @@ -1389,12 +1386,6 @@ qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, virDomainHostdevDefPtr hostdev = hostdevs[i]; virSCSIDevicePtr scsi; virSCSIDevicePtr tmp; -virDomainDeviceDef dev; - -dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; -dev.data.hostdev = hostdev; - -ignore_value(qemuRemoveSharedDevice(driver, dev, name)); if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 8486f25..afa92da 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1548,6 +1548,7 @@ qemuDomainAttachHostScsiDevice(virQEMUDriverPtr driver, char *drvstr = NULL; bool teardowncgroup = false; bool teardownlabel = false; +virDomainDeviceDef dev; if (!virQEMUCapsGet(priv-qemuCaps, QEMU_CAPS_DRIVE) || !virQEMUCapsGet(priv-qemuCaps, QEMU_CAPS_DEVICE) || @@ -1561,6 +1562,12 @@ qemuDomainAttachHostScsiDevice(virQEMUDriverPtr driver, if (!cont) return -1; +/* check sharable scsi device */ +dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; +dev.data.hostdev = hostdev; +if (qemuAddSharedDevice(driver, dev, vm-def-name) 0) + return -1; + if (qemuPrepareHostdevSCSIDevices(driver, vm-def-name, hostdev, 1)) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1619,6 +1626,7 @@ qemuDomainAttachHostScsiDevice(virQEMUDriverPtr driver, ret = 0; cleanup: if (ret 0) { +ignore_value(qemuRemoveSharedDevice(driver, dev, vm-def-name)); qemuDomainReAttachHostScsiDevices(driver, vm-def-name, hostdev, 1); if (teardowncgroup qemuTeardownHostdevCgroup(vm, hostdev) 0) VIR_WARN(Unable to remove host device cgroup ACL on hotplug fail); @@ -2587,6 +2595,12 @@ qemuDomainRemoveSCSIHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { +virDomainDeviceDef dev; + +dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; +dev.data.hostdev = hostdev; + +ignore_value(qemuRemoveSharedDevice(driver, dev, vm-def-name)); qemuDomainReAttachHostScsiDevices(driver, vm-def-name, hostdev, 1); } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index e938649..5ea42c7 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3158,6 +3158,16 @@ qemuProcessReconnect(void *opaque) priv-agentError = true; } +/* update hostdevs */ +for (i = 0; i obj-def-nhostdevs; i++) { +virDomainDeviceDef dev; +dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; +dev.data.hostdev = obj-def-hostdevs[i]; +/* handle sharable scsi hostdev */ +if (qemuAddSharedDevice(driver, dev, obj-def-name) 0) +goto error; +} + if (qemuUpdateActivePciHostdevs(driver, obj-def) 0) { goto error; } @@ -3686,6 +3696,15 @@ int qemuProcessStart(virConnectPtr conn, /* Must be run before security labelling */ VIR_DEBUG(Preparing host devices); +for (i = 0; i vm-def-nhostdevs; i++) { +virDomainDeviceDef dev; +dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; +dev.data.hostdev = vm-def-hostdevs[i]; +/* handle sharable scsi hostdev */ +if (qemuAddSharedDevice(driver, dev, vm-def-name) 0) +goto cleanup; +} + if (!cfg-relaxedACS) hostdev_flags |= VIR_STRICT_ACS_CHECK; if (!migrateFrom) @@ -4372,6 +4391,15 @@ void qemuProcessStop(virQEMUDriverPtr driver, priv-ccwaddrs = NULL; } +/* handle shared scsi hostdev */ +for (i = 0; i vm-def-nhostdevs; i++) { +virDomainDeviceDef dev; + +dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; +dev.data.hostdev = vm-def-hostdevs[i]; +ignore_value(qemuRemoveSharedDevice(driver, dev, vm-def-name)); +} + qemuDomainReAttachHostDevices(driver, vm-def); def = vm-def; -- 1.6.0.2
[libvirt] [PATCH v12 08/11] change qemu driver to use hostdev common library
Change qemu driver to use hostdev common library instead of APIs in qemu_hostdev.[ch] Improve some test files. Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in |1 - src/Makefile.am |1 - src/qemu/qemu_command.c |1 - src/qemu/qemu_conf.h|9 +--- src/qemu/qemu_domain.c |4 +- src/qemu/qemu_driver.c | 81 ++- src/qemu/qemu_hostdev.h |5 -- src/qemu/qemu_hotplug.c | 119 +++--- src/qemu/qemu_process.c | 31 9 files changed, 89 insertions(+), 163 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 60c226a..9e71db3 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -99,7 +99,6 @@ src/qemu/qemu_command.c src/qemu/qemu_conf.c src/qemu/qemu_domain.c src/qemu/qemu_driver.c -src/qemu/qemu_hostdev.c src/qemu/qemu_hotplug.c src/qemu/qemu_migration.c src/qemu/qemu_monitor.c diff --git a/src/Makefile.am b/src/Makefile.am index 04ea01b..5712055 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -673,7 +673,6 @@ QEMU_DRIVER_SOURCES = \ qemu/qemu_command.c qemu/qemu_command.h \ qemu/qemu_domain.c qemu/qemu_domain.h \ qemu/qemu_cgroup.c qemu/qemu_cgroup.h \ - qemu/qemu_hostdev.c qemu/qemu_hostdev.h \ qemu/qemu_hotplug.c qemu/qemu_hotplug.h \ qemu/qemu_hotplugpriv.h \ qemu/qemu_conf.c qemu/qemu_conf.h \ diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e499d54..ccdd50f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -24,7 +24,6 @@ #include config.h #include qemu_command.h -#include qemu_hostdev.h #include qemu_capabilities.h #include qemu_bridge_filter.h #include cpu/cpu.h diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 158cc1a..3512589 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -55,6 +55,7 @@ # define QEMU_DRIVER_NAME QEMU +# define QEMU_DRIVER_NAME QEMU typedef struct _virQEMUDriver virQEMUDriver; typedef virQEMUDriver *virQEMUDriverPtr; @@ -215,14 +216,6 @@ struct _virQEMUDriver { /* Immutable pointer. self-locking APIs */ virSecurityManagerPtr securityManager; -/* Immutable pointers. Requires locks to be held before - * calling APIs. activePciHostdevs must be locked before - * inactivePciHostdevs */ -virPCIDeviceListPtr activePciHostdevs; -virPCIDeviceListPtr inactivePciHostdevs; -virUSBDeviceListPtr activeUsbHostdevs; -virSCSIDeviceListPtr activeScsiHostdevs; - /* Immutable pointer. Unsafe APIs. XXX */ virHashTablePtr sharedDevices; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 55e707e..c9586e5 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -38,7 +38,7 @@ #include virtime.h #include virstoragefile.h #include virstring.h -#include qemu_hostdev.h +#include virhostdev.h #include sys/time.h #include fcntl.h @@ -909,7 +909,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, hostdev-source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM; if (driver driver-qemuCapsCache) { -bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO(); +bool supportsPassthroughVFIO = virHostdevHostSupportsPassthroughVFIO(); qemuCaps = virQEMUCapsCacheLookupCopy(driver-qemuCapsCache, def-emulator); if (supportsPassthroughVFIO qemuCaps diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1fe8992..a812e47 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -50,7 +50,6 @@ #include qemu_capabilities.h #include qemu_command.h #include qemu_cgroup.h -#include qemu_hostdev.h #include qemu_hotplug.h #include qemu_monitor.h #include qemu_bridge_filter.h @@ -94,6 +93,7 @@ #include virstring.h #include viraccessapicheck.h #include viraccessapicheckqemu.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_QEMU @@ -695,18 +695,6 @@ qemuStateInitialize(bool privileged, if (qemuSecurityInit(qemu_driver) 0) goto error; -if ((qemu_driver-activePciHostdevs = virPCIDeviceListNew()) == NULL) -goto error; - -if ((qemu_driver-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) -goto error; - -if ((qemu_driver-inactivePciHostdevs = virPCIDeviceListNew()) == NULL) -goto error; - -if ((qemu_driver-activeScsiHostdevs = virSCSIDeviceListNew()) == NULL) -goto error; - if (!(qemu_driver-sharedDevices = virHashCreate(30, qemuSharedDeviceEntryFree))) goto error; @@ -983,10 +971,6 @@ qemuStateCleanup(void
[libvirt] [PATCH v12 10/11] add hostdev pci backend type for xen
Add VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN. For legacy xen, it will use pciback as stub driver. Signed-off-by: Chunyan Liu cy...@suse.com --- docs/schemas/domaincommon.rng |1 + src/conf/domain_conf.c|3 ++- src/conf/domain_conf.h|1 + src/libxl/libxl_domain.c |9 + src/qemu/qemu_command.c |3 +-- src/qemu/qemu_hotplug.c |4 +--- src/util/virhostdev.c | 12 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index c1efcd2..ca92271 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3420,6 +3420,7 @@ choice valuekvm/value valuevfio/value + valuexen/value /choice /attribute empty/ diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f6065ed..411ae55 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -624,7 +624,8 @@ VIR_ENUM_IMPL(virDomainHostdevSubsysPciBackend, VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST, default, kvm, - vfio) + vfio, + xen) VIR_ENUM_IMPL(virDomainHostdevCaps, VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST, storage, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 4895e81..407e6e6 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -414,6 +414,7 @@ typedef enum { VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT, /* detect automaticaly, prefer VFIO */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM,/* force legacy kvm style */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO, /* force vfio */ +VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN,/* force legacy xen style, use pciback */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST } virDomainHostdevSubsysPciBackendType; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index eb2e50e..a88bb20 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -350,6 +350,15 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, STRNEQ(def-os.type, hvm)) dev-data.chr-targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN; +if (dev-type == VIR_DOMAIN_DEVICE_HOSTDEV) { +virDomainHostdevDefPtr hostdev = dev-data.hostdev; + +if (hostdev-mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS +hostdev-source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI +hostdev-source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) +hostdev-source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; +} + return 0; } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index ccdd50f..69c9cb1 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5537,8 +5537,7 @@ qemuBuildPCIHostdevDevStr(virDomainDefPtr def, virBufferAddLit(buf, vfio-pci); break; -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: +default: virReportError(VIR_ERR_INTERNAL_ERROR, _(invalid PCI passthrough type '%s'), virDomainHostdevSubsysPciBackendTypeToString(backend)); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index bb9b3ff..666e98e 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1196,9 +1196,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver, virProcessSetMaxMemLock(vm-pid, memKB * 1024); break; -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM: -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: +default: break; } diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index 8d75a77..6fa32d4 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -373,6 +373,13 @@ virHostdevGetPciHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs) } break; +case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN : +if (virPCIDeviceSetStubDriver(dev, pciback) 0) { +virObjectUnref(list); +return NULL; +} +break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM : case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) { @@ -1264,6 +1271,11 @@ virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, goto cleanup; break; +case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN : +if (virPCIDeviceSetStubDriver(dev, pciback) 0) +goto cleanup; +break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM : case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) -- 1.6.0.2 -- libvir-list mailing list
[libvirt] [PATCH v12 03/11] qemu_hostdev: move COLD_BOOT as a flag
For extracting hostdev codes from qemu_hostdev.c to common library, change qemu specific COLD_BOOT handling to be a flag, and pass it to hostdev functions. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |6 +++--- src/qemu/qemu_hostdev.h |2 +- src/qemu/qemu_process.c |4 +++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 0d313c0..ce5012d 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -992,7 +992,7 @@ out: static int qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, virDomainDefPtr def, - bool coldBoot) + unsigned int flags) { size_t i; int ret = -1; @@ -1000,6 +1000,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, virUSBDevicePtr tmp; virDomainHostdevDefPtr *hostdevs = def-hostdevs; int nhostdevs = def-nhostdevs; +bool coldBoot = !!(flags VIR_COLD_BOOT); /* To prevent situation where USB device is assigned to two domains * we need to keep a list of currently assigned USB devices. @@ -1189,7 +1190,6 @@ int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - bool coldBoot, unsigned int flags) { if (!def-nhostdevs) @@ -1200,7 +1200,7 @@ qemuPrepareHostDevices(virQEMUDriverPtr driver, qemuCaps, flags) 0) return -1; -if (qemuPrepareHostUSBDevices(driver, def, coldBoot) 0) +if (qemuPrepareHostUSBDevices(driver, def, flags) 0) return -1; if (qemuPrepareHostdevSCSIDevices(driver, def-name, diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h index ab7fb9f..710867d 100644 --- a/src/qemu/qemu_hostdev.h +++ b/src/qemu/qemu_hostdev.h @@ -29,6 +29,7 @@ typedef enum { VIR_STRICT_ACS_CHECK = (1 0), /* strict acs check */ + VIR_COLD_BOOT = (1 1), /* cold boot */ } qemuHostdevFlag; int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, @@ -59,7 +60,6 @@ int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - bool coldBoot, unsigned int flags); void qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, const char *name, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index c0f0719..f1fe35e 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3688,8 +3688,10 @@ int qemuProcessStart(virConnectPtr conn, VIR_DEBUG(Preparing host devices); if (!cfg-relaxedACS) hostdev_flags |= VIR_STRICT_ACS_CHECK; +if (!migrateFrom) +hostdev_flags |= VIR_COLD_BOOT; if (qemuPrepareHostDevices(driver, vm-def, priv-qemuCaps, - !migrateFrom, hostdev_flags) 0) +hostdev_flags) 0) goto cleanup; VIR_DEBUG(Preparing chr devices); -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v12 07/11] add unit test for hostdev common library
Add unit test for hostdev common library. Current tests are based on virpcimock. Signed-off-by: Chunyan Liu cy...@suse.com --- .gitignore |1 + tests/Makefile.am |5 + tests/virhostdevtest.c | 473 3 files changed, 479 insertions(+), 0 deletions(-) create mode 100644 tests/virhostdevtest.c diff --git a/.gitignore b/.gitignore index 5fe60c6..b52f7b4 100644 --- a/.gitignore +++ b/.gitignore @@ -200,6 +200,7 @@ /tests/virendiantest /tests/virfiletest /tests/virhashtest +/tests/virhostdevtest /tests/viridentitytest /tests/virkeycodetest /tests/virkeyfiletest diff --git a/tests/Makefile.am b/tests/Makefile.am index 1698455..86cdb85 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -145,6 +145,7 @@ test_programs = virshtest sockettest \ virnetdevbandwidthtest \ virkmodtest \ vircapstest \ + virhostdevtest \ $(NULL) if WITH_REMOTE @@ -781,6 +782,10 @@ vircgroupmock_la_CFLAGS = $(AM_CFLAGS) vircgroupmock_la_LDFLAGS = -module -avoid-version \ -rpath /evil/libtool/hack/to/force/shared/lib/creation +virhostdevtest_SOURCES = \ + virhostdevtest.c testutils.h testutils.c +virhostdevtest_LDADD = $(LDADDS) + virpcitest_SOURCES = \ virpcitest.c testutils.h testutils.c virpcitest_LDADD = $(LDADDS) diff --git a/tests/virhostdevtest.c b/tests/virhostdevtest.c new file mode 100644 index 000..2dd9370 --- /dev/null +++ b/tests/virhostdevtest.c @@ -0,0 +1,473 @@ +/* + * Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * http://www.gnu.org/licenses/. + * + * Author: Chunyan Liu cy...@suse.com + */ + +#include config.h + +#include testutils.h + +#ifdef __linux__ + +# include stdlib.h +# include stdio.h +# include sys/types.h +# include sys/stat.h +# include fcntl.h +# include virlog.h +# include virhostdev.h + +# define VIR_FROM_THIS VIR_FROM_NONE + +# define CHECK_LIST_COUNT(list, cnt)\ +if ((count = virPCIDeviceListCount(list)) != cnt) { \ +virReportError(VIR_ERR_INTERNAL_ERROR, \ + Unexpected count of items in #list : %d,\ + expecting %zu, count, (size_t) cnt); \ +goto cleanup; \ +} + +# define TEST_STATE_DIR abs_builddir /hostdevmgr +static const char *drv_name = test_driver; +static const char *dom_name = test_domain; +static const unsigned char *uuid = +(unsigned char *)(f92360b0-2541-8791-fb32-d1f838811541); +static int nhostdevs = 3; +static virDomainHostdevDefPtr hostdevs[] = {NULL, NULL, NULL}; +static virPCIDevicePtr dev[] = {NULL, NULL, NULL}; +static virHostdevManagerPtr mgr = NULL; + +static void +myCleanup(void) +{ +size_t i; +for (i = 0; i nhostdevs; i++) { + virPCIDeviceFree(dev[i]); + virDomainHostdevDefFree(hostdevs[i]); +} + +if (mgr) { +virObjectUnref(mgr-activePciHostdevs); +virObjectUnref(mgr-inactivePciHostdevs); +virObjectUnref(mgr-activeUsbHostdevs); +VIR_FREE(mgr-stateDir); +VIR_FREE(mgr); +} +} + +static int +myInit(void) +{ +size_t i; + +for (i = 0; i nhostdevs; i++) { +virDomainHostdevSubsys subsys; +hostdevs[i] = virDomainHostdevDefAlloc(); +if (!hostdevs[i]) +goto cleanup; +hostdevs[i]-mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS; +subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI; +subsys.u.pci.addr.domain = 0; +subsys.u.pci.addr.bus = 0; +subsys.u.pci.addr.slot = i + 1; +subsys.u.pci.addr.function = 0; +subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM; +hostdevs[i]-source.subsys = subsys; +} + +for (i = 0; i nhostdevs; i++) { +if (!(dev[i] = virPCIDeviceNew(0, 0, i + 1, 0)) || +virPCIDeviceSetStubDriver(dev[i], pci-stub) 0) +goto cleanup; +} + +if (VIR_ALLOC(mgr) 0) +goto cleanup; +if ((mgr-activePciHostdevs = virPCIDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) +goto cleanup; +if ((mgr-inactivePciHostdevs = virPCIDeviceListNew
[libvirt] [PATCH v12 04/11] qemu_hostdev: parse BACKEND_DEFAULT outside
For extracting hostdev codes from qemu_hostdev.c to common library, change original paring VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT in hostdev function to qemuDomainDeviceDefPostParse. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_domain.c | 22 +++ src/qemu/qemu_hostdev.c| 28 +++- src/qemu/qemu_hostdev.h|2 - src/qemu/qemu_hotplug.c|2 +- src/qemu/qemu_process.c|3 +- .../qemuxml2argv-hostdev-pci-address.xml |1 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml |1 + tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml|2 + 8 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a665061..55e707e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -38,6 +38,7 @@ #include virtime.h #include virstoragefile.h #include virstring.h +#include qemu_hostdev.h #include sys/time.h #include fcntl.h @@ -821,6 +822,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, int ret = -1; virQEMUDriverPtr driver = opaque; virQEMUDriverConfigPtr cfg = NULL; +virQEMUCapsPtr qemuCaps = NULL; if (dev-type == VIR_DOMAIN_DEVICE_NET dev-data.net-type != VIR_DOMAIN_NET_TYPE_HOSTDEV @@ -899,6 +901,26 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, dev-data.chr-source.data.nix.listen = true; } +if (dev-type == VIR_DOMAIN_DEVICE_HOSTDEV) { +virDomainHostdevDefPtr hostdev = dev-data.hostdev; +if (hostdev-mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS +hostdev-source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI +hostdev-source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) { + +hostdev-source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM; +if (driver driver-qemuCapsCache) { +bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO(); +qemuCaps = virQEMUCapsCacheLookupCopy(driver-qemuCapsCache, + def-emulator); +if (supportsPassthroughVFIO qemuCaps +virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) +hostdev-source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO; + +virObjectUnref(qemuCaps); +} +} +} + ret = 0; cleanup: diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index ce5012d..80552cd 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -583,8 +583,7 @@ qemuHostdevHostSupportsPassthroughLegacy(void) static bool qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs, - size_t nhostdevs, - virQEMUCapsPtr qemuCaps) + size_t nhostdevs) { bool supportsPassthroughKVM = qemuHostdevHostSupportsPassthroughLegacy(); bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO(); @@ -601,23 +600,6 @@ qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs, continue; switch ((virDomainHostdevSubsysPciBackendType) *backend) { -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: -if (supportsPassthroughVFIO -virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) { -*backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO; -} else if (supportsPassthroughKVM - (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCIDEVICE) || -virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) { -*backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM; -} else { -virReportError(VIR_ERR_CONFIG_UNSUPPORTED, %s, - _(host doesn't support passthrough of - host PCI devices)); -return false; -} - -break; - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO: if (!supportsPassthroughVFIO) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, %s, @@ -635,7 +617,7 @@ qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs, break; -case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: +default: break; } } @@ -650,7 +632,6 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, const unsigned char *uuid, virDomainHostdevDefPtr *hostdevs, int nhostdevs, - virQEMUCapsPtr qemuCaps, unsigned int flags) { virPCIDeviceListPtr pcidevs = NULL; @@ -659,7 +640,7
[libvirt] [PATCH v12 11/11] add pci passthrough for libxl driver
Add pci passthrough to libxl driver, support attach-device, detach-device and start a vm with pci hostdev specified. Signed-off-by: Chunyan Liu cy...@suse.com --- src/libxl/libxl_conf.c | 63 +++ src/libxl/libxl_conf.h |4 + src/libxl/libxl_driver.c | 448 +- 3 files changed, 514 insertions(+), 1 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 4cefadf..54f9f9c 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1141,6 +1141,66 @@ libxlDriverConfigGet(libxlDriverPrivatePtr driver) return cfg; } +int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev) +{ +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +return -1; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +return -1; + +pcidev-domain = hostdev-source.subsys.u.pci.addr.domain; +pcidev-bus = hostdev-source.subsys.u.pci.addr.bus; +pcidev-dev = hostdev-source.subsys.u.pci.addr.slot; +pcidev-func = hostdev-source.subsys.u.pci.addr.function; + +return 0; +} + +static int +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config) +{ +virDomainHostdevDefPtr *l_hostdevs = def-hostdevs; +size_t nhostdevs = def-nhostdevs; +size_t npcidevs = 0; +libxl_device_pci *x_pcidevs; +size_t i, j; + +if (nhostdevs == 0) +return 0; + +if (VIR_ALLOC_N(x_pcidevs, nhostdevs) 0) +return -1; + +for (i = 0, j = 0; i nhostdevs; i++) { +if (l_hostdevs[i]-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (l_hostdevs[i]-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) +continue; + +libxl_device_pci_init(x_pcidevs[j]); + +if (libxlMakePci(l_hostdevs[i], x_pcidevs[j]) 0) +goto error; + +npcidevs++; +j++; +} + +VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs); +d_config-pcidevs = x_pcidevs; +d_config-num_pcidevs = npcidevs; + +return 0; + +error: +for (i = 0; i npcidevs; i++) +libxl_device_pci_dispose(x_pcidevs[i]); + +VIR_FREE(x_pcidevs); +return -1; +} + virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { @@ -1189,6 +1249,9 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver, if (libxlMakeVfbList(driver, def, d_config) 0) return -1; +if (libxlMakePciList(def, d_config) 0) +return -1; + d_config-on_reboot = def-onReboot; d_config-on_poweroff = def-onPoweroff; d_config-on_crash = def-onCrash; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index ca7bc7d..4491859 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -39,6 +39,7 @@ # include virchrdev.h +# define LIBXL_DRIVER_NAME xenlight # define LIBXL_VNC_PORT_MIN 5900 # define LIBXL_VNC_PORT_MAX 65535 @@ -148,6 +149,9 @@ libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb); int +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev); + +int libxlBuildDomainConfig(libxlDriverPrivatePtr driver, virDomainObjPtr vm, libxl_domain_config *d_config); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 8e4242a..999dee2 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -52,6 +52,7 @@ #include virsysinfo.h #include viraccessapicheck.h #include viratomic.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -327,6 +328,7 @@ libxlVmReap(libxlDriverPrivatePtr driver, virDomainShutoffReason reason) { libxlDomainObjPrivatePtr priv = vm-privateData; +virHostdevManagerPtr hostdev_mgr; if (libxl_domain_destroy(priv-ctx, vm-def-id, NULL) 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -334,6 +336,11 @@ libxlVmReap(libxlDriverPrivatePtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr != NULL) +virHostdevReAttachDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, + vm-def, VIR_SP_PCI_HOSTDEV); + libxlVmCleanup(driver, vm, reason); return 0; } @@ -603,6 +610,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, #ifdef LIBXL_HAVE_DOMAIN_CREATE_RESTORE_PARAMS libxl_domain_restore_params params; #endif +virHostdevManagerPtr hostdev_mgr; if (libxlDomainObjPrivateInitCtx(vm) 0) goto error; @@ -661,6 +669,13 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, goto error; } +VIR_DEBUG(Preparing host PCI devices); +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL || +virHostdevPrepareDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME, +vm-def, VIR_SP_PCI_HOSTDEV) 0) +goto error; + /* use
[libvirt] [PATCH v12 09/11] change lxc driver to use hostdev common library
Change lxc driver to use hostdev common library instead of APIs in lxc_hostdev.[ch] Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in|1 - src/Makefile.am |1 - src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 47 --- src/lxc/lxc_hostdev.c | 416 - src/lxc/lxc_hostdev.h | 43 - src/lxc/lxc_process.c | 24 +++- 7 files changed, 48 insertions(+), 488 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 9e71db3..94017c6 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -61,7 +61,6 @@ src/locking/lock_manager.c src/locking/sanlock_helper.c src/lxc/lxc_cgroup.c src/lxc/lxc_fuse.c -src/lxc/lxc_hostdev.c src/lxc/lxc_container.c src/lxc/lxc_conf.c src/lxc/lxc_controller.c diff --git a/src/Makefile.am b/src/Makefile.am index 5712055..b5839f3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -616,7 +616,6 @@ LXC_DRIVER_SOURCES = \ lxc/lxc_container.c lxc/lxc_container.h \ lxc/lxc_cgroup.c lxc/lxc_cgroup.h \ lxc/lxc_domain.c lxc/lxc_domain.h \ - lxc/lxc_hostdev.c lxc/lxc_hostdev.h \ lxc/lxc_monitor.c lxc/lxc_monitor.h \ lxc/lxc_process.c lxc/lxc_process.h \ lxc/lxc_fuse.c lxc/lxc_fuse.h \ diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index e04dcdd..5be159b 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -93,10 +93,6 @@ struct _virLXCDriver { /* Immutable pointer, self-locking APIs */ virDomainObjListPtr domains; -/* Immutable pointer. Requires lock to be held before - * calling APIs. */ -virUSBDeviceListPtr activeUsbHostdevs; - /* Immutable pointer, self-locking APIs */ virObjectEventStatePtr domainEventState; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 687046e..6f3a30f 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -70,6 +70,7 @@ #include virstring.h #include viraccessapicheck.h #include viraccessapichecklxc.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LXC @@ -1525,9 +1526,6 @@ static int lxcStateInitialize(bool privileged, if (!(lxc_driver-securityManager = lxcSecurityInit(cfg))) goto cleanup; -if ((lxc_driver-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) -goto cleanup; - if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL) goto cleanup; @@ -1642,7 +1640,6 @@ static int lxcStateCleanup(void) virSysinfoDefFree(lxc_driver-hostsysinfo); -virObjectUnref(lxc_driver-activeUsbHostdevs); virObjectUnref(lxc_driver-caps); virObjectUnref(lxc_driver-securityManager); virObjectUnref(lxc_driver-xmlopt); @@ -3892,6 +3889,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, mode_t mode; bool created = false; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if (virDomainHostdevFind(vm-def, def, NULL) = 0) { virReportError(VIR_ERR_OPERATION_FAILED, %s, @@ -3899,6 +3897,14 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, return -1; } +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL || +virHostdevPrepareUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, 1, 0) 0) +return -1; + if (virAsprintf(vroot, /proc/%llu/root, (unsigned long long)priv-initpid) 0) goto cleanup; @@ -3974,6 +3980,11 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, ret = 0; cleanup: +virHostdevReAttachUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm-def-name, + def, + 1); virDomainAuditHostdev(vm, def, attach, ret == 0); if (ret 0 created) unlink(dstfile); @@ -4436,8 +4447,7 @@ cleanup: static int -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, -virDomainObjPtr vm, +lxcDomainDetachDeviceHostdevUSBLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { virLXCDomainObjPrivatePtr priv = vm-privateData; @@ -4446,6 +4456,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, char *dst = NULL; char *vroot = NULL; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if ((idx = virDomainHostdevFind(vm-def, dev-data.hostdev, @@ -4490,9 +4501,10
Re: [libvirt] [PATCH v12 04/11] qemu_hostdev: parse BACKEND_DEFAULT outside
2014-02-17 23:26 GMT+08:00 Laine Stump la...@laine.org: On 02/17/2014 11:38 AM, Cedric Bosdonnat wrote: On Mon, 2014-02-17 at 14:32 +0800, Chunyan Liu wrote: For extracting hostdev codes from qemu_hostdev.c to common library, change original paring VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT in hostdev function to qemuDomainDeviceDefPostParse. typo: paring - parsing. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_domain.c | 22 +++ src/qemu/qemu_hostdev.c| 28 +++- src/qemu/qemu_hostdev.h|2 - src/qemu/qemu_hotplug.c|2 +- src/qemu/qemu_process.c|3 +- .../qemuxml2argv-hostdev-pci-address.xml |1 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml |1 + tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml|2 + 8 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a665061..55e707e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -38,6 +38,7 @@ #include virtime.h #include virstoragefile.h #include virstring.h +#include qemu_hostdev.h #include sys/time.h #include fcntl.h @@ -821,6 +822,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, int ret = -1; virQEMUDriverPtr driver = opaque; virQEMUDriverConfigPtr cfg = NULL; +virQEMUCapsPtr qemuCaps = NULL; if (dev-type == VIR_DOMAIN_DEVICE_NET dev-data.net-type != VIR_DOMAIN_NET_TYPE_HOSTDEV @@ -899,6 +901,26 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, dev-data.chr-source.data.nix.listen = true; } +if (dev-type == VIR_DOMAIN_DEVICE_HOSTDEV) { +virDomainHostdevDefPtr hostdev = dev-data.hostdev; +if (hostdev-mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS +hostdev-source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI +hostdev-source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) { + +hostdev-source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM; +if (driver driver-qemuCapsCache) { +bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO(); +qemuCaps = virQEMUCapsCacheLookupCopy(driver-qemuCapsCache, + def-emulator); +if (supportsPassthroughVFIO qemuCaps +virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) +hostdev-source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO; + +virObjectUnref(qemuCaps); +} +} +} + ret = 0; KVM passthrough support isn't checked here but was checked in the removed code, is that intended? The fact that the code doing the KVM check is fairly new, suggests to me that this omission *wasn't* intentional. I'm really glad that you're looking at that in detail, because it's the potential omission of recent bugfixes that has me nervous. Beyond that, this isn't the proper place to be moving this to - anything that is done by the PostParse callback function ends up being written to persistent config and is there effectively forever, but the interpretation of the hostdev driver default backend is something that must be re-done exactly at the moment the device it going to be attached. This patch instead causes that decision to be made when the domain is defined, and forever encoded in the config. I think that instead you need to either call it from qemuPrepareHostDevices() and qemuDomainAttachHostPciDevice(), OR send a callback function pointer into your new virHostdevPreparePciHostdevs(), with that function returning the backend to use this time based on the config setting and current system state. Thanks for explanation. Will correct that. cleanup: diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index ce5012d..80552cd 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -583,8 +583,7 @@ qemuHostdevHostSupportsPassthroughLegacy(void) static bool qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs, - size_t nhostdevs, - virQEMUCapsPtr qemuCaps) + size_t nhostdevs) { bool supportsPassthroughKVM = qemuHostdevHostSupportsPassthroughLegacy(); bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO(); @@ -601,23 +600,6 @@ qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs, continue; switch ((virDomainHostdevSubsysPciBackendType) *backend) { -case
[libvirt] [PATCH v13 13/49] pass driver name as a parameter to virHostdevPrepareHostdevPCIDevices
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |6 -- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 0b1be8f..bbc85bc 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -664,6 +664,7 @@ qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs, static int virHostdevPreparePCIDevices(virHostdevManagerPtr hostdev_mgr, +const char *drv_name, const char *name, const unsigned char *uuid, virDomainHostdevDefPtr *hostdevs, @@ -785,7 +786,7 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr hostdev_mgr, activeDev = virPCIDeviceListFind(hostdev_mgr-activePciHostdevs, dev); if (activeDev) -virPCIDeviceSetUsedBy(activeDev, QEMU_DRIVER_NAME, name); +virPCIDeviceSetUsedBy(activeDev, drv_name, name); } /* Loop 8: Now set the original states for hostdev def */ @@ -879,7 +880,8 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, if (hostdev_mgr == NULL) goto out; -ret = virHostdevPreparePCIDevices(hostdev_mgr, name, uuid, hostdevs, +ret = virHostdevPreparePCIDevices(hostdev_mgr, QEMU_DRIVER_NAME, + name, uuid, hostdevs, nhostdevs, flags); out: -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 04/49] add virhostdev files to maintain global state of host devices
Signed-off-by: Chunyan Liu cy...@suse.com --- po/POTFILES.in |1 + src/Makefile.am |1 + src/libvirt_private.syms |4 ++ src/util/virhostdev.c| 103 ++ src/util/virhostdev.h| 44 +++ 5 files changed, 153 insertions(+), 0 deletions(-) create mode 100644 src/util/virhostdev.c create mode 100644 src/util/virhostdev.h diff --git a/po/POTFILES.in b/po/POTFILES.in index c565771..bcc0ee0 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -164,6 +164,7 @@ src/util/vireventpoll.c src/util/virfile.c src/util/virhash.c src/util/virhook.c +src/util/virhostdev.c src/util/viridentity.c src/util/virinitctl.c src/util/viriptables.c diff --git a/src/Makefile.am b/src/Makefile.am index 6ef32ee..25d0370 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -104,6 +104,7 @@ UTIL_SOURCES = \ util/virhash.c util/virhash.h \ util/virhashcode.c util/virhashcode.h \ util/virhook.c util/virhook.h \ + util/virhostdev.c util/virhostdev.h \ util/viridentity.c util/viridentity.h \ util/virinitctl.c util/virinitctl.h \ util/viriptables.c util/viriptables.h \ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 3d8f2e3..bc048a1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1291,6 +1291,10 @@ virHookInitialize; virHookPresent; +#util/virhostdev.h +virHostdevManagerGetDefault; + + # util/viridentity.h virIdentityGetAttr; virIdentityGetCurrent; diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c new file mode 100644 index 000..83124e9 --- /dev/null +++ b/src/util/virhostdev.c @@ -0,0 +1,103 @@ +/* virhostdev.c: hostdev management + * + * Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * http://www.gnu.org/licenses/. + * + * Author: Chunyan Liu cy...@suse.com + */ + +#include config.h + +#include fcntl.h +#include sys/ioctl.h +#include sys/types.h +#include sys/stat.h +#include unistd.h +#include stdlib.h +#include stdio.h + +#include virhostdev.h +#include viralloc.h +#include virstring.h +#include virfile.h +#include virerror.h +#include virlog.h +#include virutil.h +#include configmake.h + +#define VIR_FROM_THIS VIR_FROM_NONE +#define HOSTDEV_STATE_DIR LOCALSTATEDIR /run/libvirt/hostdevmgr + +static virHostdevManagerPtr hostdevMgr; + +static void +virHostdevManagerCleanup(void) +{ +if (!hostdevMgr) +return; + +virObjectUnref(hostdevMgr-activePciHostdevs); +virObjectUnref(hostdevMgr-inactivePciHostdevs); +virObjectUnref(hostdevMgr-activeUsbHostdevs); +VIR_FREE(hostdevMgr-stateDir); + +VIR_FREE(hostdevMgr); +} + +static int +virHostdevOnceInit(void) +{ +if (VIR_ALLOC(hostdevMgr) 0) +goto error; + +if ((hostdevMgr-activePciHostdevs = virPCIDeviceListNew()) == NULL) +goto error; + +if ((hostdevMgr-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) +goto error; + +if ((hostdevMgr-inactivePciHostdevs = virPCIDeviceListNew()) == NULL) +goto error; + +if ((hostdevMgr-activeScsiHostdevs = virSCSIDeviceListNew()) == NULL) +goto error; + +if (VIR_STRDUP(hostdevMgr-stateDir, HOSTDEV_STATE_DIR) 0) +goto error; + +if (virFileMakePath(hostdevMgr-stateDir) 0) { +virReportError(VIR_ERR_OPERATION_FAILED, + _(Failed to create state dir '%s'), + hostdevMgr-stateDir); +goto error; +} + +return 0; + +error: +virHostdevManagerCleanup(); +return -1; +} + +VIR_ONCE_GLOBAL_INIT(virHostdev) + +virHostdevManagerPtr +virHostdevManagerGetDefault(void) +{ +if (virHostdevInitialize() 0) +return NULL; +return hostdevMgr; +} diff --git a/src/util/virhostdev.h b/src/util/virhostdev.h new file mode 100644 index 000..dba5e3e --- /dev/null +++ b/src/util/virhostdev.h @@ -0,0 +1,44 @@ +/* virhostdev.h: hostdev management + * + * Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. + * + * This library is free software; you can redistribute it and/or + * modify it under
[libvirt] [PATCH v13 00/49] write separate module for hostdev passthrough
These patches implements a separate module for hostdev passthrough so that it could be shared by different drivers and can maintain a global state of a host device. Patches 1~6 are to switch existing qemu and lxc driver to use common library lists, so that to maintain a global state of every host device. Patches 7~45 are to extract general code from qemu_hostdev.c piece by piece, make them reusable common APIs. Patches 46: unit test for the virhostdev common library Patches 47: add a hostdev backend type for xen Patches 48: add pci passthrough to libxl driver based on the common library Patches 49: change lxc to use common library APIs --- changes to v12: * split add hostdev passthrough common library patch into small patches for easier review. * fix v12 comments * rebase to libxl changes Chunyan Liu (49): add 'driver' info to used_by qemu: reuse hostdev interfaces to avoid duplicate qemu: remove functions now used internally only from qemu_hostdev.h add virhostdev files to maintain global state of host devices qemu: use general virhostdev lists instead of its own lxc: use general virhostdev lists instead of its own qemu_hostdev: move cfg-relaxedACS as a flag qemu_hostdev: move ColdBoot as a flag qemu_hostdev: move netconfig file location to virhostdev stateDir extract general code from qemuPrepareHostdevPCIDevices rename qemu*NetConfigRestore/Replace to virHostdevNetConfigRestore/Replace rename qemuGet*PciHostDeviceList to virHostdevGet*PciHostDeviceList pass driver name as a parameter to virHostdevPrepareHostdevPCIDevices extract general code from qemuDomainReAttachHostdevDevices pass driver name as a parameter to virHostdevReAttachPCIDevices rename qemuReAttachPciDevice to virHostdevReAttachPciDevice move virHostdevPrepare(ReAttach)PCIDevices to virhostdev.c extract general code from qemuUpdateActivePciHostdevs extract general code from qemuUpdateActiveUsbHostdevs extract general code from qemuUpdateActiveScsiHostdevs pass driver_name as parameter of virHostdevUpdate*Hostdevs functions move virHostdevUpdate* functions to virhostdev.c qemuPrepareUSBDevices: code adjustment for extracting general code extract general code from qemuPrepareHostUSBDevices rename qemu*USBDevices to virHostdev*USBDevices pass driver name to virHostdevPrepareUSBDevices move virHostdevPrepareHostUSBDevices to virhostdev.c extract general code from qemuPrepareHostSCSIDevices pass driver name as parameter to virHostdevPrepareSCSIDevices move virHostdevPrepareHostSCSIDevices to virhostdev.c extract general code from qemuDomainReAttachHostUsbDevices pass driver name as paramter to virHostdevReAttachUsbHostdevs move virHostdevDomainReAttachHostUsbDevices to virhostdev.c extract general code from qemuDomainReAttachHostScsiDevices pass driver name as parameter to virHostdevReAttachScciHostdevs move virHostdevReAttachHostScsiDevices to virhostdev.c extract general code of NodeDeviceDetach extract general code of NodeDeviceReAttach extract general code of NodeDeviceReset move virHostdevNodeDevice* to virhostdev.c improve parameter name to let it more meaningful rename some function names to keep consistency improve virHostdevUpdate* parameters to make it more widely used add 3 wrapper functions for prepare/reattach/update domain hostdevs add parameter checks to common interfaces add unit test for new virhostdev common library change lxc_hostdev.c to use virhostdev common library APIs add hostdev pci backend type for xen add pci passthrough to libxl driver .gitignore|1 + docs/schemas/domaincommon.rng |1 + po/POTFILES.in|1 + src/Makefile.am |1 + src/conf/domain_conf.c|3 +- src/conf/domain_conf.h|1 + src/libvirt_private.syms | 19 + src/libxl/libxl_conf.c| 63 ++ src/libxl/libxl_conf.h|4 + src/libxl/libxl_domain.c |9 + src/libxl/libxl_driver.c | 447 +++- src/lxc/lxc_conf.h|4 - src/lxc/lxc_driver.c | 17 +- src/lxc/lxc_hostdev.c | 315 + src/qemu/qemu_command.c |3 +- src/qemu/qemu_conf.h | 10 +- src/qemu/qemu_driver.c| 88 +-- src/qemu/qemu_hostdev.c | 1220 ++- src/qemu/qemu_hostdev.h | 27 +- src/qemu/qemu_hotplug.c | 77 +-- src/qemu/qemu_process.c |8 +- src/util/virhostdev.c | 1621 + src/util/virhostdev.h | 140 src/util/virpci.c | 31 +- src/util/virpci.h |9 +- src/util/virscsi.c| 32 +- src/util/virscsi.h|7 +- src/util/virusb.c | 31 +- src/util/virusb.h |8 +- tests/Makefile.am |5 + tests/virhostdevtest.c| 507 + tests/virscsitest.c
[libvirt] [PATCH v13 01/49] add 'driver' info to used_by
Specify which driver and which domain in used_by area to avoid conflict among different drivers. Signed-off-by: Chunyan Liu cy...@suse.com --- src/lxc/lxc_hostdev.c | 24 +++-- src/qemu/qemu_conf.h|2 + src/qemu/qemu_driver.c | 16 ++- src/qemu/qemu_hostdev.c | 63 +-- src/util/virpci.c | 36 +-- src/util/virpci.h |9 -- src/util/virscsi.c | 32 ++-- src/util/virscsi.h |7 +++- src/util/virusb.c | 31 ++- src/util/virusb.h |8 - tests/virscsitest.c |6 ++-- 11 files changed, 161 insertions(+), 73 deletions(-) diff --git a/src/lxc/lxc_hostdev.c b/src/lxc/lxc_hostdev.c index 3b371fc..b7248df 100644 --- a/src/lxc/lxc_hostdev.c +++ b/src/lxc/lxc_hostdev.c @@ -60,7 +60,7 @@ virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, continue; } -virUSBDeviceSetUsedBy(usb, def-name); +virUSBDeviceSetUsedBy(usb, LXC_DRIVER_NAME, def-name); virObjectLock(driver-activeUsbHostdevs); if (virUSBDeviceListAdd(driver-activeUsbHostdevs, usb) 0) { @@ -90,12 +90,16 @@ virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver, for (i = 0; i count; i++) { virUSBDevicePtr usb = virUSBDeviceListGet(list, i); if ((tmp = virUSBDeviceListFind(driver-activeUsbHostdevs, usb))) { -const char *other_name = virUSBDeviceGetUsedBy(tmp); +const char *other_drvname; +const char *other_domname; -if (other_name) +virUSBDeviceGetUsedBy(tmp, other_drvname, other_domname); +if (other_drvname other_domname) virReportError(VIR_ERR_OPERATION_INVALID, - _(USB device %s is in use by domain %s), - virUSBDeviceGetName(tmp), other_name); + _(USB device %s is in use by + driver %s, domain %s), + virUSBDeviceGetName(tmp), + other_drvname, other_domname); else virReportError(VIR_ERR_OPERATION_INVALID, _(USB device %s is already in use), @@ -103,7 +107,7 @@ virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver, goto error; } -virUSBDeviceSetUsedBy(usb, name); +virUSBDeviceSetUsedBy(usb, LXC_DRIVER_NAME, name); VIR_DEBUG(Adding %03d.%03d dom=%s to activeUsbHostdevs, virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name); /* @@ -351,7 +355,8 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver, for (i = 0; i nhostdevs; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; virUSBDevicePtr usb, tmp; -const char *used_by = NULL; +const char *usedby_domname = NULL; +const char *usedby_drvname = NULL; if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; @@ -389,8 +394,9 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver, continue; } -used_by = virUSBDeviceGetUsedBy(tmp); -if (STREQ_NULLABLE(used_by, name)) { +virUSBDeviceGetUsedBy(tmp, usedby_drvname, usedby_domname); +if (STREQ_NULLABLE(LXC_DRIVER_NAME, usedby_drvname) +STREQ_NULLABLE(name, usedby_domname)) { VIR_DEBUG(Removing %03d.%03d dom=%s from activeUsbHostdevs, hostdev-source.subsys.u.usb.bus, hostdev-source.subsys.u.usb.device, diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index c181dc2..ece185b 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -53,6 +53,8 @@ # error Port me # endif +# define QEMU_DRIVER_NAME QEMU + typedef struct _virQEMUDriver virQEMUDriver; typedef virQEMUDriver *virQEMUDriverPtr; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e04a328..f36a8b4 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -98,8 +98,6 @@ #define VIR_FROM_THIS VIR_FROM_QEMU -#define QEMU_DRIVER_NAME QEMU - #define QEMU_NB_MEM_PARAM 3 #define QEMU_NB_BLOCK_IO_TUNE_PARAM 6 @@ -11352,12 +11350,16 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) virObjectLock(driver-inactivePciHostdevs); other = virPCIDeviceListFind(driver-activePciHostdevs, pci); if (other) { -const char *other_name = virPCIDeviceGetUsedBy(other); +const char *other_drvname = NULL; +const char *other_domname = NULL; +virPCIDeviceGetUsedBy(other, other_drvname, other_domname); -if (other_name) +if (other_drvname other_domname) virReportError(VIR_ERR_OPERATION_INVALID, - _(PCI device %s is still in use by domain %s
[libvirt] [PATCH v13 15/49] pass driver name as a parameter to virHostdevReAttachPCIDevices
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 74923a1..ea776ce 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -1304,6 +1304,7 @@ qemuReattachPciDevice(virPCIDevicePtr dev, virHostdevManagerPtr mgr) */ static void virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, + const char *drv_name, const char *name, virDomainHostdevDefPtr *hostdevs, int nhostdevs, @@ -1342,7 +1343,7 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, const char *usedby_drvname; const char *usedby_domname; virPCIDeviceGetUsedBy(activeDev, usedby_drvname, usedby_domname); -if (STRNEQ_NULLABLE(QEMU_DRIVER_NAME, usedby_drvname) || +if (STRNEQ_NULLABLE(drv_name, usedby_drvname) || STRNEQ_NULLABLE(name, usedby_domname)) { virPCIDeviceListDel(pcidevs, dev); continue; @@ -1402,7 +1403,7 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, if (hostdev_mgr == NULL) goto out; -virHostdevReAttachPCIDevices(hostdev_mgr, name, +virHostdevReAttachPCIDevices(hostdev_mgr, QEMU_DRIVER_NAME, name, hostdevs, nhostdevs, oldStateDir); out: -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 25/49] rename qemu*USBDevices to virHostdev*USBDevices
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 16 1 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 1a589f4..15ed47c 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -247,9 +247,9 @@ out: static int -qemuPrepareHostdevUSBDevices(virHostdevManagerPtr mgr, - const char *name, - virUSBDeviceListPtr list) +virHostdevMarkUsbHostdevs(virHostdevManagerPtr mgr, + const char *name, + virUSBDeviceListPtr list) { size_t i, j; unsigned int count; @@ -304,9 +304,9 @@ error: static int -qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, - bool mandatory, - virUSBDevicePtr *usb) +virHostdevFindUSBDevice(virDomainHostdevDefPtr hostdev, +bool mandatory, +virUSBDevicePtr *usb) { unsigned vendor = hostdev-source.subsys.u.usb.vendor; unsigned product = hostdev-source.subsys.u.usb.product; @@ -428,7 +428,7 @@ virHostdevPrepareUSBDevices(virHostdevManagerPtr hostdev_mgr, !coldBoot)) required = false; -if (qemuFindHostdevUSBDevice(hostdev, required, usb) 0) +if (virHostdevFindUSBDevice(hostdev, required, usb) 0) goto cleanup; if (usb virUSBDeviceListAdd(list, usb) 0) { @@ -441,7 +441,7 @@ virHostdevPrepareUSBDevices(virHostdevManagerPtr hostdev_mgr, * and add them do driver list. However, if something goes * wrong, perform rollback. */ -if (qemuPrepareHostdevUSBDevices(hostdev_mgr, dom_name, list) 0) +if (virHostdevMarkUsbHostdevs(hostdev_mgr, dom_name, list) 0) goto cleanup; /* Loop 2: Temporary list was successfully merged with -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 11/49] rename qemu*NetConfigRestore/Replace to virHostdevNetConfigRestore/Replace
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 59 +++ 1 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 76e3978..cdad2db 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -305,8 +305,8 @@ cleanup: static int -qemuDomainHostdevPciSysfsPath(virDomainHostdevDefPtr hostdev, - char **sysfs_path) +virHostdevPciSysfsPath(virDomainHostdevDefPtr hostdev, + char **sysfs_path) { virPCIDeviceAddress config_address; @@ -320,12 +320,12 @@ qemuDomainHostdevPciSysfsPath(virDomainHostdevDefPtr hostdev, static int -qemuDomainHostdevIsVirtualFunction(virDomainHostdevDefPtr hostdev) +virHostdevIsVirtualFunction(virDomainHostdevDefPtr hostdev) { char *sysfs_path = NULL; int ret = -1; -if (qemuDomainHostdevPciSysfsPath(hostdev, sysfs_path) 0) +if (virHostdevPciSysfsPath(hostdev, sysfs_path) 0) return ret; ret = virPCIIsVirtualFunction(sysfs_path); @@ -337,13 +337,13 @@ qemuDomainHostdevIsVirtualFunction(virDomainHostdevDefPtr hostdev) static int -qemuDomainHostdevNetDevice(virDomainHostdevDefPtr hostdev, char **linkdev, - int *vf) +virHostdevNetDevice(virDomainHostdevDefPtr hostdev, char **linkdev, +int *vf) { int ret = -1; char *sysfs_path = NULL; -if (qemuDomainHostdevPciSysfsPath(hostdev, sysfs_path) 0) +if (virHostdevPciSysfsPath(hostdev, sysfs_path) 0) return ret; if (virPCIIsVirtualFunction(sysfs_path) == 1) { @@ -366,11 +366,11 @@ cleanup: static int -qemuDomainHostdevNetConfigVirtPortProfile(const char *linkdev, int vf, - virNetDevVPortProfilePtr virtPort, - const virMacAddr *macaddr, - const unsigned char *uuid, - bool associate) +virHostdevNetConfigVirtPortProfile(const char *linkdev, int vf, + virNetDevVPortProfilePtr virtPort, + const virMacAddr *macaddr, + const unsigned char *uuid, + bool associate) { int ret = -1; @@ -406,9 +406,9 @@ qemuDomainHostdevNetConfigVirtPortProfile(const char *linkdev, int vf, static int -qemuDomainHostdevNetConfigReplace(virDomainHostdevDefPtr hostdev, - const unsigned char *uuid, - char *stateDir) +virHostdevNetConfigReplace(virDomainHostdevDefPtr hostdev, + const unsigned char *uuid, + char *stateDir) { char *linkdev = NULL; virNetDevVlanPtr vlan; @@ -419,7 +419,7 @@ qemuDomainHostdevNetConfigReplace(virDomainHostdevDefPtr hostdev, bool port_profile_associate = true; int isvf; -isvf = qemuDomainHostdevIsVirtualFunction(hostdev); +isvf = virHostdevIsVirtualFunction(hostdev); if (isvf = 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, %s, _(Interface type hostdev is currently supported on @@ -427,7 +427,7 @@ qemuDomainHostdevNetConfigReplace(virDomainHostdevDefPtr hostdev, return ret; } -if (qemuDomainHostdevNetDevice(hostdev, linkdev, vf) 0) +if (virHostdevNetDevice(hostdev, linkdev, vf) 0) return ret; vlan = virDomainNetGetActualVlan(hostdev-parent.data.net); @@ -441,7 +441,7 @@ qemuDomainHostdevNetConfigReplace(virDomainHostdevDefPtr hostdev, virNetDevVPortTypeToString(virtPort-virtPortType)); goto cleanup; } -ret = qemuDomainHostdevNetConfigVirtPortProfile(linkdev, vf, +ret = virHostdevNetConfigVirtPortProfile(linkdev, vf, virtPort, hostdev-parent.data.net-mac, uuid, port_profile_associate); } else { @@ -481,9 +481,9 @@ cleanup: * case, try to find in the old state dir. */ static int -qemuDomainHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, - char *stateDir, - char *oldStateDir) +virHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, + char *stateDir, + char *oldStateDir) { char *linkdev = NULL; virNetDevVPortProfilePtr virtPort; @@ -501,7 +501,7 @@ qemuDomainHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, !hostdev-parent.data.net) return 0; -isvf = qemuDomainHostdevIsVirtualFunction(hostdev); +isvf = virHostdevIsVirtualFunction(hostdev); if (isvf = 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, %s, _(Interface type hostdev is currently
[libvirt] [PATCH v13 20/49] extract general code from qemuUpdateActiveScsiHostdevs
Extract general code from qemuUpdateActiveScsiHostdevs to virHostdevUpdateActiveScsiHostdevs Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 27 ++- 1 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 1992aa0..972ea09 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -172,22 +172,16 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, return virHostdevUpdateActiveUsbHostdevs(mgr, def); } -int -qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, - virDomainDefPtr def) +static int +virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr, + virDomainDefPtr def) { virDomainHostdevDefPtr hostdev = NULL; size_t i; int ret = -1; virSCSIDevicePtr scsi = NULL; virSCSIDevicePtr tmp = NULL; -virHostdevManagerPtr mgr; -if (!def-nhostdevs) -return 0; -mgr = virHostdevManagerGetDefault(); -if (mgr == NULL) -return -1; virObjectLock(mgr-activeScsiHostdevs); for (i = 0; i def-nhostdevs; i++) { hostdev = def-hostdevs[i]; @@ -227,6 +221,21 @@ cleanup: } +int +qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, + virDomainDefPtr def) +{ +virHostdevManagerPtr mgr; + +if (!def-nhostdevs) +return 0; +mgr = virHostdevManagerGetDefault(); +if (mgr == NULL) +return -1; + +return virHostdevUpdateActiveScsiHostdevs(mgr, def); +} + bool qemuHostdevHostSupportsPassthroughVFIO(void) { -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 10/49] extract general code from qemuPrepareHostdevPCIDevices
Extract general code from qemuPrepareHostdevPCIDevices to virHostdevPrepareHostdevPCIDevices. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 49 +++--- 1 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 4a36417..76e3978 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -662,28 +662,19 @@ qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs, return true; } - -int -qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, - const char *name, - const unsigned char *uuid, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs, - virQEMUCapsPtr qemuCaps, - unsigned int flags) +static int +virHostdevPreparePCIDevices(virHostdevManagerPtr hostdev_mgr, +const char *name, +const unsigned char *uuid, +virDomainHostdevDefPtr *hostdevs, +int nhostdevs, +unsigned int flags) { virPCIDeviceListPtr pcidevs = NULL; int last_processed_hostdev_vf = -1; size_t i; int ret = -1; -virHostdevManagerPtr hostdev_mgr; -if (!qemuPrepareHostdevPCICheckSupport(hostdevs, nhostdevs, qemuCaps)) -goto out; - -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) -goto out; virObjectLock(hostdev_mgr-activePciHostdevs); virObjectLock(hostdev_mgr-inactivePciHostdevs); @@ -866,6 +857,32 @@ cleanup: virObjectUnlock(hostdev_mgr-activePciHostdevs); virObjectUnlock(hostdev_mgr-inactivePciHostdevs); virObjectUnref(pcidevs); +return ret; + +} + +int +qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, + const char *name, + const unsigned char *uuid, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs, + virQEMUCapsPtr qemuCaps, + unsigned int flags) +{ +int ret = -1; +virHostdevManagerPtr hostdev_mgr; + +if (!qemuPrepareHostdevPCICheckSupport(hostdevs, nhostdevs, qemuCaps)) +goto out; + +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +goto out; + +ret = virHostdevPreparePCIDevices(hostdev_mgr, name, uuid, hostdevs, + nhostdevs, flags); + out: return ret; } -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 22/49] move virHostdevUpdate* functions to virhostdev.c
Signed-off-by: Chunyan Liu cy...@suse.com --- src/libvirt_private.syms |3 + src/qemu/qemu_hostdev.c | 152 -- src/util/virhostdev.c| 152 ++ src/util/virhostdev.h| 12 4 files changed, 167 insertions(+), 152 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 410133a..4417fdd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1295,6 +1295,9 @@ virHookPresent; virHostdevManagerGetDefault; virHostdevPreparePCIDevices; virHostdevReAttachPCIDevices; +virHostdevUpdateActivePciHostdevs; +virHostdevUpdateActiveScsiHostdevs; +virHostdevUpdateActiveUsbHostdevs; # util/viridentity.h virIdentityGetAttr; diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index c35a5df..5771f41 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -41,66 +41,6 @@ #define VIR_FROM_THIS VIR_FROM_QEMU -static int -virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, - const char *drv_name, - virDomainDefPtr def) - -{ -virDomainHostdevDefPtr hostdev = NULL; -virPCIDevicePtr dev = NULL; -size_t i; -int ret = -1; - -virObjectLock(mgr-activePciHostdevs); -virObjectLock(mgr-inactivePciHostdevs); - -for (i = 0; i def-nhostdevs; i++) { -hostdev = def-hostdevs[i]; - -if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) -continue; -if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) -continue; - -dev = virPCIDeviceNew(hostdev-source.subsys.u.pci.addr.domain, - hostdev-source.subsys.u.pci.addr.bus, - hostdev-source.subsys.u.pci.addr.slot, - hostdev-source.subsys.u.pci.addr.function); - -if (!dev) -goto cleanup; - -virPCIDeviceSetManaged(dev, hostdev-managed); -if (hostdev-source.subsys.u.pci.backend -== VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) { -if (virPCIDeviceSetStubDriver(dev, vfio-pci) 0) -goto cleanup; -} else { -if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) -goto cleanup; - -} -virPCIDeviceSetUsedBy(dev, drv_name, def-name); - -/* Setup the original states for the PCI device */ -virPCIDeviceSetUnbindFromStub(dev, hostdev-origstates.states.pci.unbind_from_stub); -virPCIDeviceSetRemoveSlot(dev, hostdev-origstates.states.pci.remove_slot); -virPCIDeviceSetReprobe(dev, hostdev-origstates.states.pci.reprobe); - -if (virPCIDeviceListAdd(mgr-activePciHostdevs, dev) 0) -goto cleanup; -dev = NULL; -} - -ret = 0; -cleanup: -virPCIDeviceFree(dev); -virObjectUnlock(mgr-activePciHostdevs); -virObjectUnlock(mgr-inactivePciHostdevs); -return ret; -} - int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefPtr def) @@ -116,49 +56,6 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, return virHostdevUpdateActivePciHostdevs(mgr, QEMU_DRIVER_NAME, def); } -static int -virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr, - const char *drv_name, - virDomainDefPtr def) -{ -virDomainHostdevDefPtr hostdev = NULL; -size_t i; -int ret = -1; - -virObjectLock(mgr-activeUsbHostdevs); -for (i = 0; i def-nhostdevs; i++) { -virUSBDevicePtr usb = NULL; -hostdev = def-hostdevs[i]; - -if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) -continue; -if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) -continue; - -usb = virUSBDeviceNew(hostdev-source.subsys.u.usb.bus, - hostdev-source.subsys.u.usb.device, - NULL); -if (!usb) { -VIR_WARN(Unable to reattach USB device %03d.%03d on domain %s, - hostdev-source.subsys.u.usb.bus, - hostdev-source.subsys.u.usb.device, - def-name); -continue; -} - -virUSBDeviceSetUsedBy(usb, drv_name, def-name); - -if (virUSBDeviceListAdd(mgr-activeUsbHostdevs, usb) 0) { -virUSBDeviceFree(usb); -goto cleanup; -} -} -ret = 0; -cleanup: -virObjectUnlock(mgr-activeUsbHostdevs); -return ret; -} - int qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefPtr def) @@ -174,55 +71,6 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, return virHostdevUpdateActiveUsbHostdevs(mgr, QEMU_DRIVER_NAME, def); } -static int
[libvirt] [PATCH v13 18/49] extract general code from qemuUpdateActivePciHostdevs
Extract general code from qemuUpdateActivePciHostdevs to virHostdevUpdateActivePciHostdevs. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 28 +++- 1 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index b0489e2..1730ed8 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -41,21 +41,16 @@ #define VIR_FROM_THIS VIR_FROM_QEMU -int -qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, -virDomainDefPtr def) +static int +virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, + virDomainDefPtr def) + { virDomainHostdevDefPtr hostdev = NULL; virPCIDevicePtr dev = NULL; size_t i; int ret = -1; -virHostdevManagerPtr mgr; -if (!def-nhostdevs) -return 0; -mgr = virHostdevManagerGetDefault(); -if (mgr == NULL) -return -1; virObjectLock(mgr-activePciHostdevs); virObjectLock(mgr-inactivePciHostdevs); @@ -106,6 +101,21 @@ cleanup: } int +qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, +virDomainDefPtr def) +{ +virHostdevManagerPtr mgr; + +if (!def-nhostdevs) +return 0; +mgr = virHostdevManagerGetDefault(); +if (mgr == NULL) +return -1; + +return virHostdevUpdateActivePciHostdevs(mgr, def); +} + +int qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefPtr def) { -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 08/49] qemu_hostdev: move ColdBoot as a flag
For extracting hostdev codes from qemu_hostdev.c to common library, change qemu specific COLD_BOOT handling to be a flag, and pass it to hostdev functions. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |6 +++--- src/qemu/qemu_hostdev.h |4 ++-- src/qemu/qemu_process.c |4 +++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 5f2dc44..6be58ef 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -1010,7 +1010,7 @@ out: int qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefPtr def, - bool coldBoot) + unsigned int flags) { size_t i; int ret = -1; @@ -1019,6 +1019,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virDomainHostdevDefPtr *hostdevs = def-hostdevs; int nhostdevs = def-nhostdevs; virHostdevManagerPtr hostdev_mgr; +bool coldBoot = !!(flags VIR_COLD_BOOT); /* To prevent situation where USB device is assigned to two domains * we need to keep a list of currently assigned USB devices. @@ -1216,7 +1217,6 @@ int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - bool coldBoot, unsigned int flags) { if (!def-nhostdevs) @@ -1227,7 +1227,7 @@ qemuPrepareHostDevices(virQEMUDriverPtr driver, qemuCaps, flags) 0) return -1; -if (qemuPrepareHostUSBDevices(driver, def, coldBoot) 0) +if (qemuPrepareHostUSBDevices(driver, def, flags) 0) return -1; if (qemuPrepareHostdevSCSIDevices(driver, def-name, diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h index 48ca610..c137302 100644 --- a/src/qemu/qemu_hostdev.h +++ b/src/qemu/qemu_hostdev.h @@ -29,6 +29,7 @@ typedef enum { VIR_STRICT_ACS_CHECK = (1 0), /* strict acs check */ + VIR_COLD_BOOT= (1 1), /* cold boot */ } virHostdevFlag; int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, @@ -49,7 +50,7 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, int qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, virDomainDefPtr def, - bool coldBoot); + unsigned int flags); int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, const char *name, virDomainHostdevDefPtr *hostdevs, @@ -57,7 +58,6 @@ int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - bool coldBoot, unsigned int flags); void qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 47ecfe4..3fbe4d1 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3688,8 +3688,10 @@ int qemuProcessStart(virConnectPtr conn, VIR_DEBUG(Preparing host devices); if (!cfg-relaxedACS) hostdev_flags |= VIR_STRICT_ACS_CHECK; +if (!migrateFrom) +hostdev_flags |= VIR_COLD_BOOT; if (qemuPrepareHostDevices(driver, vm-def, priv-qemuCaps, - !migrateFrom, hostdev_flags) 0) +hostdev_flags) 0) goto cleanup; VIR_DEBUG(Preparing chr devices); -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 09/49] qemu_hostdev: move netconfig file location to virhostdev stateDir
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 27 +++ 1 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 6be58ef..4a36417 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -473,10 +473,17 @@ cleanup: return ret; } - +/* @oldStateDir: + * For upgrade purpose: + * To an existing VM on QEMU, the hostdev netconfig file is originally stored + * in cfg-stateDir (/var/run/libvirt/qemu). Switch to new version, it uses new + * location (hostdev_mgr-stateDir) but certainly will not find it. In this + * case, try to find in the old state dir. + */ static int qemuDomainHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, - char *stateDir) + char *stateDir, + char *oldStateDir) { char *linkdev = NULL; virNetDevVPortProfilePtr virtPort; @@ -511,8 +518,11 @@ qemuDomainHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, ret = qemuDomainHostdevNetConfigVirtPortProfile(linkdev, vf, virtPort, hostdev-parent.data.net-mac, NULL, port_profile_associate); -else +else { ret = virNetDevRestoreNetConfig(linkdev, vf, stateDir); +if (ret 0 oldStateDir != NULL) +ret = virNetDevRestoreNetConfig(linkdev, vf, oldStateDir); +} VIR_FREE(linkdev); @@ -666,7 +676,6 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, int last_processed_hostdev_vf = -1; size_t i; int ret = -1; -virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virHostdevManagerPtr hostdev_mgr; if (!qemuPrepareHostdevPCICheckSupport(hostdevs, nhostdevs, qemuCaps)) @@ -755,7 +764,7 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, if (hostdev-parent.type == VIR_DOMAIN_DEVICE_NET hostdev-parent.data.net) { if (qemuDomainHostdevNetConfigReplace(hostdev, uuid, - cfg-stateDir) 0) { + hostdev_mgr-stateDir) 0) { goto resetvfnetconfig; } } @@ -839,7 +848,8 @@ inactivedevs: resetvfnetconfig: for (i = 0; last_processed_hostdev_vf != -1 i last_processed_hostdev_vf; i++) -qemuDomainHostdevNetConfigRestore(hostdevs[i], cfg-stateDir); +qemuDomainHostdevNetConfigRestore(hostdevs[i], hostdev_mgr-stateDir, + NULL); reattachdevs: for (i = 0; i virPCIDeviceListCount(pcidevs); i++) { @@ -857,7 +867,6 @@ cleanup: virObjectUnlock(hostdev_mgr-inactivePciHostdevs); virObjectUnref(pcidevs); out: -virObjectUnref(cfg); return ret; } @@ -1282,6 +1291,7 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, virPCIDeviceListPtr pcidevs; size_t i; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); +char *oldStateDir = cfg-stateDir; virHostdevManagerPtr hostdev_mgr; hostdev_mgr = virHostdevManagerGetDefault(); @@ -1336,7 +1346,8 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, * reset and reattach device */ for (i = 0; i nhostdevs; i++) -qemuDomainHostdevNetConfigRestore(hostdevs[i], cfg-stateDir); +qemuDomainHostdevNetConfigRestore(hostdevs[i], hostdev_mgr-stateDir, + oldStateDir); for (i = 0; i virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 14/49] extract general code from qemuDomainReAttachHostdevDevices
Extract general code from qemuDomainReAttachHostdevDevicesi to virHostdevReAttachPCIDevices Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 41 + 1 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index bbc85bc..74923a1 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -1299,22 +1299,19 @@ qemuReattachPciDevice(virPCIDevicePtr dev, virHostdevManagerPtr mgr) virPCIDeviceFree(dev); } - -void -qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, - const char *name, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs) +/* @oldStateDir: + * For upgrade purpose: see virHostdevNetConfigRestore + */ +static void +virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs, + char *oldStateDir) { virPCIDeviceListPtr pcidevs; size_t i; -virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); -char *oldStateDir = cfg-stateDir; -virHostdevManagerPtr hostdev_mgr; -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) -goto out; virObjectLock(hostdev_mgr-activePciHostdevs); virObjectLock(hostdev_mgr-inactivePciHostdevs); @@ -1388,6 +1385,26 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, cleanup: virObjectUnlock(hostdev_mgr-activePciHostdevs); virObjectUnlock(hostdev_mgr-inactivePciHostdevs); + +} + +void +qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) +{ +virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); +char *oldStateDir = cfg-stateDir; +virHostdevManagerPtr hostdev_mgr; + +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +goto out; + +virHostdevReAttachPCIDevices(hostdev_mgr, name, + hostdevs, nhostdevs, oldStateDir); + out: virObjectUnref(cfg); } -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 29/49] pass driver name as parameter to virHostdevPrepareSCSIDevices
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |8 +--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 5eb12d1..a7b4e74 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -265,6 +265,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, static int virHostdevPrepareSCSIDevices(virHostdevManagerPtr hostdev_mgr, + const char *drv_name, const char *name, virDomainHostdevDefPtr *hostdevs, int nhostdevs) @@ -335,10 +336,10 @@ virHostdevPrepareSCSIDevices(virHostdevManagerPtr hostdev_mgr, goto error; } -if (virSCSIDeviceSetUsedBy(tmp, QEMU_DRIVER_NAME, name) 0) +if (virSCSIDeviceSetUsedBy(tmp, drv_name, name) 0) goto error; } else { -if (virSCSIDeviceSetUsedBy(scsi, QEMU_DRIVER_NAME, name) 0) +if (virSCSIDeviceSetUsedBy(scsi, drv_name, name) 0) goto error; VIR_DEBUG(Adding %s to activeScsiHostdevs, virSCSIDeviceGetName(scsi)); @@ -403,7 +404,8 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, return -1; } -return virHostdevPrepareSCSIDevices(hostdev_mgr, name, hostdevs, nhostdevs); +return virHostdevPrepareSCSIDevices(hostdev_mgr, QEMU_DRIVER_NAME, +name, hostdevs, nhostdevs); } -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 06/49] lxc: use general virhostdev lists instead of its own
Signed-off-by: Chunyan Liu cy...@suse.com --- src/lxc/lxc_conf.h|4 src/lxc/lxc_driver.c | 17 + src/lxc/lxc_hostdev.c | 49 - 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index e04dcdd..5be159b 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -93,10 +93,6 @@ struct _virLXCDriver { /* Immutable pointer, self-locking APIs */ virDomainObjListPtr domains; -/* Immutable pointer. Requires lock to be held before - * calling APIs. */ -virUSBDeviceListPtr activeUsbHostdevs; - /* Immutable pointer, self-locking APIs */ virObjectEventStatePtr domainEventState; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 10e0fbb..f67a236 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -71,6 +71,7 @@ #include virstring.h #include viraccessapicheck.h #include viraccessapichecklxc.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LXC @@ -1557,9 +1558,6 @@ static int lxcStateInitialize(bool privileged, if (!(lxc_driver-securityManager = lxcSecurityInit(cfg))) goto cleanup; -if ((lxc_driver-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) -goto cleanup; - if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL) goto cleanup; @@ -1674,7 +1672,6 @@ static int lxcStateCleanup(void) virSysinfoDefFree(lxc_driver-hostsysinfo); -virObjectUnref(lxc_driver-activeUsbHostdevs); virObjectUnref(lxc_driver-caps); virObjectUnref(lxc_driver-securityManager); virObjectUnref(lxc_driver-xmlopt); @@ -4688,7 +4685,7 @@ cleanup: static int -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, +lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver ATTRIBUTE_UNUSED, virDomainObjPtr vm, virDomainDeviceDefPtr dev) { @@ -4697,6 +4694,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, int idx, ret = -1; char *dst = NULL; virUSBDevicePtr usb = NULL; +virHostdevManagerPtr hostdev_mgr; if ((idx = virDomainHostdevFind(vm-def, dev-data.hostdev, @@ -4733,9 +4731,12 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, VIR_WARN(cannot deny device %s for domain %s, dst, vm-def-name); -virObjectLock(driver-activeUsbHostdevs); -virUSBDeviceListDel(driver-activeUsbHostdevs, usb); -virObjectUnlock(driver-activeUsbHostdevs); +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +goto cleanup; +virObjectLock(hostdev_mgr-activeUsbHostdevs); +virUSBDeviceListDel(hostdev_mgr-activeUsbHostdevs, usb); +virObjectUnlock(hostdev_mgr-activeUsbHostdevs); virDomainHostdevRemove(vm-def, idx); virDomainHostdevDefFree(def); diff --git a/src/lxc/lxc_hostdev.c b/src/lxc/lxc_hostdev.c index b7248df..8398646 100644 --- a/src/lxc/lxc_hostdev.c +++ b/src/lxc/lxc_hostdev.c @@ -27,19 +27,25 @@ #include viralloc.h #include virlog.h #include virerror.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_LXC int -virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, +virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefPtr def) { virDomainHostdevDefPtr hostdev = NULL; size_t i; +virHostdevManagerPtr hostdev_mgr; if (!def-nhostdevs) return 0; +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +return -1; + for (i = 0; i def-nhostdevs; i++) { virUSBDevicePtr usb = NULL; hostdev = def-hostdevs[i]; @@ -62,13 +68,13 @@ virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, virUSBDeviceSetUsedBy(usb, LXC_DRIVER_NAME, def-name); -virObjectLock(driver-activeUsbHostdevs); -if (virUSBDeviceListAdd(driver-activeUsbHostdevs, usb) 0) { -virObjectUnlock(driver-activeUsbHostdevs); +virObjectLock(hostdev_mgr-activeUsbHostdevs); +if (virUSBDeviceListAdd(hostdev_mgr-activeUsbHostdevs, usb) 0) { +virObjectUnlock(hostdev_mgr-activeUsbHostdevs); virUSBDeviceFree(usb); return -1; } -virObjectUnlock(driver-activeUsbHostdevs); +virObjectUnlock(hostdev_mgr-activeUsbHostdevs); } return 0; @@ -76,20 +82,24 @@ virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, int -virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver, +virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver ATTRIBUTE_UNUSED, const char *name, virUSBDeviceList *list) { size_t i, j; unsigned int count; virUSBDevicePtr tmp; +virHostdevManagerPtr hostdev_mgr; count = virUSBDeviceListCount
[libvirt] [PATCH v13 16/49] rename qemuReAttachPciDevice to virHostdevReAttachPciDevice
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 16 +--- 1 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index ea776ce..8f009e1 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -1270,10 +1270,8 @@ qemuPrepareHostDevices(virQEMUDriverPtr driver, * are locked */ static void -qemuReattachPciDevice(virPCIDevicePtr dev, virHostdevManagerPtr mgr) +virHostdevReattachPciDevice(virPCIDevicePtr dev, virHostdevManagerPtr mgr) { -int retries = 100; - /* If the device is not managed and was attached to guest * successfully, it must have been inactive. */ @@ -1283,10 +1281,14 @@ qemuReattachPciDevice(virPCIDevicePtr dev, virHostdevManagerPtr mgr) return; } -while (virPCIDeviceWaitForCleanup(dev, kvm_assigned_device) -retries) { -usleep(100*1000); -retries--; +/* Wait for device cleanup if it is qemu/kvm */ +if (STREQ(virPCIDeviceGetStubDriver(dev), pci-stub)) { +int retries = 100; +while (virPCIDeviceWaitForCleanup(dev, kvm_assigned_device) +retries) { +usleep(100*1000); +retries--; +} } if (virPCIDeviceReattach(dev, mgr-activePciHostdevs, -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 24/49] extract general code from qemuPrepareHostUSBDevices
Extract general code from qemuPrepareHostUSBDevices to virHostdevPrepareHostUSBDevices. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 37 - 1 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index e39bc47..1a589f4 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -390,26 +390,19 @@ out: return 0; } - -int -qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, - virDomainDefPtr def, - unsigned int flags) +static int +virHostdevPrepareUSBDevices(virHostdevManagerPtr hostdev_mgr, +const char *dom_name, +virDomainHostdevDefPtr *hostdevs, +int nhostdevs, +unsigned int flags) { size_t i; int ret = -1; virUSBDeviceListPtr list; virUSBDevicePtr tmp; -virDomainHostdevDefPtr *hostdevs = def-hostdevs; -int nhostdevs = def-nhostdevs; -const char *dom_name = def-name; -virHostdevManagerPtr hostdev_mgr; bool coldBoot = !!(flags VIR_COLD_BOOT); -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) -return -1; - /* To prevent situation where USB device is assigned to two domains * we need to keep a list of currently assigned USB devices. * This is done in several loops which cannot be joined into one big @@ -467,6 +460,24 @@ cleanup: return ret; } +int +qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, + virDomainDefPtr def, + unsigned int flags) +{ +virDomainHostdevDefPtr *hostdevs = def-hostdevs; +int nhostdevs = def-nhostdevs; +const char *dom_name = def-name; +virHostdevManagerPtr hostdev_mgr; + +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +return -1; + +return virHostdevPrepareUSBDevices(hostdev_mgr, dom_name, + hostdevs, nhostdevs, flags); +} + int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 07/49] qemu_hostdev: move cfg-relaxedACS as a flag
For extracting hostdev codes from qemu_hostdev.c to common library, change qemu specific cfg-relaxedACS handling to be a flag, and pass it to hostdev functions. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 11 +++ src/qemu/qemu_hostdev.h | 10 -- src/qemu/qemu_hotplug.c | 11 +-- src/qemu/qemu_process.c |5 - 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 54ac973..5f2dc44 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -659,7 +659,8 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, const unsigned char *uuid, virDomainHostdevDefPtr *hostdevs, int nhostdevs, - virQEMUCapsPtr qemuCaps) + virQEMUCapsPtr qemuCaps, + unsigned int flags) { virPCIDeviceListPtr pcidevs = NULL; int last_processed_hostdev_vf = -1; @@ -695,8 +696,9 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, for (i = 0; i virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); virPCIDevicePtr other; +bool strict_acs_check = !!(flags VIR_STRICT_ACS_CHECK); -if (!virPCIDeviceIsAssignable(dev, !cfg-relaxedACS)) { +if (!virPCIDeviceIsAssignable(dev, strict_acs_check)) { virReportError(VIR_ERR_OPERATION_INVALID, _(PCI device %s is not assignable), virPCIDeviceGetName(dev)); @@ -1214,14 +1216,15 @@ int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - bool coldBoot) + bool coldBoot, + unsigned int flags) { if (!def-nhostdevs) return 0; if (qemuPrepareHostdevPCIDevices(driver, def-name, def-uuid, def-hostdevs, def-nhostdevs, - qemuCaps) 0) + qemuCaps, flags) 0) return -1; if (qemuPrepareHostUSBDevices(driver, def, coldBoot) 0) diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h index 5b34245..48ca610 100644 --- a/src/qemu/qemu_hostdev.h +++ b/src/qemu/qemu_hostdev.h @@ -27,6 +27,10 @@ # include qemu_conf.h # include domain_conf.h +typedef enum { + VIR_STRICT_ACS_CHECK = (1 0), /* strict acs check */ +} virHostdevFlag; + int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, virDomainDefPtr def); int qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, @@ -40,7 +44,8 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, const unsigned char *uuid, virDomainHostdevDefPtr *hostdevs, int nhostdevs, - virQEMUCapsPtr qemuCaps); + virQEMUCapsPtr qemuCaps, + unsigned int flags); int qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, virDomainDefPtr def, @@ -52,7 +57,8 @@ int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - bool coldBoot); + bool coldBoot, + unsigned int flags); void qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, const char *name, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index eeb1f24..a213929 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1155,13 +1155,17 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver, bool teardownlabel = false; int backend; unsigned long long memKB; +virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); +unsigned int flags = 0; if (VIR_REALLOC_N(vm-def-hostdevs, vm-def-nhostdevs + 1) 0) return -1; +if (!cfg-relaxedACS) +flags |= VIR_STRICT_ACS_CHECK; if (qemuPrepareHostdevPCIDevices(driver, vm-def-name, vm-def-uuid, - hostdev, 1, priv-qemuCaps) 0) -return -1; + hostdev, 1, priv-qemuCaps, flags) 0) +goto cleanup; /* this could have been changed by qemuPrepareHostdevPCIDevices */ backend = hostdev-source.subsys.u.pci.backend; @@ -1255,6 +1259,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver, VIR_FREE(devstr); VIR_FREE(configfd_name); VIR_FORCE_CLOSE(configfd); +virObjectUnref(cfg
[libvirt] [PATCH v13 27/49] move virHostdevPrepareHostUSBDevices to virhostdev.c
Signed-off-by: Chunyan Liu cy...@suse.com --- src/libvirt_private.syms |1 + src/qemu/qemu_hostdev.c | 217 -- src/util/virhostdev.c| 216 + src/util/virhostdev.h|7 ++ 4 files changed, 224 insertions(+), 217 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4417fdd..01f6c81 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1294,6 +1294,7 @@ virHookPresent; #util/virhostdev.h virHostdevManagerGetDefault; virHostdevPreparePCIDevices; +virHostdevPrepareUSBDevices; virHostdevReAttachPCIDevices; virHostdevUpdateActivePciHostdevs; virHostdevUpdateActiveScsiHostdevs; diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index a7e6c91..2934e65 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -245,223 +245,6 @@ out: return ret; } - -static int -virHostdevMarkUsbHostdevs(virHostdevManagerPtr mgr, - const char *drv_name, - const char *name, - virUSBDeviceListPtr list) -{ -size_t i, j; -unsigned int count; -virUSBDevicePtr tmp; - -virObjectLock(mgr-activeUsbHostdevs); -count = virUSBDeviceListCount(list); - -for (i = 0; i count; i++) { -virUSBDevicePtr usb = virUSBDeviceListGet(list, i); -if ((tmp = virUSBDeviceListFind(mgr-activeUsbHostdevs, usb))) { -const char *other_drvname; -const char *other_domname; - -virUSBDeviceGetUsedBy(tmp, other_drvname, other_domname); -if (other_drvname other_domname) -virReportError(VIR_ERR_OPERATION_INVALID, - _(USB device %s is in use by - driver %s, domain %s), - virUSBDeviceGetName(tmp), - other_drvname, other_domname); -else -virReportError(VIR_ERR_OPERATION_INVALID, - _(USB device %s is already in use), - virUSBDeviceGetName(tmp)); -goto error; -} - -virUSBDeviceSetUsedBy(usb, drv_name, name); -VIR_DEBUG(Adding %03d.%03d dom=%s to activeUsbHostdevs, - virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name); -/* - * The caller is responsible to steal these usb devices - * from the virUSBDeviceList that passed in on success, - * perform rollback on failure. - */ -if (virUSBDeviceListAdd(mgr-activeUsbHostdevs, usb) 0) -goto error; -} - -virObjectUnlock(mgr-activeUsbHostdevs); -return 0; - -error: -for (j = 0; j i; j++) { -tmp = virUSBDeviceListGet(list, i); -virUSBDeviceListSteal(mgr-activeUsbHostdevs, tmp); -} -virObjectUnlock(mgr-activeUsbHostdevs); -return -1; -} - - -static int -virHostdevFindUSBDevice(virDomainHostdevDefPtr hostdev, -bool mandatory, -virUSBDevicePtr *usb) -{ -unsigned vendor = hostdev-source.subsys.u.usb.vendor; -unsigned product = hostdev-source.subsys.u.usb.product; -unsigned bus = hostdev-source.subsys.u.usb.bus; -unsigned device = hostdev-source.subsys.u.usb.device; -bool autoAddress = hostdev-source.subsys.u.usb.autoAddress; -int rc; - -*usb = NULL; - -if (vendor bus) { -rc = virUSBDeviceFind(vendor, product, bus, device, - NULL, - autoAddress ? false : mandatory, - usb); -if (rc 0) { -return -1; -} else if (!autoAddress) { -goto out; -} else { -VIR_INFO(USB device %x:%x could not be found at previous - address (bus:%u device:%u), - vendor, product, bus, device); -} -} - -/* When vendor is specified, its USB address is either unspecified or the - * device could not be found at the USB device where it had been - * automatically found before. - */ -if (vendor) { -virUSBDeviceListPtr devs; - -rc = virUSBDeviceFindByVendor(vendor, product, NULL, mandatory, devs); -if (rc 0) -return -1; - -if (rc == 1) { -*usb = virUSBDeviceListGet(devs, 0); -virUSBDeviceListSteal(devs, *usb); -} -virObjectUnref(devs); - -if (rc == 0) { -goto out; -} else if (rc 1) { -if (autoAddress) { -virReportError(VIR_ERR_OPERATION_FAILED, - _(Multiple USB devices for %x:%x were found, - but none of them is at bus:%u device:%u), - vendor, product, bus, device); -} else
[libvirt] [PATCH v13 19/49] extract general code from qemuUpdateActiveUsbHostdevs
Extract general code from qemuUpdateActiveUsbHostdevs to virHostdevUpdateActiveUsbHostdevs. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 27 ++- 1 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 1730ed8..1992aa0 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -115,20 +115,14 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, return virHostdevUpdateActivePciHostdevs(mgr, def); } -int -qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, -virDomainDefPtr def) +static int +virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr, + virDomainDefPtr def) { virDomainHostdevDefPtr hostdev = NULL; size_t i; int ret = -1; -virHostdevManagerPtr mgr; -if (!def-nhostdevs) -return 0; -mgr = virHostdevManagerGetDefault(); -if (mgr == NULL) -return -1; virObjectLock(mgr-activeUsbHostdevs); for (i = 0; i def-nhostdevs; i++) { virUSBDevicePtr usb = NULL; @@ -164,6 +158,21 @@ cleanup: } int +qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, +virDomainDefPtr def) +{ +virHostdevManagerPtr mgr; + +if (!def-nhostdevs) +return 0; +mgr = virHostdevManagerGetDefault(); +if (mgr == NULL) +return -1; + +return virHostdevUpdateActiveUsbHostdevs(mgr, def); +} + +int qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefPtr def) { -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 21/49] pass driver_name as parameter of virHostdevUpdate*Hostdevs functions
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 18 ++ 1 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 972ea09..c35a5df 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -43,6 +43,7 @@ static int virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, virDomainDefPtr def) { @@ -80,7 +81,7 @@ virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, goto cleanup; } -virPCIDeviceSetUsedBy(dev, QEMU_DRIVER_NAME, def-name); +virPCIDeviceSetUsedBy(dev, drv_name, def-name); /* Setup the original states for the PCI device */ virPCIDeviceSetUnbindFromStub(dev, hostdev-origstates.states.pci.unbind_from_stub); @@ -112,11 +113,12 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, if (mgr == NULL) return -1; -return virHostdevUpdateActivePciHostdevs(mgr, def); +return virHostdevUpdateActivePciHostdevs(mgr, QEMU_DRIVER_NAME, def); } static int virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, virDomainDefPtr def) { virDomainHostdevDefPtr hostdev = NULL; @@ -144,7 +146,7 @@ virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr, continue; } -virUSBDeviceSetUsedBy(usb, QEMU_DRIVER_NAME, def-name); +virUSBDeviceSetUsedBy(usb, drv_name, def-name); if (virUSBDeviceListAdd(mgr-activeUsbHostdevs, usb) 0) { virUSBDeviceFree(usb); @@ -169,11 +171,12 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, if (mgr == NULL) return -1; -return virHostdevUpdateActiveUsbHostdevs(mgr, def); +return virHostdevUpdateActiveUsbHostdevs(mgr, QEMU_DRIVER_NAME, def); } static int virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, virDomainDefPtr def) { virDomainHostdevDefPtr hostdev = NULL; @@ -200,13 +203,13 @@ virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr, goto cleanup; if ((tmp = virSCSIDeviceListFind(mgr-activeScsiHostdevs, scsi))) { -if (virSCSIDeviceSetUsedBy(tmp, QEMU_DRIVER_NAME, def-name) 0) { +if (virSCSIDeviceSetUsedBy(tmp, drv_name, def-name) 0) { virSCSIDeviceFree(scsi); goto cleanup; } virSCSIDeviceFree(scsi); } else { -if (virSCSIDeviceSetUsedBy(scsi, QEMU_DRIVER_NAME, def-name) 0 || +if (virSCSIDeviceSetUsedBy(scsi, drv_name, def-name) 0 || virSCSIDeviceListAdd(mgr-activeScsiHostdevs, scsi) 0) { virSCSIDeviceFree(scsi); goto cleanup; @@ -220,7 +223,6 @@ cleanup: return ret; } - int qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefPtr def) @@ -233,7 +235,7 @@ qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, if (mgr == NULL) return -1; -return virHostdevUpdateActiveScsiHostdevs(mgr, def); +return virHostdevUpdateActiveScsiHostdevs(mgr, QEMU_DRIVER_NAME, def); } bool -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 05/49] qemu: use general virhostdev lists instead of its own
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_conf.h|8 -- src/qemu/qemu_driver.c | 74 +-- src/qemu/qemu_hostdev.c | 192 --- src/qemu/qemu_hotplug.c |1 + 4 files changed, 151 insertions(+), 124 deletions(-) diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index ece185b..2ac88fb 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -215,14 +215,6 @@ struct _virQEMUDriver { /* Immutable pointer. self-locking APIs */ virSecurityManagerPtr securityManager; -/* Immutable pointers. Requires locks to be held before - * calling APIs. activePciHostdevs must be locked before - * inactivePciHostdevs */ -virPCIDeviceListPtr activePciHostdevs; -virPCIDeviceListPtr inactivePciHostdevs; -virUSBDeviceListPtr activeUsbHostdevs; -virSCSIDeviceListPtr activeScsiHostdevs; - /* Immutable pointer. Unsafe APIs. XXX */ virHashTablePtr sharedDevices; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f36a8b4..7d924b2 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -95,6 +95,7 @@ #include viraccessapicheck.h #include viraccessapicheckqemu.h #include storage/storage_driver.h +#include virhostdev.h #define VIR_FROM_THIS VIR_FROM_QEMU @@ -695,18 +696,6 @@ qemuStateInitialize(bool privileged, if (qemuSecurityInit(qemu_driver) 0) goto error; -if ((qemu_driver-activePciHostdevs = virPCIDeviceListNew()) == NULL) -goto error; - -if ((qemu_driver-activeUsbHostdevs = virUSBDeviceListNew()) == NULL) -goto error; - -if ((qemu_driver-inactivePciHostdevs = virPCIDeviceListNew()) == NULL) -goto error; - -if ((qemu_driver-activeScsiHostdevs = virSCSIDeviceListNew()) == NULL) -goto error; - if (!(qemu_driver-sharedDevices = virHashCreate(30, qemuSharedDeviceEntryFree))) goto error; @@ -983,10 +972,6 @@ qemuStateCleanup(void) { virNWFilterUnRegisterCallbackDriver(qemuCallbackDriver); virObjectUnref(qemu_driver-config); -virObjectUnref(qemu_driver-activePciHostdevs); -virObjectUnref(qemu_driver-inactivePciHostdevs); -virObjectUnref(qemu_driver-activeUsbHostdevs); -virObjectUnref(qemu_driver-activeScsiHostdevs); virHashFree(qemu_driver-sharedDevices); virObjectUnref(qemu_driver-caps); virQEMUCapsCacheFree(qemu_driver-qemuCapsCache); @@ -11226,7 +11211,6 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, const char *driverName, unsigned int flags) { -virQEMUDriverPtr driver = dev-conn-privateData; virPCIDevicePtr pci = NULL; unsigned domain = 0, bus = 0, slot = 0, function = 0; int ret = -1; @@ -11234,6 +11218,7 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, char *xml = NULL; bool legacy = qemuHostdevHostSupportsPassthroughLegacy(); bool vfio = qemuHostdevHostSupportsPassthroughVFIO(); +virHostdevManagerPtr hostdev_mgr; virCheckFlags(0, -1); @@ -11292,18 +11277,21 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, goto cleanup; } -virObjectLock(driver-activePciHostdevs); -virObjectLock(driver-inactivePciHostdevs); +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +goto cleanup; +virObjectLock(hostdev_mgr-activePciHostdevs); +virObjectLock(hostdev_mgr-inactivePciHostdevs); -if (virPCIDeviceDetach(pci, driver-activePciHostdevs, - driver-inactivePciHostdevs) 0) { +if (virPCIDeviceDetach(pci, hostdev_mgr-activePciHostdevs, + hostdev_mgr-inactivePciHostdevs) 0) { goto out; } ret = 0; out: -virObjectUnlock(driver-inactivePciHostdevs); -virObjectUnlock(driver-activePciHostdevs); +virObjectUnlock(hostdev_mgr-inactivePciHostdevs); +virObjectUnlock(hostdev_mgr-activePciHostdevs); cleanup: virPCIDeviceFree(pci); virNodeDeviceDefFree(def); @@ -11320,13 +11308,13 @@ qemuNodeDeviceDettach(virNodeDevicePtr dev) static int qemuNodeDeviceReAttach(virNodeDevicePtr dev) { -virQEMUDriverPtr driver = dev-conn-privateData; virPCIDevicePtr pci = NULL; virPCIDevicePtr other; unsigned domain = 0, bus = 0, slot = 0, function = 0; int ret = -1; virNodeDeviceDefPtr def = NULL; char *xml = NULL; +virHostdevManagerPtr hostdev_mgr; xml = virNodeDeviceGetXMLDesc(dev, 0); if (!xml) @@ -11346,9 +11334,13 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) if (!pci) goto cleanup; -virObjectLock(driver-activePciHostdevs); -virObjectLock(driver-inactivePciHostdevs); -other = virPCIDeviceListFind(driver-activePciHostdevs, pci); +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +goto cleanup_pci; + +virObjectLock(hostdev_mgr-activePciHostdevs
[libvirt] [PATCH v13 17/49] move virHostdevPrepare(ReAttach)PCIDevices to virhostdev.c
Signed-off-by: Chunyan Liu cy...@suse.com --- src/libvirt_private.syms |3 +- src/qemu/qemu_hostdev.c | 648 - src/qemu/qemu_hostdev.h |5 - src/qemu/qemu_process.c |1 + src/util/virhostdev.c| 649 ++ src/util/virhostdev.h| 25 ++ 6 files changed, 677 insertions(+), 654 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index bc048a1..410133a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1293,7 +1293,8 @@ virHookPresent; #util/virhostdev.h virHostdevManagerGetDefault; - +virHostdevPreparePCIDevices; +virHostdevReAttachPCIDevices; # util/viridentity.h virIdentityGetAttr; diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 8f009e1..b0489e2 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -41,102 +41,6 @@ #define VIR_FROM_THIS VIR_FROM_QEMU -static virPCIDeviceListPtr -virHostdevGetPciHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs) -{ -virPCIDeviceListPtr list; -size_t i; - -if (!(list = virPCIDeviceListNew())) -return NULL; - -for (i = 0; i nhostdevs; i++) { -virDomainHostdevDefPtr hostdev = hostdevs[i]; -virPCIDevicePtr dev; - -if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) -continue; -if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) -continue; - -dev = virPCIDeviceNew(hostdev-source.subsys.u.pci.addr.domain, - hostdev-source.subsys.u.pci.addr.bus, - hostdev-source.subsys.u.pci.addr.slot, - hostdev-source.subsys.u.pci.addr.function); -if (!dev) { -virObjectUnref(list); -return NULL; -} - -if (virPCIDeviceListAdd(list, dev) 0) { -virPCIDeviceFree(dev); -virObjectUnref(list); -return NULL; -} - -virPCIDeviceSetManaged(dev, hostdev-managed); -if (hostdev-source.subsys.u.pci.backend -== VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) { -if (virPCIDeviceSetStubDriver(dev, vfio-pci) 0) { -virObjectUnref(list); -return NULL; -} -} else { -if (virPCIDeviceSetStubDriver(dev, pci-stub) 0) { -virObjectUnref(list); -return NULL; -} -} -} - -return list; -} - - -/* - * virHostdevGetActivePciHostDeviceList - make a new list with a *copy* of - * every virPCIDevice object that is found on the activePciHostdevs - * list *and* is in the hostdev list for this domain. - * - * Return the new list, or NULL if there was a failure. - * - * Pre-condition: activePciHostdevs is locked - */ -static virPCIDeviceListPtr -virHostdevGetActivePciHostDeviceList(virHostdevManagerPtr mgr, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs) -{ -virPCIDeviceListPtr list; -size_t i; - -if (!(list = virPCIDeviceListNew())) -return NULL; - -for (i = 0; i nhostdevs; i++) { -virDomainHostdevDefPtr hostdev = hostdevs[i]; -virDevicePCIAddressPtr addr; -virPCIDevicePtr activeDev; - -if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) -continue; -if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) -continue; - -addr = hostdev-source.subsys.u.pci.addr; -activeDev = virPCIDeviceListFindByIDs(mgr-activePciHostdevs, - addr-domain, addr-bus, - addr-slot, addr-function); -if (activeDev virPCIDeviceListAddCopy(list, activeDev) 0) { -virObjectUnref(list); -return NULL; -} -} - -return list; -} - - int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefPtr def) @@ -304,232 +208,6 @@ cleanup: } -static int -virHostdevPciSysfsPath(virDomainHostdevDefPtr hostdev, - char **sysfs_path) -{ -virPCIDeviceAddress config_address; - -config_address.domain = hostdev-source.subsys.u.pci.addr.domain; -config_address.bus = hostdev-source.subsys.u.pci.addr.bus; -config_address.slot = hostdev-source.subsys.u.pci.addr.slot; -config_address.function = hostdev-source.subsys.u.pci.addr.function; - -return virPCIDeviceAddressGetSysfsFile(config_address, sysfs_path); -} - - -static int -virHostdevIsVirtualFunction(virDomainHostdevDefPtr hostdev) -{ -char *sysfs_path = NULL; -int ret = -1; - -if (virHostdevPciSysfsPath(hostdev, sysfs_path) 0) -return ret; - -ret = virPCIIsVirtualFunction(sysfs_path); - -VIR_FREE(sysfs_path
[libvirt] [PATCH v13 38/49] extract general code of NodeDeviceReAttach
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_driver.c | 67 1 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 46d975e..1b81689 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11317,37 +11317,11 @@ qemuNodeDeviceDettach(virNodeDevicePtr dev) } static int -qemuNodeDeviceReAttach(virNodeDevicePtr dev) +virHostdevPciNodeDeviceReAttach(virHostdevManagerPtr hostdev_mgr, +virPCIDevicePtr pci) { -virPCIDevicePtr pci = NULL; virPCIDevicePtr other; -unsigned domain = 0, bus = 0, slot = 0, function = 0; int ret = -1; -virNodeDeviceDefPtr def = NULL; -char *xml = NULL; -virHostdevManagerPtr hostdev_mgr; - -xml = virNodeDeviceGetXMLDesc(dev, 0); -if (!xml) -goto cleanup; - -def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE, NULL); -if (!def) -goto cleanup; - -if (virNodeDeviceReAttachEnsureACL(dev-conn, def) 0) -goto cleanup; - -if (qemuNodeDeviceGetPciInfo(def, domain, bus, slot, function) 0) -goto cleanup; - -pci = virPCIDeviceNew(domain, bus, slot, function); -if (!pci) -goto cleanup; - -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) -goto cleanup_pci; virObjectLock(hostdev_mgr-activePciHostdevs); virObjectLock(hostdev_mgr-inactivePciHostdevs); @@ -11380,6 +11354,43 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) out: virObjectUnlock(hostdev_mgr-inactivePciHostdevs); virObjectUnlock(hostdev_mgr-activePciHostdevs); +return ret; +} + +static int +qemuNodeDeviceReAttach(virNodeDevicePtr dev) +{ +virPCIDevicePtr pci = NULL; +unsigned domain = 0, bus = 0, slot = 0, function = 0; +int ret = -1; +virNodeDeviceDefPtr def = NULL; +char *xml = NULL; +virHostdevManagerPtr hostdev_mgr; + +xml = virNodeDeviceGetXMLDesc(dev, 0); +if (!xml) +goto cleanup; + +def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE, NULL); +if (!def) +goto cleanup; + +if (virNodeDeviceReAttachEnsureACL(dev-conn, def) 0) +goto cleanup; + +if (qemuNodeDeviceGetPciInfo(def, domain, bus, slot, function) 0) +goto cleanup; + +pci = virPCIDeviceNew(domain, bus, slot, function); +if (!pci) +goto cleanup; + +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +goto cleanup_pci; + +ret = virHostdevPciNodeDeviceReAttach(hostdev_mgr, pci); + cleanup_pci: virPCIDeviceFree(pci); cleanup: -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 31/49] extract general code from qemuDomainReAttachHostUsbDevices
Extract general code from qemuDomainReAttachHostUsbDevices to virHostdevDomainReAttachHostUsbDevices. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 32 1 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index add887f..64372a3 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -342,20 +342,13 @@ out: virObjectUnref(cfg); } - -void -qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, - const char *name, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs) +static void +virHostdevReAttachUsbHostdevs(virHostdevManagerPtr hostdev_mgr, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) { size_t i; -virHostdevManagerPtr hostdev_mgr; - -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) -return; - virObjectLock(hostdev_mgr-activeUsbHostdevs); for (i = 0; i nhostdevs; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; @@ -413,6 +406,21 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virObjectUnlock(hostdev_mgr-activeUsbHostdevs); } +void +qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) +{ +virHostdevManagerPtr hostdev_mgr; + +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +return; + +virHostdevReAttachUsbHostdevs(hostdev_mgr, name, hostdevs, nhostdevs); +} + void qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 23/49] qemuPrepareUSBDevices: code adjustment for extracting general code
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 10 ++ 1 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 5771f41..e39bc47 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -402,9 +402,14 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virUSBDevicePtr tmp; virDomainHostdevDefPtr *hostdevs = def-hostdevs; int nhostdevs = def-nhostdevs; +const char *dom_name = def-name; virHostdevManagerPtr hostdev_mgr; bool coldBoot = !!(flags VIR_COLD_BOOT); +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +return -1; + /* To prevent situation where USB device is assigned to two domains * we need to keep a list of currently assigned USB devices. * This is done in several loops which cannot be joined into one big @@ -443,10 +448,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, * and add them do driver list. However, if something goes * wrong, perform rollback. */ -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) -goto cleanup; -if (qemuPrepareHostdevUSBDevices(hostdev_mgr, def-name, list) 0) +if (qemuPrepareHostdevUSBDevices(hostdev_mgr, dom_name, list) 0) goto cleanup; /* Loop 2: Temporary list was successfully merged with -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 41/49] improve parameter name to let it more meaningful
Signed-off-by: Chunyan Liu cy...@suse.com --- src/util/virhostdev.c | 38 -- src/util/virhostdev.h | 10 +- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index e3b818e..9cd11d4 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -429,7 +429,7 @@ virHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, int virHostdevPreparePCIDevices(virHostdevManagerPtr hostdev_mgr, const char *drv_name, -const char *name, +const char *dom_name, const unsigned char *uuid, virDomainHostdevDefPtr *hostdevs, int nhostdevs, @@ -550,7 +550,7 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr hostdev_mgr, activeDev = virPCIDeviceListFind(hostdev_mgr-activePciHostdevs, dev); if (activeDev) -virPCIDeviceSetUsedBy(activeDev, drv_name, name); +virPCIDeviceSetUsedBy(activeDev, drv_name, dom_name); } /* Loop 8: Now set the original states for hostdev def */ @@ -667,7 +667,7 @@ qemuReattachPciDevice(virPCIDevicePtr dev, virHostdevManagerPtr mgr) void virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, const char *drv_name, - const char *name, + const char *dom_name, virDomainHostdevDefPtr *hostdevs, int nhostdevs, char *oldStateDir) @@ -706,7 +706,7 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, const char *usedby_domname; virPCIDeviceGetUsedBy(activeDev, usedby_drvname, usedby_domname); if (STRNEQ_NULLABLE(drv_name, usedby_drvname) || -STRNEQ_NULLABLE(name, usedby_domname)) { +STRNEQ_NULLABLE(dom_name, usedby_domname)) { virPCIDeviceListDel(pcidevs, dev); continue; } @@ -906,7 +906,7 @@ cleanup: static int virHostdevMarkUsbHostdevs(virHostdevManagerPtr mgr, const char *drv_name, - const char *name, + const char *dom_name, virUSBDeviceListPtr list) { size_t i, j; @@ -936,9 +936,10 @@ virHostdevMarkUsbHostdevs(virHostdevManagerPtr mgr, goto error; } -virUSBDeviceSetUsedBy(usb, drv_name, name); +virUSBDeviceSetUsedBy(usb, drv_name, dom_name); VIR_DEBUG(Adding %03d.%03d dom=%s to activeUsbHostdevs, - virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name); + virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), + dom_name); /* * The caller is responsible to steal these usb devices * from the virUSBDeviceList that passed in on success, @@ -1122,7 +1123,7 @@ cleanup: int virHostdevPrepareSCSIDevices(virHostdevManagerPtr hostdev_mgr, const char *drv_name, - const char *name, + const char *dom_name, virDomainHostdevDefPtr *hostdevs, int nhostdevs) { @@ -1192,10 +1193,10 @@ virHostdevPrepareSCSIDevices(virHostdevManagerPtr hostdev_mgr, goto error; } -if (virSCSIDeviceSetUsedBy(tmp, drv_name, name) 0) +if (virSCSIDeviceSetUsedBy(tmp, drv_name, dom_name) 0) goto error; } else { -if (virSCSIDeviceSetUsedBy(scsi, drv_name, name) 0) +if (virSCSIDeviceSetUsedBy(scsi, drv_name, dom_name) 0) goto error; VIR_DEBUG(Adding %s to activeScsiHostdevs, virSCSIDeviceGetName(scsi)); @@ -1234,7 +1235,7 @@ cleanup: void virHostdevReAttachUsbHostdevs(virHostdevManagerPtr hostdev_mgr, const char *drv_name, - const char *name, + const char *dom_name, virDomainHostdevDefPtr *hostdevs, int nhostdevs) { @@ -1261,7 +1262,7 @@ virHostdevReAttachUsbHostdevs(virHostdevManagerPtr hostdev_mgr, VIR_WARN(Unable to reattach USB device %03d.%03d on domain %s, hostdev-source.subsys.u.usb.bus, hostdev-source.subsys.u.usb.device, - name); + dom_name); continue; } @@ -1284,11 +1285,11 @@ virHostdevReAttachUsbHostdevs(virHostdevManagerPtr hostdev_mgr, virUSBDeviceGetUsedBy(tmp, usedby_drvname, usedby_domname); if (STREQ_NULLABLE(drv_name, usedby_drvname
[libvirt] [PATCH v13 39/49] extract general code of NodeDeviceReset
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_driver.c | 29 - 1 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1b81689..44ac556 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11400,6 +11400,25 @@ cleanup: } static int +virHostdevPciNodeDeviceReset(virHostdevManagerPtr hostdev_mgr, + virPCIDevicePtr pci) +{ +int ret = -1; +virObjectLock(hostdev_mgr-activePciHostdevs); +virObjectLock(hostdev_mgr-inactivePciHostdevs); +if (virPCIDeviceReset(pci, hostdev_mgr-activePciHostdevs, + hostdev_mgr-inactivePciHostdevs) 0) +goto out; + +ret = 0; +out: +virObjectUnlock(hostdev_mgr-inactivePciHostdevs); +virObjectUnlock(hostdev_mgr-activePciHostdevs); +return ret; +} + + +static int qemuNodeDeviceReset(virNodeDevicePtr dev) { virPCIDevicePtr pci; @@ -11430,16 +11449,8 @@ qemuNodeDeviceReset(virNodeDevicePtr dev) hostdev_mgr = virHostdevManagerGetDefault(); if (hostdev_mgr == NULL) goto cleanup_pci; -virObjectLock(hostdev_mgr-activePciHostdevs); -virObjectLock(hostdev_mgr-inactivePciHostdevs); -if (virPCIDeviceReset(pci, hostdev_mgr-activePciHostdevs, - hostdev_mgr-inactivePciHostdevs) 0) -goto out; +ret = virHostdevPciNodeDeviceReset(hostdev_mgr, pci); -ret = 0; -out: -virObjectUnlock(hostdev_mgr-inactivePciHostdevs); -virObjectUnlock(hostdev_mgr-activePciHostdevs); cleanup_pci: virPCIDeviceFree(pci); cleanup: -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 37/49] extract general code of NodeDeviceDetach
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_driver.c | 33 ++--- 1 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7d924b2..46d975e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11207,6 +11207,27 @@ out: } static int +virHostdevPciNodeDeviceDetach(virHostdevManagerPtr hostdev_mgr, + virPCIDevicePtr pci) +{ +int ret = -1; + +virObjectLock(hostdev_mgr-activePciHostdevs); +virObjectLock(hostdev_mgr-inactivePciHostdevs); + +if (virPCIDeviceDetach(pci, hostdev_mgr-activePciHostdevs, + hostdev_mgr-inactivePciHostdevs) 0) { +goto out; +} + +ret = 0; +out: +virObjectUnlock(hostdev_mgr-inactivePciHostdevs); +virObjectUnlock(hostdev_mgr-activePciHostdevs); +return ret; +} + +static int qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, const char *driverName, unsigned int flags) @@ -11280,18 +11301,8 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, hostdev_mgr = virHostdevManagerGetDefault(); if (hostdev_mgr == NULL) goto cleanup; -virObjectLock(hostdev_mgr-activePciHostdevs); -virObjectLock(hostdev_mgr-inactivePciHostdevs); -if (virPCIDeviceDetach(pci, hostdev_mgr-activePciHostdevs, - hostdev_mgr-inactivePciHostdevs) 0) { -goto out; -} - -ret = 0; -out: -virObjectUnlock(hostdev_mgr-inactivePciHostdevs); -virObjectUnlock(hostdev_mgr-activePciHostdevs); +ret = virHostdevPciNodeDeviceDetach(hostdev_mgr, pci); cleanup: virPCIDeviceFree(pci); virNodeDeviceDefFree(def); -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 34/49] extract general code from qemuDomainReAttachHostScsiDevices
Extract general code from qemuDomainReAttachHostScsiDevices to virHostdevDomainReAttachHostScsiDevices. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 48 ++ 1 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 6e65a02..66fb26a 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -358,31 +358,19 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, name, hostdevs, nhostdevs); } - -void -qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, - const char *name, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs) +static void +virHostdevReAttachScsiHostdevs(virHostdevManagerPtr hostdev_mgr, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) { size_t i; -virHostdevManagerPtr hostdev_mgr; - -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) -return; virObjectLock(hostdev_mgr-activeScsiHostdevs); for (i = 0; i nhostdevs; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; virSCSIDevicePtr scsi; virSCSIDevicePtr tmp; -virDomainDeviceDef dev; - -dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; -dev.data.hostdev = hostdev; - -ignore_value(qemuRemoveSharedDevice(driver, dev, name)); if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) @@ -432,6 +420,32 @@ qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, } void +qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) +{ +size_t i; +virHostdevManagerPtr hostdev_mgr; + +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +return; + +for (i = 0; i nhostdevs; i++) { +virDomainHostdevDefPtr hostdev = hostdevs[i]; +virDomainDeviceDef dev; + +dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; +dev.data.hostdev = hostdev; + +ignore_value(qemuRemoveSharedDevice(driver, dev, name)); +} + +virHostdevReAttachScsiHostdevs(hostdev_mgr, name, hostdevs, nhostdevs); +} + +void qemuDomainReAttachHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def) { -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 28/49] extract general code from qemuPrepareHostSCSIDevices
Extract general code from qemuPrepareHostSCSIDevices to virHostdevPrepareHostSCSIDevices. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c | 70 +++--- 1 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 2934e65..5eb12d1 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -263,34 +263,16 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, hostdevs, nhostdevs, flags); } - -int -qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, - const char *name, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs) +static int +virHostdevPrepareSCSIDevices(virHostdevManagerPtr hostdev_mgr, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) { size_t i, j; int count; virSCSIDeviceListPtr list; virSCSIDevicePtr tmp; -virHostdevManagerPtr hostdev_mgr; - -/* Loop 1: Add the shared scsi host device to shared device - * table. - */ -for (i = 0; i nhostdevs; i++) { -virDomainDeviceDef dev; - -dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; -dev.data.hostdev = hostdevs[i]; - -if (qemuAddSharedDevice(driver, dev, name) 0) -return -1; - -if (qemuSetUnprivSGIO(dev) 0) -return -1; -} /* To prevent situation where SCSI device is assigned to two domains * we need to keep a list of currently assigned SCSI devices. @@ -300,7 +282,7 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, if (!(list = virSCSIDeviceListNew())) goto cleanup; -/* Loop 2: build temporary list */ +/* Loop 1: build temporary list */ for (i = 0; i nhostdevs; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; virSCSIDevicePtr scsi; @@ -330,13 +312,10 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, } } -/* Loop 3: Mark devices in temporary list as used by @name +/* Loop 2: Mark devices in temporary list as used by @name * and add them to driver list. However, if something goes * wrong, perform rollback. */ -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) -goto cleanup; virObjectLock(hostdev_mgr-activeScsiHostdevs); count = virSCSIDeviceListCount(list); @@ -371,7 +350,7 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, virObjectUnlock(hostdev_mgr-activeScsiHostdevs); -/* Loop 4: Temporary list was successfully merged with +/* Loop 3: Temporary list was successfully merged with * driver list, so steal all items to avoid freeing them * when freeing temporary list. */ @@ -392,6 +371,39 @@ error: cleanup: virObjectUnref(list); return -1; + +} + +int +qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) +{ +size_t i; +virHostdevManagerPtr hostdev_mgr; + +hostdev_mgr = virHostdevManagerGetDefault(); +if (hostdev_mgr == NULL) +return -1; + +/* Loop 1: Add the shared scsi host device to shared device + * table. + */ +for (i = 0; i nhostdevs; i++) { +virDomainDeviceDef dev; + +dev.type = VIR_DOMAIN_DEVICE_HOSTDEV; +dev.data.hostdev = hostdevs[i]; + +if (qemuAddSharedDevice(driver, dev, name) 0) +return -1; + +if (qemuSetUnprivSGIO(dev) 0) +return -1; +} + +return virHostdevPrepareSCSIDevices(hostdev_mgr, name, hostdevs, nhostdevs); } -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 26/49] pass driver name to virHostdevPrepareUSBDevices
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |8 +--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 15ed47c..a7e6c91 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -248,6 +248,7 @@ out: static int virHostdevMarkUsbHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, const char *name, virUSBDeviceListPtr list) { @@ -278,7 +279,7 @@ virHostdevMarkUsbHostdevs(virHostdevManagerPtr mgr, goto error; } -virUSBDeviceSetUsedBy(usb, QEMU_DRIVER_NAME, name); +virUSBDeviceSetUsedBy(usb, drv_name, name); VIR_DEBUG(Adding %03d.%03d dom=%s to activeUsbHostdevs, virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name); /* @@ -392,6 +393,7 @@ out: static int virHostdevPrepareUSBDevices(virHostdevManagerPtr hostdev_mgr, +const char *drv_name, const char *dom_name, virDomainHostdevDefPtr *hostdevs, int nhostdevs, @@ -441,7 +443,7 @@ virHostdevPrepareUSBDevices(virHostdevManagerPtr hostdev_mgr, * and add them do driver list. However, if something goes * wrong, perform rollback. */ -if (virHostdevMarkUsbHostdevs(hostdev_mgr, dom_name, list) 0) +if (virHostdevMarkUsbHostdevs(hostdev_mgr, drv_name, dom_name, list) 0) goto cleanup; /* Loop 2: Temporary list was successfully merged with @@ -474,7 +476,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, if (hostdev_mgr == NULL) return -1; -return virHostdevPrepareUSBDevices(hostdev_mgr, dom_name, +return virHostdevPrepareUSBDevices(hostdev_mgr, QEMU_DRIVER_NAME, dom_name, hostdevs, nhostdevs, flags); } -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 43/49] improve virHostdevUpdate* parameters to make it more widely used
Changes parameter from vm def to specific hostdevs info and name info, so that it could be used more widely, e.g, could be used without full vm def info. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |9 ++--- src/util/virhostdev.c | 35 --- src/util/virhostdev.h | 12 +--- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 8b67b88..56afe0a 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -53,7 +53,8 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, if (mgr == NULL) return -1; -return virHostdevUpdateActivePciHostdevs(mgr, QEMU_DRIVER_NAME, def); +return virHostdevUpdateActivePciHostdevs(mgr, def-hostdevs, def-nhostdevs, + QEMU_DRIVER_NAME, def-name); } int @@ -68,7 +69,8 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, if (mgr == NULL) return -1; -return virHostdevUpdateActiveUsbHostdevs(mgr, QEMU_DRIVER_NAME, def); +return virHostdevUpdateActiveUsbHostdevs(mgr, def-hostdevs, def-nhostdevs, + QEMU_DRIVER_NAME, def-name); } int @@ -83,7 +85,8 @@ qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, if (mgr == NULL) return -1; -return virHostdevUpdateActiveScsiHostdevs(mgr, QEMU_DRIVER_NAME, def); +return virHostdevUpdateActiveScsiHostdevs(mgr, def-hostdevs, def-nhostdevs, + QEMU_DRIVER_NAME, def-name); } bool diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index 1ee44cf..3160bb6 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -753,9 +753,10 @@ cleanup: int virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs, const char *drv_name, - virDomainDefPtr def) - + const char *dom_name) { virDomainHostdevDefPtr hostdev = NULL; virPCIDevicePtr dev = NULL; @@ -765,8 +766,8 @@ virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, virObjectLock(mgr-activePciHostdevs); virObjectLock(mgr-inactivePciHostdevs); -for (i = 0; i def-nhostdevs; i++) { -hostdev = def-hostdevs[i]; +for (i = 0; i nhostdevs; i++) { +hostdev = hostdevs[i]; if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; @@ -791,7 +792,7 @@ virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, goto cleanup; } -virPCIDeviceSetUsedBy(dev, drv_name, def-name); +virPCIDeviceSetUsedBy(dev, drv_name, dom_name); /* Setup the original states for the PCI device */ virPCIDeviceSetUnbindFromStub(dev, hostdev-origstates.states.pci.unbind_from_stub); @@ -813,17 +814,19 @@ cleanup: int virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs, const char *drv_name, - virDomainDefPtr def) + const char *dom_name) { virDomainHostdevDefPtr hostdev = NULL; size_t i; int ret = -1; virObjectLock(mgr-activeUsbHostdevs); -for (i = 0; i def-nhostdevs; i++) { +for (i = 0; i nhostdevs; i++) { virUSBDevicePtr usb = NULL; -hostdev = def-hostdevs[i]; +hostdev = hostdevs[i]; if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; @@ -837,11 +840,11 @@ virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr, VIR_WARN(Unable to reattach USB device %03d.%03d on domain %s, hostdev-source.subsys.u.usb.bus, hostdev-source.subsys.u.usb.device, - def-name); + dom_name); continue; } -virUSBDeviceSetUsedBy(usb, drv_name, def-name); +virUSBDeviceSetUsedBy(usb, drv_name, dom_name); if (virUSBDeviceListAdd(mgr-activeUsbHostdevs, usb) 0) { virUSBDeviceFree(usb); @@ -856,8 +859,10 @@ cleanup: int virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs, const char *drv_name, - virDomainDefPtr def) + const char *dom_name) { virDomainHostdevDefPtr hostdev = NULL; size_t i; @@ -866,8 +871,8 @@ virHostdevUpdateActiveScsiHostdevs
[libvirt] [PATCH v13 30/49] move virHostdevPrepareHostSCSIDevices to virhostdev.c
Signed-off-by: Chunyan Liu cy...@suse.com --- src/libvirt_private.syms |1 + src/qemu/qemu_hostdev.c | 112 -- src/util/virhostdev.c| 112 ++ src/util/virhostdev.h|6 +++ 4 files changed, 119 insertions(+), 112 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 01f6c81..fd92467 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1294,6 +1294,7 @@ virHookPresent; #util/virhostdev.h virHostdevManagerGetDefault; virHostdevPreparePCIDevices; +virHostdevPrepareSCSIDevices; virHostdevPrepareUSBDevices; virHostdevReAttachPCIDevices; virHostdevUpdateActivePciHostdevs; diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index a7b4e74..add887f 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -263,118 +263,6 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, hostdevs, nhostdevs, flags); } -static int -virHostdevPrepareSCSIDevices(virHostdevManagerPtr hostdev_mgr, - const char *drv_name, - const char *name, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs) -{ -size_t i, j; -int count; -virSCSIDeviceListPtr list; -virSCSIDevicePtr tmp; - -/* To prevent situation where SCSI device is assigned to two domains - * we need to keep a list of currently assigned SCSI devices. - * This is done in several loops which cannot be joined into one big - * loop. See qemuPrepareHostdevPCIDevices() - */ -if (!(list = virSCSIDeviceListNew())) -goto cleanup; - -/* Loop 1: build temporary list */ -for (i = 0; i nhostdevs; i++) { -virDomainHostdevDefPtr hostdev = hostdevs[i]; -virSCSIDevicePtr scsi; - -if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || -hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) -continue; - -if (hostdev-managed) { -virReportError(VIR_ERR_XML_ERROR, %s, - _(SCSI host device doesn't support managed mode)); -goto cleanup; -} - -if (!(scsi = virSCSIDeviceNew(NULL, - hostdev-source.subsys.u.scsi.adapter, - hostdev-source.subsys.u.scsi.bus, - hostdev-source.subsys.u.scsi.target, - hostdev-source.subsys.u.scsi.unit, - hostdev-readonly, - hostdev-shareable))) -goto cleanup; - -if (scsi virSCSIDeviceListAdd(list, scsi) 0) { -virSCSIDeviceFree(scsi); -goto cleanup; -} -} - -/* Loop 2: Mark devices in temporary list as used by @name - * and add them to driver list. However, if something goes - * wrong, perform rollback. - */ -virObjectLock(hostdev_mgr-activeScsiHostdevs); -count = virSCSIDeviceListCount(list); - -for (i = 0; i count; i++) { -virSCSIDevicePtr scsi = virSCSIDeviceListGet(list, i); -if ((tmp = virSCSIDeviceListFind(hostdev_mgr-activeScsiHostdevs, - scsi))) { -bool scsi_shareable = virSCSIDeviceGetShareable(scsi); -bool tmp_shareable = virSCSIDeviceGetShareable(tmp); - -if (!(scsi_shareable tmp_shareable)) { -virReportError(VIR_ERR_OPERATION_INVALID, - _(SCSI device %s is already in use by - other domain(s) as '%s'), - virSCSIDeviceGetName(tmp), - tmp_shareable ? shareable : non-shareable); -goto error; -} - -if (virSCSIDeviceSetUsedBy(tmp, drv_name, name) 0) -goto error; -} else { -if (virSCSIDeviceSetUsedBy(scsi, drv_name, name) 0) -goto error; - -VIR_DEBUG(Adding %s to activeScsiHostdevs, virSCSIDeviceGetName(scsi)); - -if (virSCSIDeviceListAdd(hostdev_mgr-activeScsiHostdevs, scsi) 0) -goto error; -} -} - -virObjectUnlock(hostdev_mgr-activeScsiHostdevs); - -/* Loop 3: Temporary list was successfully merged with - * driver list, so steal all items to avoid freeing them - * when freeing temporary list. - */ -while (virSCSIDeviceListCount(list) 0) { -tmp = virSCSIDeviceListGet(list, 0); -virSCSIDeviceListSteal(list, tmp); -} - -virObjectUnref(list); -return 0; - -error: -for (j = 0; j i; j++) { -tmp = virSCSIDeviceListGet(list, i); -virSCSIDeviceListSteal(hostdev_mgr-activeScsiHostdevs, tmp
[libvirt] [PATCH v13 35/49] pass driver name as parameter to virHostdevReAttachScciHostdevs
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |6 -- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 66fb26a..7ef9b1b 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -360,6 +360,7 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, static void virHostdevReAttachScsiHostdevs(virHostdevManagerPtr hostdev_mgr, + const char *drv_name, const char *name, virDomainHostdevDefPtr *hostdevs, int nhostdevs) @@ -413,7 +414,7 @@ virHostdevReAttachScsiHostdevs(virHostdevManagerPtr hostdev_mgr, hostdev-source.subsys.u.scsi.unit, name); -virSCSIDeviceListDel(hostdev_mgr-activeScsiHostdevs, tmp, QEMU_DRIVER_NAME, name); +virSCSIDeviceListDel(hostdev_mgr-activeScsiHostdevs, tmp, drv_name, name); virSCSIDeviceFree(scsi); } virObjectUnlock(hostdev_mgr-activeScsiHostdevs); @@ -442,7 +443,8 @@ qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, ignore_value(qemuRemoveSharedDevice(driver, dev, name)); } -virHostdevReAttachScsiHostdevs(hostdev_mgr, name, hostdevs, nhostdevs); +virHostdevReAttachScsiHostdevs(hostdev_mgr, QEMU_DRIVER_NAME, + name, hostdevs, nhostdevs); } void -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 36/49] move virHostdevReAttachHostScsiDevices to virhostdev.c
Signed-off-by: Chunyan Liu cy...@suse.com --- src/libvirt_private.syms |1 + src/qemu/qemu_hostdev.c | 62 -- src/util/virhostdev.c| 62 ++ src/util/virhostdev.h|6 4 files changed, 69 insertions(+), 62 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 7da32a0..d657982 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1297,6 +1297,7 @@ virHostdevPreparePCIDevices; virHostdevPrepareSCSIDevices; virHostdevPrepareUSBDevices; virHostdevReAttachPCIDevices; +virHostdevReAttachScsiHostdevs; virHostdevReAttachUsbHostdevs; virHostdevUpdateActivePciHostdevs; virHostdevUpdateActiveScsiHostdevs; diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 7ef9b1b..b8d914a 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -358,68 +358,6 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, name, hostdevs, nhostdevs); } -static void -virHostdevReAttachScsiHostdevs(virHostdevManagerPtr hostdev_mgr, - const char *drv_name, - const char *name, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs) -{ -size_t i; - -virObjectLock(hostdev_mgr-activeScsiHostdevs); -for (i = 0; i nhostdevs; i++) { -virDomainHostdevDefPtr hostdev = hostdevs[i]; -virSCSIDevicePtr scsi; -virSCSIDevicePtr tmp; - -if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || -hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) -continue; - -if (!(scsi = virSCSIDeviceNew(NULL, - hostdev-source.subsys.u.scsi.adapter, - hostdev-source.subsys.u.scsi.bus, - hostdev-source.subsys.u.scsi.target, - hostdev-source.subsys.u.scsi.unit, - hostdev-readonly, - hostdev-shareable))) { -VIR_WARN(Unable to reattach SCSI device %s:%d:%d:%d on domain %s, - hostdev-source.subsys.u.scsi.adapter, - hostdev-source.subsys.u.scsi.bus, - hostdev-source.subsys.u.scsi.target, - hostdev-source.subsys.u.scsi.unit, - name); -continue; -} - -/* Only delete the devices which are marked as being used by @name, - * because qemuProcessStart could fail on the half way. */ - -if (!(tmp = virSCSIDeviceListFind(hostdev_mgr-activeScsiHostdevs, scsi))) { -VIR_WARN(Unable to find device %s:%d:%d:%d - in list of active SCSI devices, - hostdev-source.subsys.u.scsi.adapter, - hostdev-source.subsys.u.scsi.bus, - hostdev-source.subsys.u.scsi.target, - hostdev-source.subsys.u.scsi.unit); -virSCSIDeviceFree(scsi); -continue; -} - -VIR_DEBUG(Removing %s:%d:%d:%d dom=%s from activeScsiHostdevs, - hostdev-source.subsys.u.scsi.adapter, - hostdev-source.subsys.u.scsi.bus, - hostdev-source.subsys.u.scsi.target, - hostdev-source.subsys.u.scsi.unit, - name); - -virSCSIDeviceListDel(hostdev_mgr-activeScsiHostdevs, tmp, drv_name, name); -virSCSIDeviceFree(scsi); -} -virObjectUnlock(hostdev_mgr-activeScsiHostdevs); -} - void qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, const char *name, diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index 03962d3..83d9916 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -1295,3 +1295,65 @@ virHostdevReAttachUsbHostdevs(virHostdevManagerPtr hostdev_mgr, } virObjectUnlock(hostdev_mgr-activeUsbHostdevs); } + +void +virHostdevReAttachScsiHostdevs(virHostdevManagerPtr hostdev_mgr, + const char *drv_name, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) +{ +size_t i; + +virObjectLock(hostdev_mgr-activeScsiHostdevs); +for (i = 0; i nhostdevs; i++) { +virDomainHostdevDefPtr hostdev = hostdevs[i]; +virSCSIDevicePtr scsi; +virSCSIDevicePtr tmp; + +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || +hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) +continue; + +if (!(scsi = virSCSIDeviceNew(NULL, + hostdev
[libvirt] [PATCH v13 32/49] pass driver name as paramter to virHostdevReAttachUsbHostdevs
Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |6 -- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 64372a3..2c92c2b 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -344,6 +344,7 @@ out: static void virHostdevReAttachUsbHostdevs(virHostdevManagerPtr hostdev_mgr, + const char *drv_name, const char *name, virDomainHostdevDefPtr *hostdevs, int nhostdevs) @@ -393,7 +394,7 @@ virHostdevReAttachUsbHostdevs(virHostdevManagerPtr hostdev_mgr, } virUSBDeviceGetUsedBy(tmp, usedby_drvname, usedby_domname); -if (STREQ_NULLABLE(QEMU_DRIVER_NAME, usedby_drvname) +if (STREQ_NULLABLE(drv_name, usedby_drvname) STREQ_NULLABLE(name, usedby_domname)) { VIR_DEBUG(Removing %03d.%03d dom=%s from activeUsbHostdevs, hostdev-source.subsys.u.usb.bus, @@ -418,7 +419,8 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, if (hostdev_mgr == NULL) return; -virHostdevReAttachUsbHostdevs(hostdev_mgr, name, hostdevs, nhostdevs); +virHostdevReAttachUsbHostdevs(hostdev_mgr, QEMU_DRIVER_NAME, + name, hostdevs, nhostdevs); } -- 1.6.0.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v13 47/49] change lxc_hostdev.c to use virhostdev common library APIs
Signed-off-by: Chunyan Liu cy...@suse.com --- src/lxc/lxc_hostdev.c | 320 +++-- 1 files changed, 16 insertions(+), 304 deletions(-) diff --git a/src/lxc/lxc_hostdev.c b/src/lxc/lxc_hostdev.c index 8398646..3d9cc04 100644 --- a/src/lxc/lxc_hostdev.c +++ b/src/lxc/lxc_hostdev.c @@ -35,269 +35,36 @@ int virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefPtr def) { -virDomainHostdevDefPtr hostdev = NULL; -size_t i; -virHostdevManagerPtr hostdev_mgr; +virHostdevManagerPtr mgr; if (!def-nhostdevs) return 0; - -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) +mgr = virHostdevManagerGetDefault(); +if (mgr == NULL) return -1; -for (i = 0; i def-nhostdevs; i++) { -virUSBDevicePtr usb = NULL; -hostdev = def-hostdevs[i]; - -if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) -continue; -if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) -continue; - -usb = virUSBDeviceNew(hostdev-source.subsys.u.usb.bus, - hostdev-source.subsys.u.usb.device, - NULL); -if (!usb) { -VIR_WARN(Unable to reattach USB device %03d.%03d on domain %s, - hostdev-source.subsys.u.usb.bus, - hostdev-source.subsys.u.usb.device, - def-name); -continue; -} - -virUSBDeviceSetUsedBy(usb, LXC_DRIVER_NAME, def-name); - -virObjectLock(hostdev_mgr-activeUsbHostdevs); -if (virUSBDeviceListAdd(hostdev_mgr-activeUsbHostdevs, usb) 0) { -virObjectUnlock(hostdev_mgr-activeUsbHostdevs); -virUSBDeviceFree(usb); -return -1; -} -virObjectUnlock(hostdev_mgr-activeUsbHostdevs); -} - -return 0; -} - - -int -virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver ATTRIBUTE_UNUSED, - const char *name, - virUSBDeviceList *list) -{ -size_t i, j; -unsigned int count; -virUSBDevicePtr tmp; -virHostdevManagerPtr hostdev_mgr; - -count = virUSBDeviceListCount(list); - -hostdev_mgr = virHostdevManagerGetDefault(); -if (hostdev_mgr == NULL) -return -1; -virObjectLock(hostdev_mgr-activeUsbHostdevs); -for (i = 0; i count; i++) { -virUSBDevicePtr usb = virUSBDeviceListGet(list, i); -if ((tmp = virUSBDeviceListFind(hostdev_mgr-activeUsbHostdevs, usb))) { -const char *other_drvname; -const char *other_domname; - -virUSBDeviceGetUsedBy(tmp, other_drvname, other_domname); -if (other_drvname other_domname) -virReportError(VIR_ERR_OPERATION_INVALID, - _(USB device %s is in use by - driver %s, domain %s), - virUSBDeviceGetName(tmp), - other_drvname, other_domname); -else -virReportError(VIR_ERR_OPERATION_INVALID, - _(USB device %s is already in use), - virUSBDeviceGetName(tmp)); -goto error; -} - -virUSBDeviceSetUsedBy(usb, LXC_DRIVER_NAME, name); -VIR_DEBUG(Adding %03d.%03d dom=%s to activeUsbHostdevs, - virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name); -/* - * The caller is responsible to steal these usb devices - * from the virUSBDeviceList that passed in on success, - * perform rollback on failure. - */ -if (virUSBDeviceListAdd(hostdev_mgr-activeUsbHostdevs, usb) 0) -goto error; -} -virObjectUnlock(hostdev_mgr-activeUsbHostdevs); -return 0; - -error: -for (j = 0; j i; j++) { -tmp = virUSBDeviceListGet(list, i); -virUSBDeviceListSteal(hostdev_mgr-activeUsbHostdevs, tmp); -} -virObjectUnlock(hostdev_mgr-activeUsbHostdevs); -return -1; -} - -int -virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, - bool mandatory, - virUSBDevicePtr *usb) -{ -unsigned vendor = hostdev-source.subsys.u.usb.vendor; -unsigned product = hostdev-source.subsys.u.usb.product; -unsigned bus = hostdev-source.subsys.u.usb.bus; -unsigned device = hostdev-source.subsys.u.usb.device; -bool autoAddress = hostdev-source.subsys.u.usb.autoAddress; -int rc; - -*usb = NULL; - -if (vendor bus) { -rc = virUSBDeviceFind(vendor, product, bus, device, - NULL, - autoAddress ? false : mandatory, - usb); -if (rc 0) { -return -1; -} else
[libvirt] [PATCH v13 33/49] move virHostdevDomainReAttachHostUsbDevices to virhostdev.c
Signed-off-by: Chunyan Liu cy...@suse.com --- src/libvirt_private.syms |1 + src/qemu/qemu_hostdev.c | 65 -- src/util/virhostdev.c| 65 ++ src/util/virhostdev.h|6 4 files changed, 72 insertions(+), 65 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fd92467..7da32a0 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1297,6 +1297,7 @@ virHostdevPreparePCIDevices; virHostdevPrepareSCSIDevices; virHostdevPrepareUSBDevices; virHostdevReAttachPCIDevices; +virHostdevReAttachUsbHostdevs; virHostdevUpdateActivePciHostdevs; virHostdevUpdateActiveScsiHostdevs; virHostdevUpdateActiveUsbHostdevs; diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 2c92c2b..6e65a02 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -342,71 +342,6 @@ out: virObjectUnref(cfg); } -static void -virHostdevReAttachUsbHostdevs(virHostdevManagerPtr hostdev_mgr, - const char *drv_name, - const char *name, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs) -{ -size_t i; -virObjectLock(hostdev_mgr-activeUsbHostdevs); -for (i = 0; i nhostdevs; i++) { -virDomainHostdevDefPtr hostdev = hostdevs[i]; -virUSBDevicePtr usb, tmp; -const char *usedby_drvname; -const char *usedby_domname; - -if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) -continue; -if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) -continue; -if (hostdev-missing) -continue; - -usb = virUSBDeviceNew(hostdev-source.subsys.u.usb.bus, - hostdev-source.subsys.u.usb.device, - NULL); - -if (!usb) { -VIR_WARN(Unable to reattach USB device %03d.%03d on domain %s, - hostdev-source.subsys.u.usb.bus, - hostdev-source.subsys.u.usb.device, - name); -continue; -} - -/* Delete only those USB devices which belongs - * to domain @name because qemuProcessStart() might - * have failed because USB device is already taken. - * Therefore we want to steal only those devices from - * the list which were taken by @name */ - -tmp = virUSBDeviceListFind(hostdev_mgr-activeUsbHostdevs, usb); -virUSBDeviceFree(usb); - -if (!tmp) { -VIR_WARN(Unable to find device %03d.%03d - in list of active USB devices, - hostdev-source.subsys.u.usb.bus, - hostdev-source.subsys.u.usb.device); -continue; -} - -virUSBDeviceGetUsedBy(tmp, usedby_drvname, usedby_domname); -if (STREQ_NULLABLE(drv_name, usedby_drvname) -STREQ_NULLABLE(name, usedby_domname)) { -VIR_DEBUG(Removing %03d.%03d dom=%s from activeUsbHostdevs, - hostdev-source.subsys.u.usb.bus, - hostdev-source.subsys.u.usb.device, - name); - -virUSBDeviceListDel(hostdev_mgr-activeUsbHostdevs, tmp); -} -} -virObjectUnlock(hostdev_mgr-activeUsbHostdevs); -} - void qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, const char *name, diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index 5d1bb64..03962d3 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -1230,3 +1230,68 @@ cleanup: return -1; } + +void +virHostdevReAttachUsbHostdevs(virHostdevManagerPtr hostdev_mgr, + const char *drv_name, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs) +{ +size_t i; +virObjectLock(hostdev_mgr-activeUsbHostdevs); +for (i = 0; i nhostdevs; i++) { +virDomainHostdevDefPtr hostdev = hostdevs[i]; +virUSBDevicePtr usb, tmp; +const char *usedby_drvname; +const char *usedby_domname; + +if (hostdev-mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +continue; +if (hostdev-source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) +continue; +if (hostdev-missing) +continue; + +usb = virUSBDeviceNew(hostdev-source.subsys.u.usb.bus, + hostdev-source.subsys.u.usb.device, + NULL); + +if (!usb) { +VIR_WARN(Unable to reattach USB device %03d.%03d on domain %s, + hostdev-source.subsys.u.usb.bus, + hostdev-source.subsys.u.usb.device, + name