[libvirt] Schedule for upcoming release of 1.2.2

2014-02-16 Thread Daniel Veillard
  Since February ends up on the 28, I think it makes sense to
enter the freeze for 1.2.2 next week-end if we want to have
it by the end of the month, so please try to get features pushed
this week, well if you want them in the next release,

  thanks,

Daniel

-- 
Daniel Veillard  | Open Source and Standards, Red Hat
veill...@redhat.com  | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | virtualization library  http://libvirt.org/

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v6 1/6] conf: Add a keyboard input device type

2014-02-16 Thread Li Zhang

On 2014年02月14日 17:36, Ján Tomko wrote:

On 02/14/2014 10:02 AM, Li Zhang wrote:

On 2014年02月14日 00:39, Daniel P. Berrange wrote:

On Thu, Feb 13, 2014 at 04:48:21PM +0800, Li Zhang wrote:


@@ -12422,10 +12426,12 @@ virDomainDefParseXML(xmlDocPtr xml,
* XXX will this be true for other virt types ? */
   if ((STREQ(def-os.type, hvm) 
input-bus == VIR_DOMAIN_INPUT_BUS_PS2 
- input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE) ||
+ (input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
+  input-type == VIR_DOMAIN_INPUT_TYPE_KBD)) ||
   (STRNEQ(def-os.type, hvm) 
input-bus == VIR_DOMAIN_INPUT_BUS_XEN 
- input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE)) {
+ (input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
+  input-type == VIR_DOMAIN_INPUT_TYPE_KBD))) {
   virDomainInputDefFree(input);
   continue;

Later on in this function there is

  /* If graphics are enabled, there's an implicit PS2 mouse */
  if (def-ngraphics  0) {
  virDomainInputDefPtr input;

  if (VIR_ALLOC(input)  0) {
  goto error;
  }
  if (STREQ(def-os.type, hvm)) {
  input-type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
  input-bus = VIR_DOMAIN_INPUT_BUS_PS2;
  } else {
  input-type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
  input-bus = VIR_DOMAIN_INPUT_BUS_XEN;
  }

  if (VIR_REALLOC_N(def-inputs, def-ninputs + 1)  0) {
  virDomainInputDefFree(input);
  goto error;
  }
  def-inputs[def-ninputs] = input;
  def-ninputs++;
  }


which needs to take care of keyboards too now.

And some more similar logic in virDomainDefFormatInternal
which needs updating

I have add the keyboard device in this function in this version [3/6].

But Jan suggested to remove it from  virDomainDefFormatInternal in v5.
Because it would make the XML unreadable by older libvirtd that didn't know
the keyboard input type.


Sorry about that,

it seems we only care about XML to be readable by older libvirt if
virDomainDefFormat* is called with the
VIR_DOMAIN_XML_MIGRATABLE flag, so we can safely format it when this flag is
not set.


I see. I will add this device when this flag is not set.  :)



Jan



