d37d0e365a
When there are many poll handlers it's likely that some of them are idle most of the time. Remove handlers that haven't had activity recently so that the polling loop scales better for guests with a large number of devices. This feature only takes effect for the Linux io_uring fd monitoring implementation because it is capable of combining fd monitoring with userspace polling. The other implementations can't do that and risk starving fds in favor of poll handlers, so don't try this optimization when they are in use. IOPS improves from 10k to 105k when the guest has 100 virtio-blk-pci,num-queues=32 devices and 1 virtio-blk-pci,num-queues=1 device for rw=randread,iodepth=1,bs=4k,ioengine=libaio on NVMe. [Clarified aio_poll_handlers locking discipline explanation in comment after discussion with Paolo Bonzini <pbonzini@redhat.com>. --Stefan] Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Link: https://lore.kernel.org/r/20200305170806.1313245-8-stefanha@redhat.com Message-Id: <20200305170806.1313245-8-stefanha@redhat.com>
86 lines
5.4 KiB
Plaintext
86 lines
5.4 KiB
Plaintext
# See docs/devel/tracing.txt for syntax documentation.
|
|
|
|
# aio-posix.c
|
|
run_poll_handlers_begin(void *ctx, int64_t max_ns, int64_t timeout) "ctx %p max_ns %"PRId64 " timeout %"PRId64
|
|
run_poll_handlers_end(void *ctx, bool progress, int64_t timeout) "ctx %p progress %d new timeout %"PRId64
|
|
poll_shrink(void *ctx, int64_t old, int64_t new) "ctx %p old %"PRId64" new %"PRId64
|
|
poll_grow(void *ctx, int64_t old, int64_t new) "ctx %p old %"PRId64" new %"PRId64
|
|
poll_add(void *ctx, void *node, int fd, unsigned revents) "ctx %p node %p fd %d revents 0x%x"
|
|
poll_remove(void *ctx, void *node, int fd) "ctx %p node %p fd %d"
|
|
|
|
# async.c
|
|
aio_co_schedule(void *ctx, void *co) "ctx %p co %p"
|
|
aio_co_schedule_bh_cb(void *ctx, void *co) "ctx %p co %p"
|
|
|
|
# thread-pool.c
|
|
thread_pool_submit(void *pool, void *req, void *opaque) "pool %p req %p opaque %p"
|
|
thread_pool_complete(void *pool, void *req, void *opaque, int ret) "pool %p req %p opaque %p ret %d"
|
|
thread_pool_cancel(void *req, void *opaque) "req %p opaque %p"
|
|
|
|
# buffer.c
|
|
buffer_resize(const char *buf, size_t olen, size_t len) "%s: old %zd, new %zd"
|
|
buffer_move_empty(const char *buf, size_t len, const char *from) "%s: %zd bytes from %s"
|
|
buffer_move(const char *buf, size_t len, const char *from) "%s: %zd bytes from %s"
|
|
buffer_free(const char *buf, size_t len) "%s: capacity %zd"
|
|
|
|
# filemonitor-inotify.c
|
|
qemu_file_monitor_add_watch(void *mon, const char *dirpath, const char *filename, void *cb, void *opaque, int64_t id) "File monitor %p add watch dir='%s' file='%s' cb=%p opaque=%p id=%" PRId64
|
|
qemu_file_monitor_remove_watch(void *mon, const char *dirpath, int64_t id) "File monitor %p remove watch dir='%s' id=%" PRId64
|
|
qemu_file_monitor_new(void *mon, int fd) "File monitor %p created fd=%d"
|
|
qemu_file_monitor_enable_watch(void *mon, const char *dirpath, int id) "File monitor %p enable watch dir='%s' id=%u"
|
|
qemu_file_monitor_disable_watch(void *mon, const char *dirpath, int id) "Fle monitor %p disable watch dir='%s' id=%u"
|
|
qemu_file_monitor_event(void *mon, const char *dirpath, const char *filename, int mask, unsigned int id) "File monitor %p event dir='%s' file='%s' mask=0x%x id=%u"
|
|
qemu_file_monitor_dispatch(void *mon, const char *dirpath, const char *filename, int ev, void *cb, void *opaque, int64_t id) "File monitor %p dispatch dir='%s' file='%s' ev=%d cb=%p opaque=%p id=%" PRId64
|
|
|
|
# qemu-coroutine.c
|
|
qemu_aio_coroutine_enter(void *ctx, void *from, void *to, void *opaque) "ctx %p from %p to %p opaque %p"
|
|
qemu_coroutine_yield(void *from, void *to) "from %p to %p"
|
|
qemu_coroutine_terminate(void *co) "self %p"
|
|
|
|
# qemu-coroutine-lock.c
|
|
qemu_co_mutex_lock_uncontended(void *mutex, void *self) "mutex %p self %p"
|
|
qemu_co_mutex_lock_entry(void *mutex, void *self) "mutex %p self %p"
|
|
qemu_co_mutex_lock_return(void *mutex, void *self) "mutex %p self %p"
|
|
qemu_co_mutex_unlock_entry(void *mutex, void *self) "mutex %p self %p"
|
|
qemu_co_mutex_unlock_return(void *mutex, void *self) "mutex %p self %p"
|
|
|
|
# oslib-win32.c
|
|
# oslib-posix.c
|
|
qemu_memalign(size_t alignment, size_t size, void *ptr) "alignment %zu size %zu ptr %p"
|
|
qemu_anon_ram_alloc(size_t size, void *ptr) "size %zu ptr %p"
|
|
qemu_vfree(void *ptr) "ptr %p"
|
|
qemu_anon_ram_free(void *ptr, size_t size) "ptr %p size %zu"
|
|
|
|
# hbitmap.c
|
|
hbitmap_iter_skip_words(const void *hb, void *hbi, uint64_t pos, unsigned long cur) "hb %p hbi %p pos %"PRId64" cur 0x%lx"
|
|
hbitmap_reset(void *hb, uint64_t start, uint64_t count, uint64_t sbit, uint64_t ebit) "hb %p items %"PRIu64",%"PRIu64" bits %"PRIu64"..%"PRIu64
|
|
hbitmap_set(void *hb, uint64_t start, uint64_t count, uint64_t sbit, uint64_t ebit) "hb %p items %"PRIu64",%"PRIu64" bits %"PRIu64"..%"PRIu64
|
|
|
|
# lockcnt.c
|
|
lockcnt_fast_path_attempt(const void *lockcnt, int expected, int new) "lockcnt %p fast path %d->%d"
|
|
lockcnt_fast_path_success(const void *lockcnt, int expected, int new) "lockcnt %p fast path %d->%d succeeded"
|
|
lockcnt_unlock_attempt(const void *lockcnt, int expected, int new) "lockcnt %p unlock %d->%d"
|
|
lockcnt_unlock_success(const void *lockcnt, int expected, int new) "lockcnt %p unlock %d->%d succeeded"
|
|
lockcnt_futex_wait_prepare(const void *lockcnt, int expected, int new) "lockcnt %p preparing slow path %d->%d"
|
|
lockcnt_futex_wait(const void *lockcnt, int val) "lockcnt %p waiting on %d"
|
|
lockcnt_futex_wait_resume(const void *lockcnt, int new) "lockcnt %p after wait: %d"
|
|
lockcnt_futex_wake(const void *lockcnt) "lockcnt %p waking up one waiter"
|
|
|
|
# qemu-sockets.c
|
|
socket_listen(int num) "backlog: %d"
|
|
|
|
# qemu-thread-common.h
|
|
qemu_mutex_lock(void *mutex, const char *file, const int line) "waiting on mutex %p (%s:%d)"
|
|
qemu_mutex_locked(void *mutex, const char *file, const int line) "taken mutex %p (%s:%d)"
|
|
qemu_mutex_unlock(void *mutex, const char *file, const int line) "released mutex %p (%s:%d)"
|
|
|
|
# vfio-helpers.c
|
|
qemu_vfio_dma_reset_temporary(void *s) "s %p"
|
|
qemu_vfio_ram_block_added(void *s, void *p, size_t size) "s %p host %p size 0x%zx"
|
|
qemu_vfio_ram_block_removed(void *s, void *p, size_t size) "s %p host %p size 0x%zx"
|
|
qemu_vfio_find_mapping(void *s, void *p) "s %p host %p"
|
|
qemu_vfio_new_mapping(void *s, void *host, size_t size, int index, uint64_t iova) "s %p host %p size %zu index %d iova 0x%"PRIx64
|
|
qemu_vfio_do_mapping(void *s, void *host, size_t size, uint64_t iova) "s %p host %p size %zu iova 0x%"PRIx64
|
|
qemu_vfio_dma_map(void *s, void *host, size_t size, bool temporary, uint64_t *iova) "s %p host %p size %zu temporary %d iova %p"
|
|
qemu_vfio_dma_unmap(void *s, void *host) "s %p host %p"
|