mirror of https://github.com/xemu-project/xemu.git
VFIO updates 2023-05-09
* Add vf-token device option allowing QEMU to assign VFs where the PF is managed by a userspace driver. (Minwoo Im) * Skip log_sync during migration setup as a potential source of failure and likely source of redundancy. (Avihai Horon) * Virtualize PCIe Resizable BAR capability rather than hiding it, exposing only the current size as available. (Alex Williamson) -----BEGIN PGP SIGNATURE----- iQJPBAABCAA5FiEEQvbATlQL0amee4qQI5ubbjuwiyIFAmRaqfobHGFsZXgud2ls bGlhbXNvbkByZWRoYXQuY29tAAoJECObm247sIsiwNYP/2KtCbKqylnGPuwLbRMP HC4Id4mme7jUribmhM7FP57nQrb0tgnQoGvalkmB6M3833e3p4ivH2ezTyPxIawx UH4mAEBtR03rxh54eVBbOvDVf+XHd6qll/rFw5dBI0C5s7JQyMOourNRLTZLvqzD 2bwI7dfQzWbXWPj8QGPmDti9wbeATZ3RjqC7onoWq6A6Cw4aRGj1gHBQH9v81iA+ m8hnZh+e5eFkQRc4mPXxFjm1Kw6ZYXWGoEEZrYPXvQn9+3MDCLcNb++KIrLsGujP qOnZG534vs+EZtUsGI8F02CBBXMAQFuBZhxCtuuG8iI9OQSE6R3E29iIc0Lpz5aO s8rN5OW4m7wXPdGkU1/7/N7kdeZvg+R8Jc4ozx3Mez3eSFbVkABSSX9vyvdHAezi 02Np1+ZBldZWBbBhYbWfqhvcg4iYNnHknSkS2CYY8jdsGttbrNY2f7Xllf3KC/Iv 6Un5WpU//0LuJjmH6onzswUUEmulchzR7OpBj68jFsB8rnTaZWM4Sqb/Jx+KXlRB BnNck0PCPoblpT8lgjAD3H9NaXx3mdVsml8i/7YIZjx8Zc4eanRGlsH9DmnHbB7U i4orDvL3SR3ZKVy6Zssti5jt8GwrEnqg97uTbS/jiTai1tOCP9n6U4T/wslHIUR4 rIxvyJnmqrPAiWtVF+0cvGmT =VTJU -----END PGP SIGNATURE----- Merge tag 'vfio-updates-20230509.0' of https://gitlab.com/alex.williamson/qemu into staging VFIO updates 2023-05-09 * Add vf-token device option allowing QEMU to assign VFs where the PF is managed by a userspace driver. (Minwoo Im) * Skip log_sync during migration setup as a potential source of failure and likely source of redundancy. (Avihai Horon) * Virtualize PCIe Resizable BAR capability rather than hiding it, exposing only the current size as available. (Alex Williamson) # -----BEGIN PGP SIGNATURE----- # # iQJPBAABCAA5FiEEQvbATlQL0amee4qQI5ubbjuwiyIFAmRaqfobHGFsZXgud2ls # bGlhbXNvbkByZWRoYXQuY29tAAoJECObm247sIsiwNYP/2KtCbKqylnGPuwLbRMP # HC4Id4mme7jUribmhM7FP57nQrb0tgnQoGvalkmB6M3833e3p4ivH2ezTyPxIawx # UH4mAEBtR03rxh54eVBbOvDVf+XHd6qll/rFw5dBI0C5s7JQyMOourNRLTZLvqzD # 2bwI7dfQzWbXWPj8QGPmDti9wbeATZ3RjqC7onoWq6A6Cw4aRGj1gHBQH9v81iA+ # m8hnZh+e5eFkQRc4mPXxFjm1Kw6ZYXWGoEEZrYPXvQn9+3MDCLcNb++KIrLsGujP # qOnZG534vs+EZtUsGI8F02CBBXMAQFuBZhxCtuuG8iI9OQSE6R3E29iIc0Lpz5aO # s8rN5OW4m7wXPdGkU1/7/N7kdeZvg+R8Jc4ozx3Mez3eSFbVkABSSX9vyvdHAezi # 02Np1+ZBldZWBbBhYbWfqhvcg4iYNnHknSkS2CYY8jdsGttbrNY2f7Xllf3KC/Iv # 6Un5WpU//0LuJjmH6onzswUUEmulchzR7OpBj68jFsB8rnTaZWM4Sqb/Jx+KXlRB # BnNck0PCPoblpT8lgjAD3H9NaXx3mdVsml8i/7YIZjx8Zc4eanRGlsH9DmnHbB7U # i4orDvL3SR3ZKVy6Zssti5jt8GwrEnqg97uTbS/jiTai1tOCP9n6U4T/wslHIUR4 # rIxvyJnmqrPAiWtVF+0cvGmT # =VTJU # -----END PGP SIGNATURE----- # gpg: Signature made Tue 09 May 2023 09:15:54 PM BST # gpg: using RSA key 42F6C04E540BD1A99E7B8A90239B9B6E3BB08B22 # gpg: issuer "alex.williamson@redhat.com" # gpg: Good signature from "Alex Williamson <alex.williamson@redhat.com>" [undefined] # gpg: aka "Alex Williamson <alex@shazbot.org>" [undefined] # gpg: aka "Alex Williamson <alwillia@redhat.com>" [undefined] # gpg: aka "Alex Williamson <alex.l.williamson@gmail.com>" [undefined] # 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: 42F6 C04E 540B D1A9 9E7B 8A90 239B 9B6E 3BB0 8B22 * tag 'vfio-updates-20230509.0' of https://gitlab.com/alex.williamson/qemu: vfio/pci: Static Resizable BAR capability vfio/migration: Skip log_sync during migration SETUP state vfio/pci: add support for VF token Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
b2896c1b09
|
@ -478,7 +478,8 @@ static bool vfio_devices_all_dirty_tracking(VFIOContainer *container)
|
|||
VFIODevice *vbasedev;
|
||||
MigrationState *ms = migrate_get_current();
|
||||
|
||||
if (!migration_is_setup_or_active(ms->state)) {
|
||||
if (ms->state != MIGRATION_STATUS_ACTIVE &&
|
||||
ms->state != MIGRATION_STATUS_DEVICE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -2066,6 +2066,54 @@ static int vfio_add_std_cap(VFIOPCIDevice *vdev, uint8_t pos, Error **errp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int vfio_setup_rebar_ecap(VFIOPCIDevice *vdev, uint16_t pos)
|
||||
{
|
||||
uint32_t ctrl;
|
||||
int i, nbar;
|
||||
|
||||
ctrl = pci_get_long(vdev->pdev.config + pos + PCI_REBAR_CTRL);
|
||||
nbar = (ctrl & PCI_REBAR_CTRL_NBAR_MASK) >> PCI_REBAR_CTRL_NBAR_SHIFT;
|
||||
|
||||
for (i = 0; i < nbar; i++) {
|
||||
uint32_t cap;
|
||||
int size;
|
||||
|
||||
ctrl = pci_get_long(vdev->pdev.config + pos + PCI_REBAR_CTRL + (i * 8));
|
||||
size = (ctrl & PCI_REBAR_CTRL_BAR_SIZE) >> PCI_REBAR_CTRL_BAR_SHIFT;
|
||||
|
||||
/* The cap register reports sizes 1MB to 128TB, with 4 reserved bits */
|
||||
cap = size <= 27 ? 1U << (size + 4) : 0;
|
||||
|
||||
/*
|
||||
* The PCIe spec (v6.0.1, 7.8.6) requires HW to support at least one
|
||||
* size in the range 1MB to 512GB. We intend to mask all sizes except
|
||||
* the one currently enabled in the size field, therefore if it's
|
||||
* outside the range, hide the whole capability as this virtualization
|
||||
* trick won't work. If >512GB resizable BARs start to appear, we
|
||||
* might need an opt-in or reservation scheme in the kernel.
|
||||
*/
|
||||
if (!(cap & PCI_REBAR_CAP_SIZES)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Hide all sizes reported in the ctrl reg per above requirement. */
|
||||
ctrl &= (PCI_REBAR_CTRL_BAR_SIZE |
|
||||
PCI_REBAR_CTRL_NBAR_MASK |
|
||||
PCI_REBAR_CTRL_BAR_IDX);
|
||||
|
||||
/*
|
||||
* The BAR size field is RW, however we've mangled the capability
|
||||
* register such that we only report a single size, ie. the current
|
||||
* BAR size. A write of an unsupported value is undefined, therefore
|
||||
* the register field is essentially RO.
|
||||
*/
|
||||
vfio_add_emulated_long(vdev, pos + PCI_REBAR_CAP + (i * 8), cap, ~0);
|
||||
vfio_add_emulated_long(vdev, pos + PCI_REBAR_CTRL + (i * 8), ctrl, ~0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vfio_add_ext_cap(VFIOPCIDevice *vdev)
|
||||
{
|
||||
PCIDevice *pdev = &vdev->pdev;
|
||||
|
@ -2139,9 +2187,13 @@ static void vfio_add_ext_cap(VFIOPCIDevice *vdev)
|
|||
case 0: /* kernel masked capability */
|
||||
case PCI_EXT_CAP_ID_SRIOV: /* Read-only VF BARs confuse OVMF */
|
||||
case PCI_EXT_CAP_ID_ARI: /* XXX Needs next function virtualization */
|
||||
case PCI_EXT_CAP_ID_REBAR: /* Can't expose read-only */
|
||||
trace_vfio_add_ext_cap_dropped(vdev->vbasedev.name, cap_id, next);
|
||||
break;
|
||||
case PCI_EXT_CAP_ID_REBAR:
|
||||
if (!vfio_setup_rebar_ecap(vdev, next)) {
|
||||
pcie_add_capability(pdev, cap_id, cap_ver, next, size);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
pcie_add_capability(pdev, cap_id, cap_ver, next, size);
|
||||
}
|
||||
|
@ -2856,6 +2908,8 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
|||
int groupid;
|
||||
int i, ret;
|
||||
bool is_mdev;
|
||||
char uuid[UUID_FMT_LEN];
|
||||
char *name;
|
||||
|
||||
if (!vbasedev->sysfsdev) {
|
||||
if (!(~vdev->host.domain || ~vdev->host.bus ||
|
||||
|
@ -2936,7 +2990,15 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
|||
goto error;
|
||||
}
|
||||
|
||||
ret = vfio_get_device(group, vbasedev->name, vbasedev, errp);
|
||||
if (!qemu_uuid_is_null(&vdev->vf_token)) {
|
||||
qemu_uuid_unparse(&vdev->vf_token, uuid);
|
||||
name = g_strdup_printf("%s vf_token=%s", vbasedev->name, uuid);
|
||||
} else {
|
||||
name = vbasedev->name;
|
||||
}
|
||||
|
||||
ret = vfio_get_device(group, name, vbasedev, errp);
|
||||
g_free(name);
|
||||
if (ret) {
|
||||
vfio_put_group(group);
|
||||
goto error;
|
||||
|
@ -3268,6 +3330,7 @@ static void vfio_instance_init(Object *obj)
|
|||
|
||||
static Property vfio_pci_dev_properties[] = {
|
||||
DEFINE_PROP_PCI_HOST_DEVADDR("host", VFIOPCIDevice, host),
|
||||
DEFINE_PROP_UUID_NODEFAULT("vf-token", VFIOPCIDevice, vf_token),
|
||||
DEFINE_PROP_STRING("sysfsdev", VFIOPCIDevice, vbasedev.sysfsdev),
|
||||
DEFINE_PROP_ON_OFF_AUTO("x-pre-copy-dirty-page-tracking", VFIOPCIDevice,
|
||||
vbasedev.pre_copy_dirty_page_tracking,
|
||||
|
|
|
@ -137,6 +137,7 @@ struct VFIOPCIDevice {
|
|||
VFIOVGA *vga; /* 0xa0000, 0x3b0, 0x3c0 */
|
||||
void *igd_opregion;
|
||||
PCIHostDeviceAddress host;
|
||||
QemuUUID vf_token;
|
||||
EventNotifier err_notifier;
|
||||
EventNotifier req_notifier;
|
||||
int (*resetfn)(struct VFIOPCIDevice *);
|
||||
|
|
Loading…
Reference in New Issue