--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[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 as 

[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 @@ 

[libvirt] [PATCH v8 0/7] Support keyboard device

2014-02-16 Thread Li Zhang
From: Li Zhang zhlci...@linux.vnet.ibm.com

This patchset is to add keyboard input device.

For PPC64, it doesn't support a default keyboard device when the graphic
is enabled. Libvirt supports QEMU command line as -device VGA which
won't create any keyboard device for it. So it requires libvirt to add
a default USB keyboard device for it.

This patchset is to add keyboard input device and a default USB keyboard
for PPC64.

The related discussion in QEMU community:
http://lists.nongnu.org/archive/html/qemu-devel/2013-11/msg01734.html

Li Zhang (7):
  conf: Add a keyboard input device type
  conf: Add one interface to add default input devices
  conf: Remove the implicit PS2 mouse for non-X86 platforms and 
 add an implicit PS2 keyboard device for X86 platforms.
  qemu_cap: Add USB keyboard capability
  qemu: format qemu command line for USB keyboard
  xen: format xen command line for USB keyboard
  Add a default USB keyboard and USB mouse for PPC64

 v8 - v7:
   * Add USB keyboard output XML format when VIR_DOMAIN_XML_MIGRATABLE isn't 
set. (Daniel P.  Jan Tomko)
   * Fix test cases because of XML changes.

 v7 - v6:
   * Corret indention errors in code. (Jan Tomko)
   * Correct make check error in xen driver. (Jan Tomko)
   * Split 5/6 to 2 parts, qemu and xen. (Jan Tomko)
 v6 - v5:
   * Change kbd to keyboard, and correct -usbdevice parameter.
   * Remove implicit PS/2 keyboard output in XML in case
 older libvirtd can read it. (Jan Tomko)
   * Remove implicit keyboard for XEN to make it safer.

 v5 - v4:
   * Add PS/2 KBD definition in XML file. (Daniel.P.Berrange)
   * Allow PS/2 KBD devices and set KBD default bus as PS2 for X86, 
 USB for non-x86. (Daniel.P.Berrange)
   * Add an implicit PS/2 KBD as PS/2 mouse. (Danniel.P.Berrange)

 v4 - v3:
   * Don't remove PS2 mouse device for other virtualization drivers (Jan Tomko).

 v3 - v2:
   * Handle the KBD device type in xen and QEMU driver. (Daniel.P.Berrange)
   * Remove PS2 mouse device for non-X86 platforms.
   * Move virDomainDefMaybeAddInput to a new patch. (Jan Tomko)
   * Replace VIR_REALLOC_N with VIR_APPEND_ELEMENT. (Jan Tomoko)
   * Fix several typos. (Jan Tomoko)
   * Add a virReportError when QEMU_CAPS_DEVICE_USB_KBD can't be gotten. (Jan 
Tomoko)

 v2 - v1:
   * change ifs to switch clause.
   * reconstruct the patches

 docs/schemas/domaincommon.rng  |   1 +
 src/conf/domain_conf.c | 116 ++---
 src/conf/domain_conf.h |   5 +
 src/libvirt_private.syms   |   1 +
 src/qemu/qemu_capabilities.c   |   3 +
 src/qemu/qemu_capabilities.h   |   1 +
 src/qemu/qemu_command.c|  41 ++--
 src/qemu/qemu_domain.c |  23 +++-
 src/util/virarch.h |   2 +
 src/xenxs/xen_sxpr.c   |  27 +++--
 src/xenxs/xen_xm.c |  30 --
 tests/qemucapabilitiesdata/caps_1.2.2-1.caps   |   1 +
 tests/qemucapabilitiesdata/caps_1.3.1-1.caps   |   1 +
 tests/qemucapabilitiesdata/caps_1.4.2-1.caps   |   1 +
 tests/qemucapabilitiesdata/caps_1.5.3-1.caps   |   1 +
 tests/qemucapabilitiesdata/caps_1.6.0-1.caps   |   1 +
 tests/qemucapabilitiesdata/caps_1.6.50-1.caps  |   1 +
 tests/qemuhelptest.c   |   8 ++
 ...qemuhotplug-console-compat-2+console-virtio.xml |   1 +
 .../qemuxml2argv-console-compat-2.xml  |   1 +
 .../qemuxml2argv-graphics-listen-network.xml   |   1 +
 .../qemuxml2argv-graphics-listen-network2.xml  |   1 +
 .../qemuxml2argv-graphics-sdl-fullscreen.xml   |   1 +
 .../qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml |   1 +
 .../qemuxml2argv-graphics-spice-compression.xml|   1 +
 .../qemuxml2argv-graphics-spice-qxl-vga.xml|   1 +
 .../qemuxml2argv-graphics-spice-timeout.xml|   2 +
 .../qemuxml2argv-graphics-spice.xml|   1 +
 .../qemuxml2argv-graphics-vnc-policy.xml   |   1 +
 .../qemuxml2argv-graphics-vnc-sasl.xml |   1 +
 .../qemuxml2argv-graphics-vnc-socket.xml   |   1 +
 .../qemuxml2argv-graphics-vnc-tls.xml  |   1 +
 .../qemuxml2argv-graphics-vnc-websocket.xml|   1 +
 .../qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml |   1 +
 tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml  |   1 +
 .../qemuxml2argv-net-bandwidth.xml |   1 +
 tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml |   1 +
 .../qemuxml2argvdata/qemuxml2argv-pseries-disk.xml |   3 +-
 .../qemuxml2argv-pseries-usb-kbd.args  |   9 ++
 .../qemuxml2argv-pseries-usb-kbd.xml   |  19 
 .../qemuxml2argv-serial-spiceport.xml  |   1 +
 tests/qemuxml2argvtest.c   |   3 +
 .../qemuxml2xmlout-graphics-listen-network2.xml|   1 

[libvirt] [PATCH v8 2/7] conf: Add one interface to add default input devices

2014-02-16 Thread Li Zhang
From: Li Zhang zhlci...@linux.vnet.ibm.com

This patch is to add one new interface to add input devices.

Signed-off-by: Li Zhang zhlci...@linux.vnet.ibm.com
---
 src/conf/domain_conf.c   | 27 +++
 src/conf/domain_conf.h   |  4 
 src/libvirt_private.syms |  1 +
 3 files changed, 32 insertions(+)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 2c6233f..3301398 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11053,6 +11053,33 @@ virDomainDefMaybeAddController(virDomainDefPtr def,
 return 0;
 }
 
+int
+virDomainDefMaybeAddInput(virDomainDefPtr def,
+   int type,
+   int bus)
+{
+size_t i;
+virDomainInputDefPtr input;
+
+for (i = 0; i  def-ninputs; i++) {
+if (def-inputs[i]-type == type 
+def-inputs[i]-bus == bus)
+return 0;
+}
+
+if (VIR_ALLOC(input)  0)
+return -1;
+
+input-type = type;
+input-bus = bus;
+
+if (VIR_APPEND_ELEMENT(def-inputs, def-ninputs, input)  0) {
+VIR_FREE(input);
+return -1;
+}
+
+return 0;
+}
 
 /* Parse a memory element located at XPATH within CTXT, and store the
  * result into MEM.  If REQUIRED, then the value must exist;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 2dc259d..009df13 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2806,6 +2806,10 @@ virDomainDefMaybeAddController(virDomainDefPtr def,
int type,
int idx,
int model);
+int
+virDomainDefMaybeAddInput(virDomainDefPtr def,
+  int type,
+  int bus);
 
 char *virDomainDefGetDefaultEmulator(virDomainDefPtr def, virCapsPtr caps);
 
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 67d20ed..e560a21 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -165,6 +165,7 @@ virDomainDefGenSecurityLabelDef;
 virDomainDefGetDefaultEmulator;
 virDomainDefGetSecurityLabelDef;
 virDomainDefMaybeAddController;
+virDomainDefMaybeAddInput;
 virDomainDefNew;
 virDomainDefParseFile;
 virDomainDefParseNode;
-- 
1.8.2.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v8 6/7] xen: format xen command line for USB keyboard

2014-02-16 Thread Li Zhang
From: Li Zhang zhlci...@linux.vnet.ibm.com

This patch is to format xen command line for USB keyboard

Signed-off-by: Li Zhang zhlci...@linux.vnet.ibm.com
---
 src/xenxs/xen_sxpr.c | 27 +++
 src/xenxs/xen_xm.c   | 30 ++
 2 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c
index d514725..d366b1b 100644
--- a/src/xenxs/xen_sxpr.c
+++ b/src/xenxs/xen_sxpr.c
@@ -724,21 +724,23 @@ xenParseSxprUSB(virDomainDefPtr def,
 tmp = sexpr_node(node, usbdevice);
 if (tmp  *tmp) {
 if (STREQ(tmp, tablet) ||
-STREQ(tmp, mouse)) {
+STREQ(tmp, mouse) ||
+STREQ(tmp, keyboard)) {
 virDomainInputDefPtr input;
 if (VIR_ALLOC(input)  0)
 goto error;
 input-bus = VIR_DOMAIN_INPUT_BUS_USB;
 if (STREQ(tmp, tablet))
 input-type = VIR_DOMAIN_INPUT_TYPE_TABLET;
-else
+else if (STREQ(tmp, mouse))
 input-type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
+else
+input-type = VIR_DOMAIN_INPUT_TYPE_KBD;
 
-if (VIR_REALLOC_N(def-inputs, def-ninputs+1)  0) {
+if (VIR_APPEND_ELEMENT(def-inputs, def-ninputs, input)  
0) {
 VIR_FREE(input);
 goto error;
 }
-def-inputs[def-ninputs++] = input;
 } else {
 /* XXX Handle other non-input USB devices later */
 }
