Xen queue:

* xen/passthrough: use gsi to map pirq when dom0 is PVH
 * Fix missing xenstore node from xen-block backend
 * Fix xen mapcache extraneous invalidate
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCgAdFiEE+AwAYwjiLP2KkueYDPVXL9f7Va8FAmfO+nEACgkQDPVXL9f7
 Va+QYggA9dmxMGDO05UEd2ZPv/Goub37Le44qBN4oeXizVRZgGUs2w9ETBXhPZus
 34aI8CTID4fcH4rgF4LgJ4XuyOxYwP1ot8EpDHQg+ji2nyHeMpAyePTfubprq17U
 APN6Qqefd9X+TX+W9zUS5jV/AXO+apGX+tmVkVexFuy4gSRGSVCPoibHePtoLH9G
 3rSREjdEx7ByY6ieCV5x3zHPp5tmnLWeHpNCVc5x6NplBslQduBz6vOqLNWB1LKO
 3a/lYcvTn9PIla1zpvGNbeTsPv2lcdx3SccThcZmyTv2PDm1kzyUOIo1lSIP6bb3
 LjCl3dm1mfxAGEaZ+//rsRhTH8d5ew==
 =K79y
 -----END PGP SIGNATURE-----

Merge tag 'pull-xen-20250310' of https://xenbits.xen.org/git-http/people/aperard/qemu-dm into staging

Xen queue:

* xen/passthrough: use gsi to map pirq when dom0 is PVH
* Fix missing xenstore node from xen-block backend
* Fix xen mapcache extraneous invalidate

# -----BEGIN PGP SIGNATURE-----
#
# iQEzBAABCgAdFiEE+AwAYwjiLP2KkueYDPVXL9f7Va8FAmfO+nEACgkQDPVXL9f7
# Va+QYggA9dmxMGDO05UEd2ZPv/Goub37Le44qBN4oeXizVRZgGUs2w9ETBXhPZus
# 34aI8CTID4fcH4rgF4LgJ4XuyOxYwP1ot8EpDHQg+ji2nyHeMpAyePTfubprq17U
# APN6Qqefd9X+TX+W9zUS5jV/AXO+apGX+tmVkVexFuy4gSRGSVCPoibHePtoLH9G
# 3rSREjdEx7ByY6ieCV5x3zHPp5tmnLWeHpNCVc5x6NplBslQduBz6vOqLNWB1LKO
# 3a/lYcvTn9PIla1zpvGNbeTsPv2lcdx3SccThcZmyTv2PDm1kzyUOIo1lSIP6bb3
# LjCl3dm1mfxAGEaZ+//rsRhTH8d5ew==
# =K79y
# -----END PGP SIGNATURE-----
# gpg: Signature made Mon 10 Mar 2025 22:42:57 HKT
# gpg:                using RSA key F80C006308E22CFD8A92E7980CF5572FD7FB55AF
# gpg: Good signature from "Anthony PERARD <anthony.perard@gmail.com>" [unknown]
# gpg:                 aka "Anthony PERARD <anthony.perard@vates.tech>" [unknown]
# gpg:                 aka "Anthony PERARD <anthony@xenproject.org>" [unknown]
# gpg:                 aka "Anthony PERARD <anthony.perard@citrix.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 5379 2F71 024C 600F 778A  7161 D8D5 7199 DF83 42C8
#      Subkey fingerprint: F80C 0063 08E2 2CFD 8A92  E798 0CF5 572F D7FB 55AF

* tag 'pull-xen-20250310' of https://xenbits.xen.org/git-http/people/aperard/qemu-dm:
  xen: No need to flush the mapcache for grants
  hw/xen: Add "mode" parameter to xen-block devices
  xen/passthrough: use gsi to map pirq when dom0 is PVH

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2025-03-11 09:31:36 +08:00
commit 1a5f3d2eee
4 changed files with 66 additions and 1 deletions

View file

