diff options
author | Maciej S. Szmigiero <maciej.szmigiero@oracle.com> | 2025-03-04 23:03:46 +0100 |
---|---|---|
committer | Cédric Le Goater <clg@redhat.com> | 2025-03-06 06:47:33 +0100 |
commit | bd846c5d583a63eaaf836403515c4bf3748f3bb3 (patch) | |
tree | 19b108fdbf3a9420c0e085432f7d77983a1c6c8f | |
parent | 5963c219a0e60d3f20c09ba2d34671d5e9623e70 (diff) | |
download | qemu-bd846c5d583a63eaaf836403515c4bf3748f3bb3.zip qemu-bd846c5d583a63eaaf836403515c4bf3748f3bb3.tar.gz qemu-bd846c5d583a63eaaf836403515c4bf3748f3bb3.tar.bz2 |
vfio/migration: Convert bytes_transferred counter to atomic
So it can be safety accessed from multiple threads.
This variable type needs to be changed to unsigned long since
32-bit host platforms lack the necessary addition atomics on 64-bit
variables.
Using 32-bit counters on 32-bit host platforms should not be a problem
in practice since they can't realistically address more memory anyway.
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Link: https://lore.kernel.org/qemu-devel/dc391771d2d9ad0f311994f0cb9e666da564aeaf.1741124640.git.maciej.szmigiero@oracle.com
Signed-off-by: Cédric Le Goater <clg@redhat.com>
-rw-r--r-- | hw/vfio/migration.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c index 03890ea..5532787 100644 --- a/hw/vfio/migration.c +++ b/hw/vfio/migration.c @@ -55,7 +55,7 @@ */ #define VFIO_MIG_DEFAULT_DATA_BUFFER_SIZE (1 * MiB) -static int64_t bytes_transferred; +static unsigned long bytes_transferred; static const char *mig_state_to_str(enum vfio_device_mig_state state) { @@ -391,7 +391,7 @@ static ssize_t vfio_save_block(QEMUFile *f, VFIOMigration *migration) qemu_put_be64(f, VFIO_MIG_FLAG_DEV_DATA_STATE); qemu_put_be64(f, data_size); qemu_put_buffer(f, migration->data_buffer, data_size); - bytes_transferred += data_size; + qatomic_add(&bytes_transferred, data_size); trace_vfio_save_block(migration->vbasedev->name, data_size); @@ -1013,12 +1013,12 @@ static int vfio_block_migration(VFIODevice *vbasedev, Error *err, Error **errp) int64_t vfio_mig_bytes_transferred(void) { - return bytes_transferred; + return MIN(qatomic_read(&bytes_transferred), INT64_MAX); } void vfio_reset_bytes_transferred(void) { - bytes_transferred = 0; + qatomic_set(&bytes_transferred, 0); } /* |