Skip to content

Commit 38d0939

Browse files
committed
Merge tag 'pull-vfio-20241226' of https://github.com/legoater/qemu into staging
vfio queue: * Add support for IGD passthrough on all Intel Gen 11 and 12 devices * Refactor dirty tracking engine to include VFIO state in calc-dirty-rate * Drop usage migration_is_device() and migration_is_active() # -----BEGIN PGP SIGNATURE----- # # iQIzBAABCAAdFiEEoPZlSPBIlev+awtgUaNDx8/77KEFAmdtFXUACgkQUaNDx8/7 # 7KGDgQ//bjcz061VL+8pFv5eOSPKXa7m0hTFIjGswk8y6i3izs8c6WXX2RWwfOXn # 0vLE87XpEoTr494RC6qT/QIhuzfIm+mFb91U/jpjn7TSIrVzvWzI9qVUqKAjvVES # M0BWNi4oCvZMAoADPJ7wvXbQO5eDSUauF5AeHGRUpy34DFwnHLmOCLe+Cj5L732H # EOL+QCNf2y/iR36Anh2VyDaaFDPCx7BBF+SApWR93jAnpe3kIXSQczn0wLeXoELB # Q7FhLSOEicuZUF6pgTYMJ7hpGdZMv9AopTDt4owoDgxYXr0PQ0YWy+fsG5mlavnd # DHo9qmHKjkbzPHSV5tlim2zDbqu4lRnC6NzJTtVzzFfyrrXTQYTNZh7usVRiG9VN # JQNNmT5L14tso0YSCgc+KeqjYnV12ZktYsZosoJHKQ2pkpoZRUFQUtXfnRrQGmNt # RnfNv60Mez1PcWvt17Gq4S5JM+XUgsB6Jpm8tLj1eGowurCerFwLNRK5U09cBKLa # WprF+b5KmSDQuqiWpmssmuKbvfSyeC8NVgrpRXEkDyivnJYkELki9H6Ec7ATUNyI # 4ZiX1GlvofKqgiDX8ZUafnz3z4++lgLvOkMb5e/n/oktzUM6gzAds/4mGXLm6hxk # 8gZb/Hrfjhv0PLIVzphMxv+N3U0nu2CVNJzMcmzFGkqlsnLqgO0= # =F4P6 # -----END PGP SIGNATURE----- # gpg: Signature made Thu 26 Dec 2024 03:36:05 EST # gpg: using RSA key A0F66548F04895EBFE6B0B6051A343C7CFFBECA1 # gpg: Good signature from "Cédric Le Goater <[email protected]>" [full] # gpg: aka "Cédric Le Goater <[email protected]>" [full] # Primary key fingerprint: A0F6 6548 F048 95EB FE6B 0B60 51A3 43C7 CFFB ECA1 * tag 'pull-vfio-20241226' of https://github.com/legoater/qemu: migration: Unexport migration_is_active() migration: Drop migration_is_device() system/dirtylimit: Don't use migration_is_active() vfio/migration: Rename vfio_devices_all_dirty_tracking() vfio/migration: Refactor vfio_devices_all_running_and_mig_active() logic vfio/migration: Refactor vfio_devices_all_dirty_tracking() logic vfio/container: Add dirty tracking started flag vfio/igd: add x-igd-gms option back to set DSM region size for guest vfio/igd: emulate BDSM in mmio bar0 for gen 6-10 devices vfio/igd: emulate GGC register in mmio bar0 vfio/igd: add macro for declaring mirrored registers vfio/igd: add Alder/Raptor/Rocket/Ice/Jasper Lake device ids vfio/igd: add Gemini Lake and Comet Lake device ids vfio/igd: canonicalize memory size calculations vfio/igd: align generation with i915 kernel driver vfio/igd: remove unsupported device ids vfio/igd: fix GTT stolen memory size calculation for gen 8+ Signed-off-by: Stefan Hajnoczi <[email protected]>
2 parents a7f7754 + 3bdb1a7 commit 38d0939

File tree

9 files changed

+214
-154
lines changed

9 files changed

+214
-154
lines changed

hw/vfio/common.c

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,32 @@ bool vfio_device_state_is_precopy(VFIODevice *vbasedev)
170170
migration->device_state == VFIO_DEVICE_STATE_PRE_COPY_P2P;
171171
}
172172

