Xen 2017/02/02

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJYk3nyAAoJEIlPj0hw4a6Q4kcP/1awM8VPkvkb85sqwxIj4RI8
 Yuhmx//gT8cDiXZmxxx3sEk5221kc3DpwieQf0aAHR8EsXdczY/GbkZI6LcUI4E9
 2oN69gtLoxPVQY+bLJ2JXnGyhHKW2+iKKxzur1KkpgCo1FSxAuXEe1KT5WZsM6nY
 DcKRV7oRJWCYdCtU6LVVXY+wtLT2/4QEdQbAsLUIamSQ88u4HHtKtjAyra95oNnS
 75XW7GDemPh82ATk1NF4hhxaA9wR9DThBxqmm8DUCcCJAwEYafKV/vLxmpXd2vPO
 tOi2QZsEgvjNxIV2Gn0kY1XQxiG1If3dRl4W8Q05oUyAGI6Cz7Yrz+l/um/usxko
 NYqVbD1+HcrA8BBifh+FC2lsFD+S1Yd+zqkC2O2WkMzR1raFHnvAJBUySN/HcCni
 /68hmHiudBgInA9bLmN5XwY3uJ6f4nWHpRGaarFuCNCxVdQy1AZOpdlUEP2p6naP
 fkwJCGFODhy9xNTmKS7WGlddeGkaW4XsONo5iTHcx377eX2zaUminKxIuCkGqbwd
 3qrbu1aMGpTK7WchHEfO3qJBbsIC0gG9YakUzGgbUIkEuorqDOEf9RJ/qoHq4Emo
 sdPGwcKnrV1SUJl0RzIAqQgoB681AwGVsybFJwJv3evw9Q8DCgpZX7edAGnqZ3lG
 QlZbfdbVVjpz17sQebuX
 =xxXu
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/sstabellini/tags/xen-20170202' into staging

Xen 2017/02/02

# gpg: Signature made Thu 02 Feb 2017 18:26:58 GMT
# gpg:                using RSA key 0x894F8F4870E1AE90
# gpg: Good signature from "Stefano Stabellini <sstabellini@kernel.org>"
# gpg:                 aka "Stefano Stabellini <stefano.stabellini@eu.citrix.com>"
# Primary key fingerprint: D04E 33AB A51F 67BA 07D3  0AEA 894F 8F48 70E1 AE90

* remotes/sstabellini/tags/xen-20170202:
  xen: use qdev_unplug() instead of g_free() in xen_pv_find_xendev()
  MAINTAINERS: Update xen-devel mailing list address
  xen-platform: add missing disk unplug option
  xen-platform: add support for unplugging NVMe disks...
  xen-platform: re-structure unplug_disks

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2017-02-03 12:31:40 +00:00
commit 4100a344eb
5 changed files with 42 additions and 30 deletions

View File

@ -323,7 +323,7 @@ Guest CPU Cores (Xen):
X86 X86
M: Stefano Stabellini <sstabellini@kernel.org> M: Stefano Stabellini <sstabellini@kernel.org>
M: Anthony Perard <anthony.perard@citrix.com> M: Anthony Perard <anthony.perard@citrix.com>
L: xen-devel@lists.xensource.com L: xen-devel@lists.xenproject.org
S: Supported S: Supported
F: xen-* F: xen-*
F: */xen* F: */xen*

View File

