Skip to content

Commit

Permalink
qapi: Add VFIO devices migration stats in Migration stats
Browse files Browse the repository at this point in the history
Added amount of bytes transferred to the VM at destination by all VFIO
devices

Signed-off-by: Kirti Wankhede <kwankhede@nvidia.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
  • Loading branch information
Kirti Wankhede authored and awilliam committed Nov 1, 2020
1 parent a226510 commit 3710586
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 0 deletions.
19 changes: 19 additions & 0 deletions hw/vfio/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,25 @@ const MemoryRegionOps vfio_region_ops = {
* Device state interfaces
*/

bool vfio_mig_active(void)
{
VFIOGroup *group;
VFIODevice *vbasedev;

if (QLIST_EMPTY(&vfio_group_list)) {
return false;
}

QLIST_FOREACH(group, &vfio_group_list, next) {
QLIST_FOREACH(vbasedev, &group->device_list, next) {
if (vbasedev->migration_blocker) {
return false;
}
}
}
return true;
}

static bool vfio_devices_all_stopped_and_saving(VFIOContainer *container)
{
VFIOGroup *group;
Expand Down
9 changes: 9 additions & 0 deletions hw/vfio/migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
#define VFIO_MIG_FLAG_DEV_SETUP_STATE (0xffffffffef100003ULL)
#define VFIO_MIG_FLAG_DEV_DATA_STATE (0xffffffffef100004ULL)

static int64_t bytes_transferred;

static inline int vfio_mig_access(VFIODevice *vbasedev, void *val, int count,
off_t off, bool iswrite)
{
Expand Down Expand Up @@ -255,6 +257,7 @@ static int vfio_save_buffer(QEMUFile *f, VFIODevice *vbasedev, uint64_t *size)
*size = data_size;
}

bytes_transferred += data_size;
return ret;
}

Expand Down Expand Up @@ -785,6 +788,7 @@ static void vfio_migration_state_notifier(Notifier *notifier, void *data)
case MIGRATION_STATUS_CANCELLING:
case MIGRATION_STATUS_CANCELLED:
case MIGRATION_STATUS_FAILED:
bytes_transferred = 0;
ret = vfio_migration_set_state(vbasedev,
~(VFIO_DEVICE_STATE_SAVING | VFIO_DEVICE_STATE_RESUMING),
VFIO_DEVICE_STATE_RUNNING);
Expand Down Expand Up @@ -866,6 +870,11 @@ static int vfio_migration_init(VFIODevice *vbasedev,

/* ---------------------------------------------------------------------- */

int64_t vfio_mig_bytes_transferred(void)
{
return bytes_transferred;
}

int vfio_migration_probe(VFIODevice *vbasedev, Error **errp)
{
VFIOContainer *container = vbasedev->group->container;
Expand Down
3 changes: 3 additions & 0 deletions include/hw/vfio/vfio-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,9 @@ extern const MemoryRegionOps vfio_region_ops;
typedef QLIST_HEAD(VFIOGroupList, VFIOGroup) VFIOGroupList;
extern VFIOGroupList vfio_group_list;

bool vfio_mig_active(void);
int64_t vfio_mig_bytes_transferred(void);

#ifdef CONFIG_LINUX
int vfio_get_region_info(VFIODevice *vbasedev, int index,
struct vfio_region_info **info);
Expand Down
17 changes: 17 additions & 0 deletions migration/migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@
#include "qemu/queue.h"
#include "multifd.h"

#ifdef CONFIG_VFIO
#include "hw/vfio/vfio-common.h"
#endif

#define MAX_THROTTLE (128 << 20) /* Migration transfer speed throttling */

/* Amount of time to allocate to each "chunk" of bandwidth-throttled
Expand Down Expand Up @@ -1037,6 +1041,17 @@ static void populate_disk_info(MigrationInfo *info)
}
}

static void populate_vfio_info(MigrationInfo *info)
{
#ifdef CONFIG_VFIO
if (vfio_mig_active()) {
info->has_vfio = true;
info->vfio = g_malloc0(sizeof(*info->vfio));
info->vfio->transferred = vfio_mig_bytes_transferred();
}
#endif
}

static void fill_source_migration_info(MigrationInfo *info)
{
MigrationState *s = migrate_get_current();
Expand All @@ -1061,6 +1076,7 @@ static void fill_source_migration_info(MigrationInfo *info)
populate_time_info(info, s);
populate_ram_info(info, s);
populate_disk_info(info);
populate_vfio_info(info);
break;
case MIGRATION_STATUS_COLO:
info->has_status = true;
Expand All @@ -1069,6 +1085,7 @@ static void fill_source_migration_info(MigrationInfo *info)
case MIGRATION_STATUS_COMPLETED:
populate_time_info(info, s);
populate_ram_info(info, s);
populate_vfio_info(info);
break;
case MIGRATION_STATUS_FAILED:
info->has_status = true;
Expand Down
6 changes: 6 additions & 0 deletions monitor/hmp-cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,12 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
}
monitor_printf(mon, "]\n");
}

if (info->has_vfio) {
monitor_printf(mon, "vfio device transferred: %" PRIu64 " kbytes\n",
info->vfio->transferred >> 10);
}

qapi_free_MigrationInfo(info);
}

Expand Down
17 changes: 17 additions & 0 deletions qapi/migration.json
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,18 @@
'active', 'postcopy-active', 'postcopy-paused',
'postcopy-recover', 'completed', 'failed', 'colo',
'pre-switchover', 'device', 'wait-unplug' ] }
##
# @VfioStats:
#
# Detailed VFIO devices migration statistics
#
# @transferred: amount of bytes transferred to the target VM by VFIO devices
#
# Since: 5.2
#
##
{ 'struct': 'VfioStats',
'data': {'transferred': 'int' } }

##
# @MigrationInfo:
Expand Down Expand Up @@ -208,11 +220,16 @@
#
# @socket-address: Only used for tcp, to know what the real port is (Since 4.0)
#
# @vfio: @VfioStats containing detailed VFIO devices migration statistics,
# only returned if VFIO device is present, migration is supported by all
# VFIO devices and status is 'active' or 'completed' (since 5.2)
#
# Since: 0.14.0
##
{ 'struct': 'MigrationInfo',
'data': {'*status': 'MigrationStatus', '*ram': 'MigrationStats',
'*disk': 'MigrationStats',
'*vfio': 'VfioStats',
'*xbzrle-cache': 'XBZRLECacheStats',
'*total-time': 'int',
'*expected-downtime': 'int',
Expand Down

0 comments on commit 3710586

Please sign in to comment.