| /* | |
| * Event loop thread | |
| * | |
| * Copyright Red Hat Inc., 2013 | |
| * | |
| * Authors: | |
| * Stefan Hajnoczi <stefanha@redhat.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. | |
| * | |
| */ | |
| #ifndef IOTHREAD_H | |
| #define IOTHREAD_H | |
| #include "qemu/aio.h" | |
| #include "qemu/thread.h" | |
| #include "qom/object.h" | |
| #include "system/event-loop-base.h" | |
| #define TYPE_IOTHREAD "iothread" | |
| #ifdef CONFIG_POSIX | |
| /* | |
| * Benchmark results from 2016 on NVMe SSD drives show max polling times around | |
| * 16-32 microseconds yield IOPS improvements for both iodepth=1 and iodepth=32 | |
| * workloads. | |
| */ | |
| #define IOTHREAD_POLL_MAX_NS_DEFAULT 32768ULL | |
| #define IOTHREAD_POLL_GROW_DEFAULT 2ULL | |
| #define IOTHREAD_POLL_SHRINK_DEFAULT 2ULL | |
| #define IOTHREAD_POLL_WEIGHT_DEFAULT 3ULL | |
| #else | |
| #define IOTHREAD_POLL_MAX_NS_DEFAULT 0ULL | |
| #define IOTHREAD_POLL_GROW_DEFAULT 0ULL | |
| #define IOTHREAD_POLL_SHRINK_DEFAULT 0ULL | |
| #define IOTHREAD_POLL_WEIGHT_DEFAULT 0ULL | |
| #endif | |
| struct IOThread { | |
| EventLoopBase parent_obj; | |
| QemuThread thread; | |
| AioContext *ctx; | |
| bool run_gcontext; /* whether we should run gcontext */ | |
| GMainContext *worker_context; | |
| GMainLoop *main_loop; | |
| QemuSemaphore init_done_sem; /* is thread init done? */ | |
| bool stopping; /* has iothread_stop() been called? */ | |
| bool running; /* should iothread_run() continue? */ | |
| int thread_id; | |
| /* AioContext poll parameters */ | |
| int64_t poll_max_ns; | |
| int64_t poll_grow; | |
| int64_t poll_shrink; | |
| int64_t poll_weight; | |
| }; | |
| typedef struct IOThread IOThread; | |
| DECLARE_INSTANCE_CHECKER(IOThread, IOTHREAD, | |
| TYPE_IOTHREAD) | |
| char *iothread_get_id(IOThread *iothread); | |
| IOThread *iothread_by_id(const char *id); | |
| AioContext *iothread_get_aio_context(IOThread *iothread); | |
| GMainContext *iothread_get_g_main_context(IOThread *iothread); | |
| /* | |
| * Helpers used to allocate iothreads for internal use. These | |
| * iothreads will not be seen by monitor clients when query using | |
| * "query-iothreads". | |
| */ | |
| IOThread *iothread_create(const char *id, Error **errp); | |
| void iothread_stop(IOThread *iothread); | |
| void iothread_destroy(IOThread *iothread); | |
| /* | |
| * Returns true if executing within IOThread context, | |
| * false otherwise. | |
| */ | |
| bool qemu_in_iothread(void); | |
| #endif /* IOTHREAD_H */ |