@ -88,7 +88,7 @@ static void log_writeb(PCIXenPlatformState *s, char val)
} }
/* Xen Platform, Fixed IOPort */ /* Xen Platform, Fixed IOPort */
#define UNPLUG_ALL_IDE_DISKS 1 #define UNPLUG_ALL_DISKS 1
#define UNPLUG_ALL_NICS 2 #define UNPLUG_ALL_NICS 2
#define UNPLUG_AUX_IDE_DISKS 4 #define UNPLUG_AUX_IDE_DISKS 4
@ -107,23 +107,37 @@ static void pci_unplug_nics(PCIBus *bus)
pci_for_each_device(bus, 0, unplug_nic, NULL); pci_for_each_device(bus, 0, unplug_nic, NULL);
} }
static void unplug_disks(PCIBus *b, PCIDevice *d, void *o) static void unplug_disks(PCIBus *b, PCIDevice *d, void *opaque)
{ {
uint32_t flags = *(uint32_t *)opaque;
bool aux = (flags & UNPLUG_AUX_IDE_DISKS) &&
!(flags & UNPLUG_ALL_DISKS);
/* We have to ignore passthrough devices */ /* We have to ignore passthrough devices */
if (pci_get_word(d->config + PCI_CLASS_DEVICE) == if (!strcmp(d->name, "xen-pci-passthrough")) {
PCI_CLASS_STORAGE_IDE return;
&& strcmp(d->name, "xen-pci-passthrough") != 0) { }
pci_piix3_xen_ide_unplug(DEVICE(d));
} else if (pci_get_word(d->config + PCI_CLASS_DEVICE) == switch (pci_get_word(d->config + PCI_CLASS_DEVICE)) {
PCI_CLASS_STORAGE_SCSI case PCI_CLASS_STORAGE_IDE:
&& strcmp(d->name, "xen-pci-passthrough") != 0) { pci_piix3_xen_ide_unplug(DEVICE(d), aux);
break;
case PCI_CLASS_STORAGE_SCSI:
case PCI_CLASS_STORAGE_EXPRESS:
if (!aux) {
object_unparent(OBJECT(d)); object_unparent(OBJECT(d));
} }
break;
default:
break;
}
} }
static void pci_unplug_disks(PCIBus *bus) static void pci_unplug_disks(PCIBus *bus, uint32_t flags)
{ {
pci_for_each_device(bus, 0, unplug_disks, NULL); pci_for_each_device(bus, 0, unplug_disks, &flags);
} }
static void platform_fixed_ioport_writew(void *opaque, uint32_t addr, uint32_t val) static void platform_fixed_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
@ -134,19 +148,16 @@ static void platform_fixed_ioport_writew(void *opaque, uint32_t addr, uint32_t v
case 0: { case 0: {
PCIDevice *pci_dev = PCI_DEVICE(s); PCIDevice *pci_dev = PCI_DEVICE(s);
/* Unplug devices. Value is a bitmask of which devices to /* Unplug devices. Value is a bitmask of which devices to
unplug, with bit 0 the IDE devices, bit 1 the network unplug, with bit 0 the disk devices, bit 1 the network
devices, and bit 2 the non-primary-master IDE devices. */ devices, and bit 2 the non-primary-master IDE devices. */
if (val & UNPLUG_ALL_IDE_DISKS) { if (val & (UNPLUG_ALL_DISKS | UNPLUG_AUX_IDE_DISKS)) {
DPRINTF("unplug disks\n"); DPRINTF("unplug disks\n");
pci_unplug_disks(pci_dev->bus); pci_unplug_disks(pci_dev->bus, val);
} }
if (val & UNPLUG_ALL_NICS) { if (val & UNPLUG_ALL_NICS) {
DPRINTF("unplug nics\n"); DPRINTF("unplug nics\n");
pci_unplug_nics(pci_dev->bus); pci_unplug_nics(pci_dev->bus);
} }
if (val & UNPLUG_AUX_IDE_DISKS) {
DPRINTF("unplug auxiliary disks not supported\n");
}
break; break;
} }
case 2: case 2:
@ -327,14 +338,14 @@ static void xen_platform_ioport_writeb(void *opaque, hwaddr addr,
* If VMDP was to control both disk and LAN it would use 4. * If VMDP was to control both disk and LAN it would use 4.
* If it controlled just disk or just LAN, it would use 8 below. * If it controlled just disk or just LAN, it would use 8 below.
*/ */
pci_unplug_disks(pci_dev->bus); pci_unplug_disks(pci_dev->bus, UNPLUG_ALL_DISKS);
pci_unplug_nics(pci_dev->bus); pci_unplug_nics(pci_dev->bus);
} }
break; break;
case 8: case 8:
switch (val) { switch (val) {
case 1: case 1:
pci_unplug_disks(pci_dev->bus); pci_unplug_disks(pci_dev->bus, UNPLUG_ALL_DISKS);
break; break;
case 2: case 2:
pci_unplug_nics(pci_dev->bus); pci_unplug_nics(pci_dev->bus);

View File

@ -165,7 +165,7 @@ static void pci_piix_ide_realize(PCIDevice *dev, Error **errp)
pci_piix_init_ports(d); pci_piix_init_ports(d);
} }
int pci_piix3_xen_ide_unplug(DeviceState *dev) int pci_piix3_xen_ide_unplug(DeviceState *dev, bool aux)
{ {
PCIIDEState *pci_ide; PCIIDEState *pci_ide;
DriveInfo *di; DriveInfo *di;
@ -174,7 +174,7 @@ int pci_piix3_xen_ide_unplug(DeviceState *dev)
pci_ide = PCI_IDE(dev); pci_ide = PCI_IDE(dev);
for (i = 0; i < 4; i++) { for (i = aux ? 1 : 0; i < 4; i++) {
di = drive_get_by_index(IF_IDE, i); di = drive_get_by_index(IF_IDE, i);
if (di != NULL && !di->media_cd) { if (di != NULL && !di->media_cd) {
BlockBackend *blk = blk_by_legacy_dinfo(di); BlockBackend *blk = blk_by_legacy_dinfo(di);

View File

@ -124,10 +124,11 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,
/* init new xendev */ /* init new xendev */
xendev = g_malloc0(ops->size); xendev = g_malloc0(ops->size);
object_initialize(&xendev->qdev, ops->size, TYPE_XENBACKEND); object_initialize(&xendev->qdev, ops->size, TYPE_XENBACKEND);
qdev_set_parent_bus(&xendev->qdev, xen_sysbus); OBJECT(xendev)->free = g_free;
qdev_set_id(&xendev->qdev, g_strdup_printf("xen-%s-%d", type, dev)); qdev_set_parent_bus(DEVICE(xendev), xen_sysbus);
qdev_init_nofail(&xendev->qdev); qdev_set_id(DEVICE(xendev), g_strdup_printf("xen-%s-%d", type, dev));
object_unref(OBJECT(&xendev->qdev)); qdev_init_nofail(DEVICE(xendev));
object_unref(OBJECT(xendev));
xendev->type = type; xendev->type = type;
xendev->dom = dom; xendev->dom = dom;
@ -145,7 +146,7 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,
xendev->evtchndev = xenevtchn_open(NULL, 0); xendev->evtchndev = xenevtchn_open(NULL, 0);
if (xendev->evtchndev == NULL) { if (xendev->evtchndev == NULL) {
xen_pv_printf(NULL, 0, "can't open evtchn device\n"); xen_pv_printf(NULL, 0, "can't open evtchn device\n");
g_free(xendev); qdev_unplug(DEVICE(xendev), NULL);
return NULL; return NULL;
} }
fcntl(xenevtchn_fd(xendev->evtchndev), F_SETFD, FD_CLOEXEC); fcntl(xenevtchn_fd(xendev->evtchndev), F_SETFD, FD_CLOEXEC);
@ -155,7 +156,7 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,
if (xendev->gnttabdev == NULL) { if (xendev->gnttabdev == NULL) {
xen_pv_printf(NULL, 0, "can't open gnttab device\n"); xen_pv_printf(NULL, 0, "can't open gnttab device\n");
xenevtchn_close(xendev->evtchndev); xenevtchn_close(xendev->evtchndev);
g_free(xendev); qdev_unplug(DEVICE(xendev), NULL);
return NULL; return NULL;
} }
} else { } else {

View File

@ -17,7 +17,7 @@ void pci_cmd646_ide_init(PCIBus *bus, DriveInfo **hd_table,
PCIDevice *pci_piix3_xen_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn); PCIDevice *pci_piix3_xen_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
PCIDevice *pci_piix3_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn); PCIDevice *pci_piix3_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
PCIDevice *pci_piix4_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn); PCIDevice *pci_piix4_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
int pci_piix3_xen_ide_unplug(DeviceState *dev); int pci_piix3_xen_ide_unplug(DeviceState *dev, bool aux);
void vt82c686b_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn); void vt82c686b_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
/* ide-mmio.c */ /* ide-mmio.c */