mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
qapi: Add VFIO devices migration stats in Migration stats
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>
This commit is contained in:
parent
a22651053b
commit
3710586caa
6 changed files with 71 additions and 0 deletions
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -866,6 +870,11 @@ err:
|
|||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
int64_t vfio_mig_bytes_transferred(void)
|
||||
{
|
||||
return bytes_transferred;
|
||||
}
|
||||
|
||||
int vfio_migration_probe(VFIODevice *vbasedev, Error **errp)
|
||||
{
|
||||
VFIOContainer *container = vbasedev->group->container;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
@ -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',
|
||||
|
|
Loading…
Reference in a new issue