[libvirt] [PATCH] Add migration APIs for libxl driver

2012-03-01 Thread Chunyan Liu
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

2012-03-06 Thread Chunyan Liu
 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

2012-03-09 Thread Chunyan Liu
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-03-15 Thread Chunyan Liu
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-03-26 Thread Chunyan Liu
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

2013-03-14 Thread Chunyan Liu
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

2013-03-22 Thread Chunyan Liu
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-03-25 Thread Chunyan Liu
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-03-27 Thread Chunyan Liu
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-04-18 Thread Chunyan Liu
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

2013-05-05 Thread Chunyan Liu
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

2013-05-16 Thread Chunyan Liu
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

2013-05-16 Thread Chunyan Liu
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

2013-05-16 Thread Chunyan Liu
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

2013-05-16 Thread Chunyan Liu
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

2013-05-16 Thread Chunyan Liu
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

2013-05-16 Thread Chunyan Liu
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-05-17 Thread Chunyan Liu
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

2013-06-06 Thread Chunyan Liu
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

2013-06-06 Thread Chunyan Liu
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-08-16 Thread Chunyan Liu
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

2013-08-22 Thread Chunyan Liu
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

2013-09-11 Thread Chunyan Liu
[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

2013-09-11 Thread Chunyan Liu
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-09-11 Thread Chunyan Liu
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

2013-09-12 Thread Chunyan Liu
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

2013-09-12 Thread Chunyan Liu
[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

2013-09-12 Thread Chunyan Liu
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-09-12 Thread Chunyan Liu
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

2013-09-13 Thread Chunyan Liu
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

2013-09-13 Thread Chunyan Liu
---
 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

2013-12-24 Thread Chunyan Liu
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

2014-01-09 Thread Chunyan Liu
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

2014-01-09 Thread Chunyan Liu
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

2014-01-09 Thread Chunyan Liu
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

2014-01-09 Thread Chunyan Liu
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

2014-01-09 Thread Chunyan Liu
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

2014-01-16 Thread Chunyan Liu
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

2014-01-16 Thread Chunyan Liu
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

2014-01-16 Thread Chunyan Liu
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

2014-01-16 Thread Chunyan Liu
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

2014-01-16 Thread Chunyan Liu
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-01-23 Thread Chunyan Liu
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

2014-01-23 Thread Chunyan Liu
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

2014-01-23 Thread Chunyan Liu
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

2014-01-23 Thread Chunyan Liu
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

2014-01-23 Thread Chunyan Liu
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

2014-01-23 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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

2014-02-16 Thread Chunyan Liu
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-19 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu
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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

2014-02-28 Thread Chunyan Liu

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

  1   2   3   >