@ -408,6 +408,8 @@ static void xen_block_realize(XenDevice *xendev, Error **errp)
} }
xen_device_backend_printf(xendev, "info", "%u", blockdev->info); xen_device_backend_printf(xendev, "info", "%u", blockdev->info);
xen_device_backend_printf(xendev, "mode",
(blockdev->info & VDISK_READONLY) ? "r" : "w");
xen_device_frontend_printf(xendev, "virtual-device", "%lu", xen_device_frontend_printf(xendev, "virtual-device", "%lu",
vdev->number); vdev->number);

View file

@ -700,7 +700,6 @@ void xen_invalidate_map_cache(void)
bdrv_drain_all(); bdrv_drain_all();
xen_invalidate_map_cache_single(mapcache); xen_invalidate_map_cache_single(mapcache);
xen_invalidate_map_cache_single(mapcache_grants);
} }
static uint8_t *xen_replace_cache_entry_unlocked(MapCache *mc, static uint8_t *xen_replace_cache_entry_unlocked(MapCache *mc,

View file

@ -766,6 +766,57 @@ static void xen_pt_destroy(PCIDevice *d) {
} }
/* init */ /* init */
#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 42000
static bool xen_pt_need_gsi(void)
{
FILE *fp;
int len;
/*
* The max length of guest_type is "PVH"+'\n'+'\0', it is 5,
* so here set the length of type to be twice.
*/
char type[10];
const char *guest_type = "/sys/hypervisor/guest_type";
fp = fopen(guest_type, "r");
if (!fp) {
error_report("Cannot open %s: %s", guest_type, strerror(errno));
return false;
}
if (fgets(type, sizeof(type), fp)) {
len = strlen(type);
if (len) {
type[len - 1] = '\0';
if (!strcmp(type, "PVH")) {
fclose(fp);
return true;
}
}
}
fclose(fp);
return false;
}
static int xen_pt_map_pirq_for_gsi(PCIDevice *d, int *pirq)
{
int gsi;
XenPCIPassthroughState *s = XEN_PT_DEVICE(d);
gsi = xc_pcidev_get_gsi(xen_xc,
PCI_SBDF(s->real_device.domain,
s->real_device.bus,
s->real_device.dev,
s->real_device.func));
if (gsi >= 0) {
return xc_physdev_map_pirq_gsi(xen_xc, xen_domid, gsi, pirq);
}
return gsi;
}
#endif
static void xen_pt_realize(PCIDevice *d, Error **errp) static void xen_pt_realize(PCIDevice *d, Error **errp)
{ {
ERRP_GUARD(); ERRP_GUARD();
@ -847,7 +898,16 @@ static void xen_pt_realize(PCIDevice *d, Error **errp)
goto out; goto out;
} }
#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 42000
if (xen_pt_need_gsi()) {
rc = xen_pt_map_pirq_for_gsi(d, &pirq);
} else {
rc = xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq, &pirq);
}
#else
rc = xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq, &pirq); rc = xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq, &pirq);
#endif
if (rc < 0) { if (rc < 0) {
XEN_PT_ERR(d, "Mapping machine irq %u to pirq %i failed, (err: %d)\n", XEN_PT_ERR(d, "Mapping machine irq %u to pirq %i failed, (err: %d)\n",
machine_irq, pirq, errno); machine_irq, pirq, errno);

View file

@ -23,6 +23,10 @@ extern bool pci_available;
#define PCI_SLOT_MAX 32 #define PCI_SLOT_MAX 32
#define PCI_FUNC_MAX 8 #define PCI_FUNC_MAX 8
#define PCI_SBDF(seg, bus, dev, func) \
((((uint32_t)(seg)) << 16) | \
(PCI_BUILD_BDF(bus, PCI_DEVFN(dev, func))))
/* Class, Vendor and Device IDs from Linux's pci_ids.h */ /* Class, Vendor and Device IDs from Linux's pci_ids.h */
#include "hw/pci/pci_ids.h" #include "hw/pci/pci_ids.h"