173-
static bool vfio_devices_all_dirty_tracking(VFIOContainerBase *bcontainer)
173+
static bool vfio_devices_all_device_dirty_tracking_started(
174+
const VFIOContainerBase *bcontainer)
174175
{
175176
VFIODevice *vbasedev;
176177

177-
if (!migration_is_active() && !migration_is_device()) {
178+
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
179+
if (!vbasedev->dirty_tracking) {
180+
return false;
181+
}
182+
}
183+
184+
return true;
185+
}
186+
187+
bool vfio_devices_all_dirty_tracking_started(
188+
const VFIOContainerBase *bcontainer)
189+
{
190+
return vfio_devices_all_device_dirty_tracking_started(bcontainer) ||
191+
bcontainer->dirty_pages_started;
192+
}
193+
194+
static bool vfio_log_sync_needed(const VFIOContainerBase *bcontainer)
195+
{
196+
VFIODevice *vbasedev;
197+
198+
if (!vfio_devices_all_dirty_tracking_started(bcontainer)) {
178199
return false;
179200
}
180201

@@ -210,36 +231,6 @@ bool vfio_devices_all_device_dirty_tracking(const VFIOContainerBase *bcontainer)
210231
return true;
211232
}
212233

213-
/*
214-
* Check if all VFIO devices are running and migration is active, which is
215-
* essentially equivalent to the migration being in pre-copy phase.
216-
*/
217-
bool
218-
vfio_devices_all_running_and_mig_active(const VFIOContainerBase *bcontainer)
219-
{
220-
VFIODevice *vbasedev;
221-
222-
if (!migration_is_active()) {
223-
return false;
224-
}
225-
226-
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
227-
VFIOMigration *migration = vbasedev->migration;
228-
229-
if (!migration) {
230-
return false;
231-
}
232-
233-
if (vfio_device_state_is_running(vbasedev) ||
234-
vfio_device_state_is_precopy(vbasedev)) {
235-
continue;
236-
} else {
237-
return false;
238-
}
239-
}
240-
return true;
241-
}
242-
243234
static bool vfio_listener_skipped_section(MemoryRegionSection *section)
244235
{
245236
return (!memory_region_is_ram(section->mr) &&
@@ -1373,7 +1364,7 @@ static void vfio_listener_log_sync(MemoryListener *listener,
13731364
return;
13741365
}
13751366

1376-
if (vfio_devices_all_dirty_tracking(bcontainer)) {
1367+
if (vfio_log_sync_needed(bcontainer)) {
13771368
ret = vfio_sync_dirty_bitmap(bcontainer, section, &local_err);
13781369
if (ret) {
13791370
error_report_err(local_err);

hw/vfio/container-base.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,23 @@ int vfio_container_set_dirty_page_tracking(VFIOContainerBase *bcontainer,
6464
bool start, Error **errp)
6565
{
6666
VFIOIOMMUClass *vioc = VFIO_IOMMU_GET_CLASS(bcontainer);
67+
int ret;
6768

6869
if (!bcontainer->dirty_pages_supported) {
6970
return 0;
7071
}
7172

7273
g_assert(vioc->set_dirty_page_tracking);
73-
return vioc->set_dirty_page_tracking(bcontainer, start, errp);
74+
if (bcontainer->dirty_pages_started == start) {
75+
return 0;
76+
}
77+
78+
ret = vioc->set_dirty_page_tracking(bcontainer, start, errp);
79+
if (!ret) {
80+
bcontainer->dirty_pages_started = start;
81+
}
82+
83+
return ret;
7484
}
7585

7686
int vfio_container_query_dirty_bitmap(const VFIOContainerBase *bcontainer,

hw/vfio/container.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ static int vfio_legacy_dma_unmap(const VFIOContainerBase *bcontainer,
131131
int ret;
132132
Error *local_err = NULL;
133133

134-
if (iotlb && vfio_devices_all_running_and_mig_active(bcontainer)) {
134+
if (iotlb && vfio_devices_all_dirty_tracking_started(bcontainer)) {
135135
if (!vfio_devices_all_device_dirty_tracking(bcontainer) &&
136136
bcontainer->dirty_pages_supported) {
137137
return vfio_dma_unmap_bitmap(container, iova, size, iotlb);

0 commit comments

Comments
 (0)