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:
commit
6528013b5f
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
#
|
#
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user