qga-pull-2025-01-06

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEwsLBCepDxjwUI+uE711egWG6hOcFAmd7vqMACgkQ711egWG6
 hOffRxAAotgBsE+o8fsZ2tfOKNPekW0hlw/hceDMJRA2UwOSPfw1fXfw59w4Pnfr
 4xwMC6O8Lu9ohBCBWHUvh3261gJgXQkLASbbzmF2oewfXZyvPXQI8nz78Ol3LBTG
 gL8lwaBci3YuFtc+2/55VdQsWUqtrRMvBW9WSXTEC+0dQJv+VzblXlEF7hQkKppT
 oGiHQL7pEA1UP7bRo4TyaoDnc8a+xz1J+vtEZUZghtreT7I3ELai/PFdo0U99fkf
 HZfjyj2sHCZto+tAokjBcqf2RXDRqUVRsn3GgC1MQbh1LRdfShmhCTbgYYk/1MmD
 0xwiqAsw814W25299LM3xP2LHPm1jKtkZyCyuSXme9QtN9mC3F0TipR+HMRErAj0
 GQTBOJ0LinZsx5U/+ih4/qPj7RRov+SFzpVxBV3NUkpneVFp5FQgOo4n8l+h57ap
 fmkZ6/hb8itn2oux7S9v/LkcmWE3FqThKO6qMXOhBhQDCKpICz8liYO/tPdB4x1Q
 /HHQ9oon0A2eQw/53AYqz0SoazOqNtadg/hsQ11OHDExUjdp4M6hyxtmrJEQz4Et
 AFvIby98lJZCZ1u65dv/Prb+gW0E8AQ5Ib0jJllAm7tL/GjVyhbRlUl8S9R2uTcZ
 Gsb6e3DMBOny/lR9+2M4rCyCqXM58gTohuqtcXvAe8l2a3h23B4=
 =uk2Q
 -----END PGP SIGNATURE-----

Merge tag 'qga-pull-2025-01-06' of https://github.com/kostyanf14/qemu into staging

qga-pull-2025-01-06

# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCAAdFiEEwsLBCepDxjwUI+uE711egWG6hOcFAmd7vqMACgkQ711egWG6
# hOffRxAAotgBsE+o8fsZ2tfOKNPekW0hlw/hceDMJRA2UwOSPfw1fXfw59w4Pnfr
# 4xwMC6O8Lu9ohBCBWHUvh3261gJgXQkLASbbzmF2oewfXZyvPXQI8nz78Ol3LBTG
# gL8lwaBci3YuFtc+2/55VdQsWUqtrRMvBW9WSXTEC+0dQJv+VzblXlEF7hQkKppT
# oGiHQL7pEA1UP7bRo4TyaoDnc8a+xz1J+vtEZUZghtreT7I3ELai/PFdo0U99fkf
# HZfjyj2sHCZto+tAokjBcqf2RXDRqUVRsn3GgC1MQbh1LRdfShmhCTbgYYk/1MmD
# 0xwiqAsw814W25299LM3xP2LHPm1jKtkZyCyuSXme9QtN9mC3F0TipR+HMRErAj0
# GQTBOJ0LinZsx5U/+ih4/qPj7RRov+SFzpVxBV3NUkpneVFp5FQgOo4n8l+h57ap
# fmkZ6/hb8itn2oux7S9v/LkcmWE3FqThKO6qMXOhBhQDCKpICz8liYO/tPdB4x1Q
# /HHQ9oon0A2eQw/53AYqz0SoazOqNtadg/hsQ11OHDExUjdp4M6hyxtmrJEQz4Et
# AFvIby98lJZCZ1u65dv/Prb+gW0E8AQ5Ib0jJllAm7tL/GjVyhbRlUl8S9R2uTcZ
# Gsb6e3DMBOny/lR9+2M4rCyCqXM58gTohuqtcXvAe8l2a3h23B4=
# =uk2Q
# -----END PGP SIGNATURE-----
# gpg: Signature made Mon 06 Jan 2025 06:29:39 EST
# gpg:                using RSA key C2C2C109EA43C63C1423EB84EF5D5E8161BA84E7
# gpg: Good signature from "Kostiantyn Kostiuk (Upstream PR sign) <kkostiuk@redhat.com>" [unknown]
# 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: C2C2 C109 EA43 C63C 1423  EB84 EF5D 5E81 61BA 84E7

* tag 'qga-pull-2025-01-06' of https://github.com/kostyanf14/qemu:
  qemu-ga: Optimize freeze-hook script logic of logging error
  qga: implement a 'guest-get-load' command

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2025-01-06 09:39:02 -05:00
commit 6528013b5f
4 changed files with 90 additions and 4 deletions

View File

@ -2646,6 +2646,7 @@ config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_functio
config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs')) config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range')) config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create')) config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
config_host_data.set('CONFIG_GETLOADAVG', cc.has_function('getloadavg'))
config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range')) config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs')) config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice) config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)

View File

@ -1368,3 +1368,23 @@ char *qga_get_host_name(Error **errp)
return g_steal_pointer(&hostname); return g_steal_pointer(&hostname);
} }
#ifdef CONFIG_GETLOADAVG
GuestLoadAverage *qmp_guest_get_load(Error **errp)
{
double loadavg[3];
GuestLoadAverage *ret = NULL;
if (getloadavg(loadavg, G_N_ELEMENTS(loadavg)) < 0) {
error_setg_errno(errp, errno,
"cannot query load average");
return NULL;
}
ret = g_new0(GuestLoadAverage, 1);
ret->load1m = loadavg[0];
ret->load5m = loadavg[1];
ret->load15m = loadavg[2];
return ret;
}
#endif

View File

@ -1843,6 +1843,43 @@
'if': 'CONFIG_LINUX' 'if': 'CONFIG_LINUX'
} }
##
# @GuestLoadAverage:
#
# Statistics about process load information
#
# @load1m: 1-minute load avage
#
# @load5m: 5-minute load avage
#
# @load15m: 15-minute load avage
#
# Since: 10.0
##
{ 'struct': 'GuestLoadAverage',
'data': {
'load1m': 'number',
'load5m': 'number',
'load15m': 'number'
},
'if': 'CONFIG_GETLOADAVG'
}
##
# @guest-get-load:
#
# Retrieve CPU process load information
#
# Returns: load information
#
# Since: 10.0
##
{ 'command': 'guest-get-load',
'returns': 'GuestLoadAverage',
'if': 'CONFIG_GETLOADAVG'
}
## ##
# @GuestNetworkRoute: # @GuestNetworkRoute:
# #

View File

@ -19,15 +19,43 @@ is_ignored_file() {
return 1 return 1
} }
USE_SYSLOG=0
# if log file is not writable, fallback to syslog
[ ! -w "$LOGFILE" ] && USE_SYSLOG=1
# try to update log file and fallback to syslog if it fails
touch "$LOGFILE" &>/dev/null || USE_SYSLOG=1
# Ensure the log file is writable, fallback to syslog if not
log_message() {
local message="$1"
if [ "$USE_SYSLOG" -eq 0 ]; then
printf "%s: %s\n" "$(date)" "$message" >>"$LOGFILE"
else
logger -t qemu-ga-freeze-hook "$message"
fi
}
# Iterate executables in directory "fsfreeze-hook.d" with the specified args # Iterate executables in directory "fsfreeze-hook.d" with the specified args
[ ! -d "$FSFREEZE_D" ] && exit 0 [ ! -d "$FSFREEZE_D" ] && exit 0
for file in "$FSFREEZE_D"/* ; do for file in "$FSFREEZE_D"/* ; do
is_ignored_file "$file" && continue is_ignored_file "$file" && continue
[ -x "$file" ] || continue [ -x "$file" ] || continue
printf "$(date): execute $file $@\n" >>$LOGFILE
"$file" "$@" >>$LOGFILE 2>&1 log_message "Executing $file $@"
STATUS=$? if [ "$USE_SYSLOG" -eq 0 ]; then
printf "$(date): $file finished with status=$STATUS\n" >>$LOGFILE "$file" "$@" >>"$LOGFILE" 2>&1
STATUS=$?
else
"$file" "$@" 2>&1 | logger -t qemu-ga-freeze-hook
STATUS=${PIPESTATUS[0]}
fi
if [ $STATUS -ne 0 ]; then
log_message "Error: $file finished with status=$STATUS"
else
log_message "$file finished successfully"
fi
done done
exit 0 exit 0