mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
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:
commit
1a5f3d2eee
4 changed files with 66 additions and 1 deletions
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue