mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
Migration pull 2021-02-08
v2 Dropped vmstate: Fix memory leak in vmstate_handle_alloc Broke on Power Added migration: only check page size match if RAM postcopy is enabled -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEERfXHG0oMt/uXep+pBRYzHrxb/ecFAmAhIE4ACgkQBRYzHrxb /ecPuA/+Pgo++1ZSseJUgbLePwyTVc0jahdcvYEDmLUn8UM6ikBcBXBgUKHdkFW3 bjSSVgB/xxvXSiafBK4xFNrCqSgqMSr3DJcHmvWgv2wVARcYf6Z26Da53LZq1Qru 0tvRyb40Od1f9zb8Zj7e2Y3pjQ9ybLLbjfNhgnOBbQivqWkjZI31oV2KUCWY2+eV T1BEwr6mgYepqhmeB6OvQZtaQVC5toirS6NajNF4nt0vZEIGIvK6/A9erCVU8Tze 5ch1J0MUqgc3q6ZSE/I9BHEy6MaL0X8G6H+ezjxdoRQtbt1iM/YqZJCSrXkAxiLC ROohryb6qVk26+UYuana79faLwrw359WlkwNEE6SEIRSENu+6p7bgN3LZuCILCO7 xJEkeTgy6r40IGCkDC9aWa8pyLHpNX9gyLpGBHdIRD6zEOWaKNtzh7E2uo/T0ann BpcfgQOsYN25hIHiiXnxozUREbx71VDfMq7GqGB6eC3u2+a3U6jpSJb1nNq5NB89 FJYLZy5Rbuy7OStMwfMsxRs7E63XvGgnwrN8FczU/pumCPX4lDYIpnocqinUmP8p XubRQQVaVDSKIq1mvzw7iR/1NsP9vfYvnrAIv941f38NBmDKqdPuMOXR/qB/Kp2Y jB7b1L5/JcXbWsQmK7fda9jmPzFwSO2cTeTiUonk9RfuuDEws0A= =4tbe -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/dgilbert/tags/pull-migration-20210208a' into staging Migration pull 2021-02-08 v2 Dropped vmstate: Fix memory leak in vmstate_handle_alloc Broke on Power Added migration: only check page size match if RAM postcopy is enabled # gpg: Signature made Mon 08 Feb 2021 11:28:14 GMT # gpg: using RSA key 45F5C71B4A0CB7FB977A9FA90516331EBC5BFDE7 # gpg: Good signature from "Dr. David Alan Gilbert (RH2) <dgilbert@redhat.com>" [full] # Primary key fingerprint: 45F5 C71B 4A0C B7FB 977A 9FA9 0516 331E BC5B FDE7 * remotes/dgilbert/tags/pull-migration-20210208a: (27 commits) migration: only check page size match if RAM postcopy is enabled migration: introduce snapshot-{save, load, delete} QMP commands iotests: fix loading of common.config from tests/ subdir iotests: add support for capturing and matching QMP events migration: introduce a delete_snapshot wrapper migration: wire up support for snapshot device selection migration: control whether snapshots are ovewritten block: rename and alter bdrv_all_find_snapshot semantics block: allow specifying name of block device for vmstate storage block: add ability to specify list of blockdevs during snapshot migration: stop returning errno from load_snapshot() migration: Make save_snapshot() return bool, not 0/-1 block: push error reporting into bdrv_all_*_snapshot functions migration: Display the migration blockers migration: Add blocker information migration: Fix a few absurdly defective error messages migration: Fix cache_init()'s "Failed to allocate" error messages migration: Clean up signed vs. unsigned XBZRLE cache-size migration: Fix migrate-set-parameters argument validation migration: introduce 'userfaultfd-wrlat.py' script ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
2436651b26
30 changed files with 2153 additions and 234 deletions
122
scripts/userfaultfd-wrlat.py
Executable file
122
scripts/userfaultfd-wrlat.py
Executable file
|
@ -0,0 +1,122 @@
|
|||
#!/usr/bin/python3
|
||||
#
|
||||
# userfaultfd-wrlat Summarize userfaultfd write fault latencies.
|
||||
# Events are continuously accumulated for the
|
||||
# run, while latency distribution histogram is
|
||||
# dumped each 'interval' seconds.
|
||||
#
|
||||
# For Linux, uses BCC, eBPF.
|
||||
#
|
||||
# USAGE: userfaultfd-lat [interval [count]]
|
||||
#
|
||||
# Copyright Virtuozzo GmbH, 2020
|
||||
#
|
||||
# Authors:
|
||||
# Andrey Gruzdev <andrey.gruzdev@virtuozzo.com>
|
||||
#
|
||||
# This work is licensed under the terms of the GNU GPL, version 2 or
|
||||
# later. See the COPYING file in the top-level directory.
|
||||
|
||||
from __future__ import print_function
|
||||
from bcc import BPF
|
||||
from ctypes import c_ushort, c_int, c_ulonglong
|
||||
from time import sleep
|
||||
from sys import argv
|
||||
|
||||
def usage():
|
||||
print("USAGE: %s [interval [count]]" % argv[0])
|
||||
exit()
|
||||
|
||||
# define BPF program
|
||||
bpf_text = """
|
||||
#include <uapi/linux/ptrace.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
BPF_HASH(ev_start, u32, u64);
|
||||
BPF_HISTOGRAM(ev_delta_hist, u64);
|
||||
|
||||
/* Trace UFFD page fault start event. */
|
||||
static void do_event_start()
|
||||
{
|
||||
/* Using "(u32)" to drop group ID which is upper 32 bits */
|
||||
u32 tid = (u32) bpf_get_current_pid_tgid();
|
||||
u64 ts = bpf_ktime_get_ns();
|
||||
|
||||
ev_start.update(&tid, &ts);
|
||||
}
|
||||
|
||||
/* Trace UFFD page fault end event. */
|
||||
static void do_event_end()
|
||||
{
|
||||
/* Using "(u32)" to drop group ID which is upper 32 bits */
|
||||
u32 tid = (u32) bpf_get_current_pid_tgid();
|
||||
u64 ts = bpf_ktime_get_ns();
|
||||
u64 *tsp;
|
||||
|
||||
tsp = ev_start.lookup(&tid);
|
||||
if (tsp) {
|
||||
u64 delta = ts - (*tsp);
|
||||
/* Transform time delta to milliseconds */
|
||||
ev_delta_hist.increment(bpf_log2l(delta / 1000000));
|
||||
ev_start.delete(&tid);
|
||||
}
|
||||
}
|
||||
|
||||
/* KPROBE for handle_userfault(). */
|
||||
int probe_handle_userfault(struct pt_regs *ctx, struct vm_fault *vmf,
|
||||
unsigned long reason)
|
||||
{
|
||||
/* Trace only UFFD write faults. */
|
||||
if (reason & VM_UFFD_WP) {
|
||||
do_event_start();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* KRETPROBE for handle_userfault(). */
|
||||
int retprobe_handle_userfault(struct pt_regs *ctx)
|
||||
{
|
||||
do_event_end();
|
||||
return 0;
|
||||
}
|
||||
"""
|
||||
|
||||
# arguments
|
||||
interval = 10
|
||||
count = -1
|
||||
if len(argv) > 1:
|
||||
try:
|
||||
interval = int(argv[1])
|
||||
if interval == 0:
|
||||
raise
|
||||
if len(argv) > 2:
|
||||
count = int(argv[2])
|
||||
except: # also catches -h, --help
|
||||
usage()
|
||||
|
||||
# load BPF program
|
||||
b = BPF(text=bpf_text)
|
||||
# attach KRPOBEs
|
||||
b.attach_kprobe(event="handle_userfault", fn_name="probe_handle_userfault")
|
||||
b.attach_kretprobe(event="handle_userfault", fn_name="retprobe_handle_userfault")
|
||||
|
||||
# header
|
||||
print("Tracing UFFD-WP write fault latency... Hit Ctrl-C to end.")
|
||||
|
||||
# output
|
||||
loop = 0
|
||||
do_exit = 0
|
||||
while (1):
|
||||
if count > 0:
|
||||
loop += 1
|
||||
if loop > count:
|
||||
exit()
|
||||
try:
|
||||
sleep(interval)
|
||||
except KeyboardInterrupt:
|
||||
pass; do_exit = 1
|
||||
|
||||
print()
|
||||
b["ev_delta_hist"].print_log2_hist("msecs")
|
||||
if do_exit:
|
||||
exit()
|
Loading…
Add table
Add a link
Reference in a new issue