@@ -2144,15 +2146,24 @@ xenFormatSxprInput(virDomainInputDefPtr input,
 return 0;
 
 if (input-type != VIR_DOMAIN_INPUT_TYPE_MOUSE 
-input-type != VIR_DOMAIN_INPUT_TYPE_TABLET) {
+input-type != VIR_DOMAIN_INPUT_TYPE_TABLET 
+input-type != VIR_DOMAIN_INPUT_TYPE_KBD) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
_(unexpected input type %d), input-type);
 return -1;
 }
 
-virBufferAsprintf(buf, (usbdevice %s),
-  input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ?
-  mouse : tablet);
+switch (input-type) {
+case VIR_DOMAIN_INPUT_TYPE_MOUSE:
+virBufferAsprintf(buf, (usbdevice %s), mouse);
+break;
+case VIR_DOMAIN_INPUT_TYPE_TABLET:
+virBufferAsprintf(buf, (usbdevice %s), tablet);
+break;
+case VIR_DOMAIN_INPUT_TYPE_KBD:
+virBufferAsprintf(buf, (usbdevice %s), keyboard);
+break;
+}
 
 return 0;
 }
diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c
index 5e89876..3a57547 100644
--- a/src/xenxs/xen_xm.c
+++ b/src/xenxs/xen_xm.c
@@ -886,14 +886,18 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
 goto cleanup;
 if (str 
 (STREQ(str, tablet) ||
- STREQ(str, mouse))) {
+ STREQ(str, mouse) ||
+ STREQ(str, keyboard))) {
 virDomainInputDefPtr input;
 if (VIR_ALLOC(input)  0)
 goto cleanup;
 input-bus = VIR_DOMAIN_INPUT_BUS_USB;
-input-type = STREQ(str, tablet) ?
-VIR_DOMAIN_INPUT_TYPE_TABLET :
-VIR_DOMAIN_INPUT_TYPE_MOUSE;
+if (STREQ(str, mouse))
+input-type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
+else if (STREQ(str, tablet))
+input-type = VIR_DOMAIN_INPUT_TYPE_TABLET;
+else if (STREQ(str, keyboard))
+input-type = VIR_DOMAIN_INPUT_TYPE_KBD;
 if (VIR_ALLOC_N(def-inputs, 1)  0) {
 virDomainInputDefFree(input);
 goto cleanup;
@@ -1746,10 +1750,20 @@ virConfPtr xenFormatXM(virConnectPtr conn,
 if (def-inputs[i]-bus == VIR_DOMAIN_INPUT_BUS_USB) {
 if (xenXMConfigSetInt(conf, usb, 1)  0)
 goto cleanup;
-if (xenXMConfigSetString(conf, usbdevice,
- def-inputs[i]-type == 
VIR_DOMAIN_INPUT_TYPE_MOUSE ?
- mouse : tablet)  0)
-goto cleanup;
+switch (def-inputs[i]-type) {
+case VIR_DOMAIN_INPUT_TYPE_MOUSE:
+if (xenXMConfigSetString(conf, usbdevice, mouse)  
0)
+goto cleanup;
+break;
+case VIR_DOMAIN_INPUT_TYPE_TABLET:
+if (xenXMConfigSetString(conf, usbdevice, tablet) 
 0)
+goto cleanup;
+break;
+case VIR_DOMAIN_INPUT_TYPE_KBD:
+if (xenXMConfigSetString(conf, usbdevice, 
keyboard)  0)
+   

[libvirt] [PATCH v8 3/7] conf: Remove the implicit PS2 mouse for non-X86 platforms and add an implicit PS2 keyboard device for X86 platforms.

2014-02-16 Thread Li Zhang
From: Li Zhang zhlci...@linux.vnet.ibm.com

PS2 device only works for X86 platform, other platforms may need
USB mouse. Athough it doesn't influence the QEMU command line, but
it's not right to add one PS2 mouse for non-X86 platform.

What's more, PS2 keyboard can be supported for X86.

So, this patch is to remove PS2 mouse for non-x86 platforms and also add
an implicit PS2 keyboard device for X86.

Signed-off-by: Li Zhang zhlci...@linux.vnet.ibm.com
---
 src/conf/domain_conf.c | 73 --
 src/util/virarch.h |  2 +
 ...qemuhotplug-console-compat-2+console-virtio.xml |  1 +
 .../qemuxml2argv-console-compat-2.xml  |  1 +
 .../qemuxml2argv-graphics-listen-network.xml   |  1 +
 .../qemuxml2argv-graphics-listen-network2.xml  |  1 +
 .../qemuxml2argv-graphics-sdl-fullscreen.xml   |  1 +
 .../qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml |  1 +
 .../qemuxml2argv-graphics-spice-compression.xml|  1 +
 .../qemuxml2argv-graphics-spice-qxl-vga.xml|  1 +
 .../qemuxml2argv-graphics-spice-timeout.xml|  2 +
 .../qemuxml2argv-graphics-spice.xml|  1 +
 .../qemuxml2argv-graphics-vnc-policy.xml   |  1 +
 .../qemuxml2argv-graphics-vnc-sasl.xml |  1 +
 .../qemuxml2argv-graphics-vnc-socket.xml   |  1 +
 .../qemuxml2argv-graphics-vnc-tls.xml  |  1 +
 .../qemuxml2argv-graphics-vnc-websocket.xml|  1 +
 .../qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml |  1 +
 tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml  |  1 +
 .../qemuxml2argv-net-bandwidth.xml |  1 +
 tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml |  1 +
 .../qemuxml2argvdata/qemuxml2argv-pseries-disk.xml |  1 -
 .../qemuxml2argv-serial-spiceport.xml  |  1 +
 .../qemuxml2xmlout-graphics-listen-network2.xml|  1 +
 .../qemuxml2xmlout-graphics-spice-timeout.xml  |  1 +
 tests/vmx2xmldata/vmx2xml-graphics-vnc.xml |  1 +
 26 files changed, 66 insertions(+), 34 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 3301398..10c753c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7773,7 +7773,7 @@ error:
 
 /* Parse the XML definition for an input device */
 static virDomainInputDefPtr
-virDomainInputDefParseXML(const char *ostype,
+virDomainInputDefParseXML(const virDomainDef *dom,
   xmlNodePtr node,
   unsigned int flags)
 {
@@ -7806,7 +7806,7 @@ virDomainInputDefParseXML(const char *ostype,
 goto error;
 }
 
-if (STREQ(ostype, hvm)) {
+if (STREQ(dom-os.type, hvm)) {
 if (def-bus == VIR_DOMAIN_INPUT_BUS_PS2  /* PS2 can be mouse or 
keyboard */
 !(def-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
 def-type == VIR_DOMAIN_INPUT_TYPE_KBD)) {
@@ -7836,9 +7836,10 @@ virDomainInputDefParseXML(const char *ostype,
 }
 }
 } else {
-if (STREQ(ostype, hvm)) {
-if (def-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
-def-type == VIR_DOMAIN_INPUT_TYPE_KBD)
+if (STREQ(dom-os.type, hvm)) {
+if ((def-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
+def-type == VIR_DOMAIN_INPUT_TYPE_KBD) 
+ARCH_IS_X86(dom-os.arch))
 def-bus = VIR_DOMAIN_INPUT_BUS_PS2;
 else
 def-bus = VIR_DOMAIN_INPUT_BUS_USB;
@@ -9860,7 +9861,7 @@ virDomainDeviceDefParse(const char *xmlStr,
 goto error;
 break;
 case VIR_DOMAIN_DEVICE_INPUT:
-if (!(dev-data.input = virDomainInputDefParseXML(def-os.type,
+if (!(dev-data.input = virDomainInputDefParseXML(def,
   node, flags)))
 goto error;
 break;
@@ -12443,7 +12444,7 @@ virDomainDefParseXML(xmlDocPtr xml,
 goto error;
 
 for (i = 0; i  n; i++) {
-virDomainInputDefPtr input = virDomainInputDefParseXML(def-os.type,
+virDomainInputDefPtr input = virDomainInputDefParseXML(def,
nodes[i],
flags);
 if (!input)
@@ -12495,29 +12496,27 @@ virDomainDefParseXML(xmlDocPtr xml,
 VIR_FREE(nodes);
 
 /* If graphics are enabled, there's an implicit PS2 mouse */
-if (def-ngraphics  0) {
-virDomainInputDefPtr input;
+if (def-ngraphics  0 
+ARCH_IS_X86(def-os.arch)) {
+int input_bus = VIR_DOMAIN_INPUT_BUS_XEN;
 
-if (VIR_ALLOC(input)  0) {
-goto error;
-}
-if (STREQ(def-os.type, hvm)) {
-input-type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
-input-bus = VIR_DOMAIN_INPUT_BUS_PS2;
-} else {
-input-type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
-input-bus = VIR_DOMAIN_INPUT_BUS_XEN;
- 

[libvirt] [PATCH v8 1/7] conf: Add a keyboard input device type

2014-02-16 Thread Li Zhang
From: Li Zhang zhlci...@linux.vnet.ibm.com

There is no keyboard for non-x86 platforms when graphics are enabled.
It's preferred to add one USB keyboard.

This patch is to add keyboard input device type.

Signed-off-by: Li Zhang zhlci...@linux.vnet.ibm.com
---
 docs/schemas/domaincommon.rng |  1 +
 src/conf/domain_conf.c| 20 +---
 src/conf/domain_conf.h|  1 +
 3 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index c1efcd2..601e7ac 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3269,6 +3269,7 @@
 choice
   valuetablet/value
   valuemouse/value
+  valuekeyboard/value
 /choice
   /attribute
   optional
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index fc9615f..2c6233f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -506,7 +506,8 @@ VIR_ENUM_IMPL(virDomainVideo, VIR_DOMAIN_VIDEO_TYPE_LAST,
 
 VIR_ENUM_IMPL(virDomainInput, VIR_DOMAIN_INPUT_TYPE_LAST,
   mouse,
-  tablet)
+  tablet,
+  keyboard)
 
 VIR_ENUM_IMPL(virDomainInputBus, VIR_DOMAIN_INPUT_BUS_LAST,
   ps2,
@@ -7806,8 +7807,9 @@ virDomainInputDefParseXML(const char *ostype,
 }
 
 if (STREQ(ostype, hvm)) {
-if (def-bus == VIR_DOMAIN_INPUT_BUS_PS2  /* Only allow mouse 
for ps2 */
-def-type != VIR_DOMAIN_INPUT_TYPE_MOUSE) {
+if (def-bus == VIR_DOMAIN_INPUT_BUS_PS2  /* PS2 can be mouse or 
keyboard */
+!(def-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
+def-type == VIR_DOMAIN_INPUT_TYPE_KBD)) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
_(ps2 bus does not support %s input device),
type);
@@ -7825,7 +7827,8 @@ virDomainInputDefParseXML(const char *ostype,
_(unsupported input bus %s),
bus);
 }
-if (def-type != VIR_DOMAIN_INPUT_TYPE_MOUSE) {
+if (def-type != VIR_DOMAIN_INPUT_TYPE_MOUSE 
+def-type != VIR_DOMAIN_INPUT_TYPE_KBD) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
_(xen bus does not support %s input device),
type);
@@ -7834,7 +7837,8 @@ virDomainInputDefParseXML(const char *ostype,
 }
 } else {
 if (STREQ(ostype, hvm)) {
-if (def-type == VIR_DOMAIN_INPUT_TYPE_MOUSE)
+if (def-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
+def-type == VIR_DOMAIN_INPUT_TYPE_KBD)
 def-bus = VIR_DOMAIN_INPUT_BUS_PS2;
 else
 def-bus = VIR_DOMAIN_INPUT_BUS_USB;
@@ -12432,10 +12436,12 @@ virDomainDefParseXML(xmlDocPtr xml,
  * XXX will this be true for other virt types ? */
 if ((STREQ(def-os.type, hvm) 
  input-bus == VIR_DOMAIN_INPUT_BUS_PS2 
- input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE) ||
+ (input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
+  input-type == VIR_DOMAIN_INPUT_TYPE_KBD)) ||
 (STRNEQ(def-os.type, hvm) 
  input-bus == VIR_DOMAIN_INPUT_BUS_XEN 
- input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE)) {
+ (input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
+  input-type == VIR_DOMAIN_INPUT_TYPE_KBD))) {
 virDomainInputDefFree(input);
 continue;
 }
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 24cbec3..2dc259d 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1239,6 +1239,7 @@ struct _virDomainTPMDef {
 enum virDomainInputType {
 VIR_DOMAIN_INPUT_TYPE_MOUSE,
 VIR_DOMAIN_INPUT_TYPE_TABLET,
+VIR_DOMAIN_INPUT_TYPE_KBD,
 
 VIR_DOMAIN_INPUT_TYPE_LAST
 };
-- 
1.8.2.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v8 7/7] Add a default USB keyboard and USB mouse for PPC64

2014-02-16 Thread Li Zhang
From: Li Zhang zhlci...@linux.vnet.ibm.com

There is no keyboard working on PPC64 and PS2 mouse is only for X86
when graphics are enabled. It needs to add a USB keyboard and USB mouse for 
PPC64.

This patch is to add a USB keyboard and USB mouse when graphics are enabled.

Signed-off-by: Li Zhang zhlci...@linux.vnet.ibm.com
---
 src/qemu/qemu_domain.c | 23 +-
 .../qemuxml2argvdata/qemuxml2argv-pseries-disk.xml |  2 ++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index a665061..7f4ff0e 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -691,6 +691,8 @@ qemuDomainDefPostParse(virDomainDefPtr def,
 bool addPCIRoot = false;
 bool addPCIeRoot = false;
 bool addDefaultMemballoon = true;
+bool addDefaultUSBKBD = false;
+bool addDefaultUSBMouse = false;
 
 /* check for emulator and create a default one if needed */
 if (!def-emulator 
@@ -732,9 +734,14 @@ qemuDomainDefPostParse(virDomainDefPtr def,
addDefaultMemballoon = false;
break;
 
+case VIR_ARCH_PPC64:
+addPCIRoot = true;
+addDefaultUSBKBD = true;
+addDefaultUSBMouse = true;
+break;
+
 case VIR_ARCH_ALPHA:
 case VIR_ARCH_PPC:
-case VIR_ARCH_PPC64:
 case VIR_ARCH_PPCEMB:
 case VIR_ARCH_SH4:
 case VIR_ARCH_SH4EB:
@@ -787,6 +794,20 @@ qemuDomainDefPostParse(virDomainDefPtr def,
 def-memballoon = memballoon;
 }
 
+if (addDefaultUSBKBD 
+def-ngraphics  0 
+virDomainDefMaybeAddInput(def,
+  VIR_DOMAIN_INPUT_TYPE_KBD,
+  VIR_DOMAIN_INPUT_BUS_USB)  0)
+return -1;
+
+if (addDefaultUSBMouse 
+def-ngraphics  0 
+virDomainDefMaybeAddInput(def,
+  VIR_DOMAIN_INPUT_TYPE_MOUSE,
+  VIR_DOMAIN_INPUT_BUS_USB)  0)
+return -1;
+
 return 0;
 }
 
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml 
b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
index 8dde776..64b70f3 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
@@ -30,6 +30,8 @@
 controller type='usb' index='0'/
 controller type='scsi' index='0'/
 controller type='pci' index='0' model='pci-root'/
+input type='keyboard' bus='usb'/
+input type='mouse' bus='usb'/
 graphics type='sdl'/
 video
   model type='cirrus' vram='9216' heads='1'/
-- 
1.8.2.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v8 5/7] qemu: format qemu command line for USB keyboard

2014-02-16 Thread Li Zhang
From: Li Zhang zhlci...@linux.vnet.ibm.com

This patch is to format qemu command line for USB keyboard
and add test cases for it.

Signed-off-by: Li Zhang zhlci...@linux.vnet.ibm.com
---
 src/qemu/qemu_command.c| 41 --
 .../qemuxml2argv-pseries-usb-kbd.args  |  9 +
 .../qemuxml2argv-pseries-usb-kbd.xml   | 19 ++
 tests/qemuxml2argvtest.c   |  3 ++
 4 files changed, 62 insertions(+), 10 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.xml

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index bb8756f..22ba441 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5306,9 +5306,19 @@ qemuBuildUSBInputDevStr(virDomainDefPtr def,
 {
 virBuffer buf = VIR_BUFFER_INITIALIZER;
 
-virBufferAsprintf(buf, %s,id=%s,
-  dev-type == VIR_DOMAIN_INPUT_TYPE_MOUSE ?
-  usb-mouse : usb-tablet, dev-info.alias);
+switch (dev-type) {
+case VIR_DOMAIN_INPUT_TYPE_MOUSE:
+virBufferAsprintf(buf, usb-mouse,id=%s, dev-info.alias);
+break;
+case VIR_DOMAIN_INPUT_TYPE_TABLET:
+virBufferAsprintf(buf, usb-tablet,id=%s, dev-info.alias);
+break;
+case VIR_DOMAIN_INPUT_TYPE_KBD:
+if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_USB_KBD))
+goto error;
+virBufferAsprintf(buf, usb-kbd,id=%s, dev-info.alias);
+break;
+}
 
 if (qemuBuildDeviceAddressStr(buf, def, dev-info, qemuCaps)  0)
 goto error;
@@ -9044,9 +9054,17 @@ qemuBuildCommandLine(virConnectPtr conn,
 virCommandAddArg(cmd, optstr);
 VIR_FREE(optstr);
 } else {
-virCommandAddArgList(cmd, -usbdevice,
- input-type == VIR_DOMAIN_INPUT_TYPE_MOUSE
- ? mouse : tablet, NULL);
+switch (input-type) {
+case VIR_DOMAIN_INPUT_TYPE_MOUSE:
+virCommandAddArgList(cmd, -usbdevice, mouse, NULL);
+break;
+case VIR_DOMAIN_INPUT_TYPE_TABLET:
+virCommandAddArgList(cmd, -usbdevice, tablet, 
NULL);
+break;
+case VIR_DOMAIN_INPUT_TYPE_KBD:
+virCommandAddArgList(cmd, -usbdevice, keyboard, 
NULL);
+break;
+}
 }
 }
 }
@@ -11720,20 +11738,23 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
 } else if (STREQ(arg, -usbdevice)) {
 WANT_VALUE();
 if (STREQ(val, tablet) ||
-STREQ(val, mouse)) {
+STREQ(val, mouse) ||
+STREQ(val, keyboard)) {
 virDomainInputDefPtr input;
 if (VIR_ALLOC(input)  0)
 goto error;
 input-bus = VIR_DOMAIN_INPUT_BUS_USB;
 if (STREQ(val, tablet))
 input-type = VIR_DOMAIN_INPUT_TYPE_TABLET;
-else
+else if (STREQ(val, mouse))
 input-type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
-if (VIR_REALLOC_N(def-inputs, def-ninputs+1)  0) {
+else
+input-type = VIR_DOMAIN_INPUT_TYPE_KBD;
+
+if (VIR_APPEND_ELEMENT(def-inputs, def-ninputs, input)  0) {
 virDomainInputDefFree(input);
 goto error;
 }
-def-inputs[def-ninputs++] = input;
 } else if (STRPREFIX(val, disk:)) {
 if (VIR_ALLOC(disk)  0)
 goto error;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.args 
b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.args
new file mode 100644
index 000..373c72a
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.args
@@ -0,0 +1,9 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-ppc64 -S -M pseries -m 512 -smp 1 \
+-nographic -nodefconfig -nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
+-device pci-ohci,id=usb,bus=pci,addr=0x1 \
+-chardev pty,id=charserial0 \
+-device spapr-vty,chardev=charserial0,reg=0x3000 \
+-device usb-kbd,id=input0
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.xml 
b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.xml
new file mode 100644
index 000..5bd4c37
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.xml
@@ -0,0 +1,19 @@
+domain type='qemu'
+  nameQEMUGuest1/name
+  uuid1ccfd97d-5eb4-478a-bbe6-88d254c16db7/uuid
+  memory unit='KiB'524288/memory
+  vcpu 

[libvirt] [PATCH v8 4/7] qemu_cap: Add USB keyboard capability

2014-02-16 Thread Li Zhang
From: Li Zhang zhlci...@linux.vnet.ibm.com

QEMU can support USB keyboard but libvirt haven't supportted it yet.
This patch is to add USB keyboard capabilities and test cases.

Signed-off-by: Li Zhang zhlci...@linux.vnet.ibm.com
---
 src/qemu/qemu_capabilities.c  | 3 +++
 src/qemu/qemu_capabilities.h  | 1 +
 tests/qemucapabilitiesdata/caps_1.2.2-1.caps  | 1 +
 tests/qemucapabilitiesdata/caps_1.3.1-1.caps  | 1 +
 tests/qemucapabilitiesdata/caps_1.4.2-1.caps  | 1 +
 tests/qemucapabilitiesdata/caps_1.5.3-1.caps  | 1 +
 tests/qemucapabilitiesdata/caps_1.6.0-1.caps  | 1 +
 tests/qemucapabilitiesdata/caps_1.6.50-1.caps | 1 +
 tests/qemuhelptest.c  | 8 
 9 files changed, 18 insertions(+)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index e7d953a..d618b3f 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -249,6 +249,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
   enable-fips,
   spice-file-xfer-disable,
   spiceport,
+
+  usb-kbd, /* 165 */
 );
 
 struct _virQEMUCaps {
@@ -1403,6 +1405,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
 { virtio-mmio, QEMU_CAPS_DEVICE_VIRTIO_MMIO },
 { ich9-intel-hda, QEMU_CAPS_DEVICE_ICH9_INTEL_HDA },
 { pvpanic, QEMU_CAPS_DEVICE_PANIC },
+{ usb-kbd, QEMU_CAPS_DEVICE_USB_KBD },
 };
 
 static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index a4eecb6..b5445e7 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -203,6 +203,7 @@ enum virQEMUCapsFlags {
 QEMU_CAPS_ENABLE_FIPS= 162, /* -enable-fips */
 QEMU_CAPS_SPICE_FILE_XFER_DISABLE = 163, /* -spice disable-agent-file-xfer 
*/
 QEMU_CAPS_CHARDEV_SPICEPORT  = 164, /* -chardev spiceport */
+QEMU_CAPS_DEVICE_USB_KBD = 165, /* -device usb-kbd */
 
 QEMU_CAPS_LAST,   /* this must always be the last item */
 };
diff --git a/tests/qemucapabilitiesdata/caps_1.2.2-1.caps 
b/tests/qemucapabilitiesdata/caps_1.2.2-1.caps
index c3ae814..436cecd 100644
--- a/tests/qemucapabilitiesdata/caps_1.2.2-1.caps
+++ b/tests/qemucapabilitiesdata/caps_1.2.2-1.caps
@@ -113,4 +113,5 @@
 flag name='usb-storage.removable'/
 flag name='kvm-pit-lost-tick-policy'/
 flag name='enable-fips'/
+flag name='usb-kbd'/
   /qemuCaps
diff --git a/tests/qemucapabilitiesdata/caps_1.3.1-1.caps 
b/tests/qemucapabilitiesdata/caps_1.3.1-1.caps
index da15d8b..6b4a8f0 100644
--- a/tests/qemucapabilitiesdata/caps_1.3.1-1.caps
+++ b/tests/qemucapabilitiesdata/caps_1.3.1-1.caps
@@ -126,4 +126,5 @@
 flag name='usb-storage'/
 flag name='usb-storage.removable'/
 flag name='kvm-pit-lost-tick-policy'/
+flag name='usb-kbd'/
   /qemuCaps
diff --git a/tests/qemucapabilitiesdata/caps_1.4.2-1.caps 
b/tests/qemucapabilitiesdata/caps_1.4.2-1.caps
index c419068..e3d0047 100644
--- a/tests/qemucapabilitiesdata/caps_1.4.2-1.caps
+++ b/tests/qemucapabilitiesdata/caps_1.4.2-1.caps
@@ -127,4 +127,5 @@
 flag name='usb-storage.removable'/
 flag name='ich9-intel-hda'/
 flag name='kvm-pit-lost-tick-policy'/
+flag name='usb-kbd'/
   /qemuCaps
diff --git a/tests/qemucapabilitiesdata/caps_1.5.3-1.caps 
b/tests/qemucapabilitiesdata/caps_1.5.3-1.caps
index adf8531..01b4d27 100644
--- a/tests/qemucapabilitiesdata/caps_1.5.3-1.caps
+++ b/tests/qemucapabilitiesdata/caps_1.5.3-1.caps
@@ -135,4 +135,5 @@
 flag name='pvpanic'/
 flag name='reboot-timeout'/
 flag name='spiceport'/
+flag name='usb-kbd'/
   /qemuCaps
diff --git a/tests/qemucapabilitiesdata/caps_1.6.0-1.caps 
b/tests/qemucapabilitiesdata/caps_1.6.0-1.caps
index e6b2f76..597f873 100644
--- a/tests/qemucapabilitiesdata/caps_1.6.0-1.caps
+++ b/tests/qemucapabilitiesdata/caps_1.6.0-1.caps
@@ -141,4 +141,5 @@
 flag name='enable-fips'/
 flag name='spice-file-xfer-disable'/
 flag name='spiceport'/
+flag name='usb-kbd'/
   /qemuCaps
diff --git a/tests/qemucapabilitiesdata/caps_1.6.50-1.caps 
b/tests/qemucapabilitiesdata/caps_1.6.50-1.caps
index e6b8117..0c1dd87 100644
--- a/tests/qemucapabilitiesdata/caps_1.6.50-1.caps
+++ b/tests/qemucapabilitiesdata/caps_1.6.50-1.caps
@@ -139,4 +139,5 @@
 flag name='reboot-timeout'/
 flag name='spice-file-xfer-disable'/
 flag name='spiceport'/
+flag name='usb-kbd'/
   /qemuCaps
diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c
index 3628fbe..6e0a5f8 100644
--- a/tests/qemuhelptest.c
+++ b/tests/qemuhelptest.c
@@ -403,6 +403,7 @@ mymain(void)
 QEMU_CAPS_DEVICE_VMWARE_SVGA,
 QEMU_CAPS_DEVICE_USB_SERIAL,
 QEMU_CAPS_DEVICE_USB_NET,
+QEMU_CAPS_DEVICE_USB_KBD,
 QEMU_CAPS_DEVICE_PCI_BRIDGE);
 DO_TEST(qemu-kvm-0.12.3, 12003, 1, 0,
 QEMU_CAPS_VNC_COLON,
@@ -515,6 +516,7 @@ mymain(void)