block: move AioContext, QEMUTimer, main-loop to libqemuutil
AioContext is fairly self contained, the only dependency is QEMUTimer but that in turn doesn't need anything else. So move them out of block-obj-y to avoid introducing a dependency from io/ to block-obj-y. main-loop and its dependency iohandler also need to be moved, because later in this series io/ will call iohandler_get_aio_context. [Changed copyright "the QEMU team" to "other QEMU contributors" as suggested by Daniel Berrange and agreed by Paolo. --Stefan] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Message-id: 20170213135235.12274-2-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
				
					committed by
					
						
						Stefan Hajnoczi
					
				
			
			
				
	
			
			
			
						parent
						
							56f9e46b84
						
					
				
				
					commit
					c2b38b277a
				
			@@ -9,12 +9,8 @@ chardev-obj-y = chardev/
 | 
			
		||||
#######################################################################
 | 
			
		||||
# block-obj-y is code used by both qemu system emulation and qemu-img
 | 
			
		||||
 | 
			
		||||
block-obj-y = async.o thread-pool.o
 | 
			
		||||
block-obj-y += nbd/
 | 
			
		||||
block-obj-y += block.o blockjob.o
 | 
			
		||||
block-obj-y += main-loop.o iohandler.o qemu-timer.o
 | 
			
		||||
block-obj-$(CONFIG_POSIX) += aio-posix.o
 | 
			
		||||
block-obj-$(CONFIG_WIN32) += aio-win32.o
 | 
			
		||||
block-obj-y += block/
 | 
			
		||||
block-obj-y += qemu-io-cmds.o
 | 
			
		||||
block-obj-$(CONFIG_REPLICATION) += replication.o
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								block/io.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								block/io.c
									
									
									
									
									
								
							@@ -2239,35 +2239,6 @@ BlockAIOCB *bdrv_aio_flush(BlockDriverState *bs,
 | 
			
		||||
    return &acb->common;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *qemu_aio_get(const AIOCBInfo *aiocb_info, BlockDriverState *bs,
 | 
			
		||||
                   BlockCompletionFunc *cb, void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    BlockAIOCB *acb;
 | 
			
		||||
 | 
			
		||||
    acb = g_malloc(aiocb_info->aiocb_size);
 | 
			
		||||
    acb->aiocb_info = aiocb_info;
 | 
			
		||||
    acb->bs = bs;
 | 
			
		||||
    acb->cb = cb;
 | 
			
		||||
    acb->opaque = opaque;
 | 
			
		||||
    acb->refcnt = 1;
 | 
			
		||||
    return acb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_aio_ref(void *p)
 | 
			
		||||
{
 | 
			
		||||
    BlockAIOCB *acb = p;
 | 
			
		||||
    acb->refcnt++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_aio_unref(void *p)
 | 
			
		||||
{
 | 
			
		||||
    BlockAIOCB *acb = p;
 | 
			
		||||
    assert(acb->refcnt > 0);
 | 
			
		||||
    if (--acb->refcnt == 0) {
 | 
			
		||||
        g_free(acb);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**************************************************************/
 | 
			
		||||
/* Coroutine block device emulation */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ stub-obj-y += get-vm-name.o
 | 
			
		||||
stub-obj-y += iothread.o
 | 
			
		||||
stub-obj-y += iothread-lock.o
 | 
			
		||||
stub-obj-y += is-daemonized.o
 | 
			
		||||
stub-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
 | 
			
		||||
stub-obj-y += machine-init-done.o
 | 
			
		||||
stub-obj-y += migr-blocker.o
 | 
			
		||||
stub-obj-y += monitor.o
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								stubs/linux-aio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								stubs/linux-aio.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Linux native AIO support.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 IBM, Corp.
 | 
			
		||||
 * Copyright (C) 2009 Red Hat, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | 
			
		||||
 * See the COPYING file in the top-level directory.
 | 
			
		||||
 */
 | 
			
		||||
#include "qemu/osdep.h"
 | 
			
		||||
#include "block/aio.h"
 | 
			
		||||
#include "block/raw-aio.h"
 | 
			
		||||
 | 
			
		||||
void laio_detach_aio_context(LinuxAioState *s, AioContext *old_context)
 | 
			
		||||
{
 | 
			
		||||
    abort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void laio_attach_aio_context(LinuxAioState *s, AioContext *new_context)
 | 
			
		||||
{
 | 
			
		||||
    abort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
LinuxAioState *laio_init(void)
 | 
			
		||||
{
 | 
			
		||||
    abort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void laio_cleanup(LinuxAioState *s)
 | 
			
		||||
{
 | 
			
		||||
    abort();
 | 
			
		||||
}
 | 
			
		||||
@@ -9,14 +9,3 @@ void qemu_set_fd_handler(int fd,
 | 
			
		||||
{
 | 
			
		||||
    abort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void aio_set_fd_handler(AioContext *ctx,
 | 
			
		||||
                        int fd,
 | 
			
		||||
                        bool is_external,
 | 
			
		||||
                        IOHandler *io_read,
 | 
			
		||||
                        IOHandler *io_write,
 | 
			
		||||
                        AioPollFn *io_poll,
 | 
			
		||||
                        void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    abort();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -45,6 +45,9 @@ check-unit-y += tests/test-visitor-serialization$(EXESUF)
 | 
			
		||||
check-unit-y += tests/test-iov$(EXESUF)
 | 
			
		||||
gcov-files-test-iov-y = util/iov.c
 | 
			
		||||
check-unit-y += tests/test-aio$(EXESUF)
 | 
			
		||||
gcov-files-test-aio-y = util/async.c util/qemu-timer.o
 | 
			
		||||
gcov-files-test-aio-$(CONFIG_WIN32) += util/aio-win32.c
 | 
			
		||||
gcov-files-test-aio-$(CONFIG_POSIX) += util/aio-posix.c
 | 
			
		||||
check-unit-y += tests/test-throttle$(EXESUF)
 | 
			
		||||
gcov-files-test-aio-$(CONFIG_WIN32) = aio-win32.c
 | 
			
		||||
gcov-files-test-aio-$(CONFIG_POSIX) = aio-posix.c
 | 
			
		||||
@@ -517,8 +520,7 @@ tests/check-qjson$(EXESUF): tests/check-qjson.o $(test-util-obj-y)
 | 
			
		||||
tests/check-qom-interface$(EXESUF): tests/check-qom-interface.o $(test-qom-obj-y)
 | 
			
		||||
tests/check-qom-proplist$(EXESUF): tests/check-qom-proplist.o $(test-qom-obj-y)
 | 
			
		||||
 | 
			
		||||
tests/test-char$(EXESUF): tests/test-char.o qemu-timer.o \
 | 
			
		||||
	$(test-util-obj-y) $(qtest-obj-y) $(test-block-obj-y) $(chardev-obj-y)
 | 
			
		||||
tests/test-char$(EXESUF): tests/test-char.o $(test-util-obj-y) $(qtest-obj-y) $(test-io-obj-y) $(chardev-obj-y)
 | 
			
		||||
tests/test-coroutine$(EXESUF): tests/test-coroutine.o $(test-block-obj-y)
 | 
			
		||||
tests/test-aio$(EXESUF): tests/test-aio.o $(test-block-obj-y)
 | 
			
		||||
tests/test-throttle$(EXESUF): tests/test-throttle.o $(test-block-obj-y)
 | 
			
		||||
@@ -551,8 +553,7 @@ tests/test-vmstate$(EXESUF): tests/test-vmstate.o \
 | 
			
		||||
	migration/vmstate.o migration/qemu-file.o \
 | 
			
		||||
        migration/qemu-file-channel.o migration/qjson.o \
 | 
			
		||||
	$(test-io-obj-y)
 | 
			
		||||
tests/test-timed-average$(EXESUF): tests/test-timed-average.o qemu-timer.o \
 | 
			
		||||
	$(test-util-obj-y)
 | 
			
		||||
tests/test-timed-average$(EXESUF): tests/test-timed-average.o $(test-util-obj-y)
 | 
			
		||||
tests/test-base64$(EXESUF): tests/test-base64.o \
 | 
			
		||||
	libqemuutil.a libqemustub.a
 | 
			
		||||
tests/ptimer-test$(EXESUF): tests/ptimer-test.o tests/ptimer-test-stubs.o hw/core/ptimer.o libqemustub.a
 | 
			
		||||
@@ -712,7 +713,7 @@ tests/usb-hcd-ehci-test$(EXESUF): tests/usb-hcd-ehci-test.o $(libqos-usb-obj-y)
 | 
			
		||||
tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o $(libqos-usb-obj-y)
 | 
			
		||||
tests/pc-cpu-test$(EXESUF): tests/pc-cpu-test.o
 | 
			
		||||
tests/postcopy-test$(EXESUF): tests/postcopy-test.o
 | 
			
		||||
tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o qemu-timer.o \
 | 
			
		||||
tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o $(test-util-obj-y) \
 | 
			
		||||
	$(qtest-obj-y) $(test-io-obj-y) $(libqos-virtio-obj-y) $(libqos-pc-obj-y) \
 | 
			
		||||
	$(chardev-obj-y)
 | 
			
		||||
tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								trace-events
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								trace-events
									
									
									
									
									
								
							@@ -25,17 +25,6 @@
 | 
			
		||||
#
 | 
			
		||||
# The <format-string> should be a sprintf()-compatible format string.
 | 
			
		||||
 | 
			
		||||
# aio-posix.c
 | 
			
		||||
run_poll_handlers_begin(void *ctx, int64_t max_ns) "ctx %p max_ns %"PRId64
 | 
			
		||||
run_poll_handlers_end(void *ctx, bool progress) "ctx %p progress %d"
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
# 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"
 | 
			
		||||
 | 
			
		||||
# ioport.c
 | 
			
		||||
cpu_in(unsigned int addr, char size, unsigned int val) "addr %#x(%c) value %u"
 | 
			
		||||
cpu_out(unsigned int addr, char size, unsigned int val) "addr %#x(%c) value %u"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,18 @@
 | 
			
		||||
util-obj-y = osdep.o cutils.o unicode.o qemu-timer-common.o
 | 
			
		||||
util-obj-y += bufferiszero.o
 | 
			
		||||
util-obj-y += lockcnt.o
 | 
			
		||||
util-obj-y += aiocb.o async.o thread-pool.o qemu-timer.o
 | 
			
		||||
util-obj-y += main-loop.o iohandler.o
 | 
			
		||||
util-obj-$(CONFIG_POSIX) += aio-posix.o
 | 
			
		||||
util-obj-$(CONFIG_POSIX) += compatfd.o
 | 
			
		||||
util-obj-$(CONFIG_POSIX) += event_notifier-posix.o
 | 
			
		||||
util-obj-$(CONFIG_POSIX) += mmap-alloc.o
 | 
			
		||||
util-obj-$(CONFIG_POSIX) += oslib-posix.o
 | 
			
		||||
util-obj-$(CONFIG_POSIX) += qemu-openpty.o
 | 
			
		||||
util-obj-$(CONFIG_POSIX) += qemu-thread-posix.o
 | 
			
		||||
util-obj-$(CONFIG_WIN32) += event_notifier-win32.o
 | 
			
		||||
util-obj-$(CONFIG_POSIX) += memfd.o
 | 
			
		||||
util-obj-$(CONFIG_WIN32) += aio-win32.o
 | 
			
		||||
util-obj-$(CONFIG_WIN32) += event_notifier-win32.o
 | 
			
		||||
util-obj-$(CONFIG_WIN32) += oslib-win32.o
 | 
			
		||||
util-obj-$(CONFIG_WIN32) += qemu-thread-win32.o
 | 
			
		||||
util-obj-y += envlist.o path.o module.o
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
#include "qemu/rcu_queue.h"
 | 
			
		||||
#include "qemu/sockets.h"
 | 
			
		||||
#include "qemu/cutils.h"
 | 
			
		||||
#include "trace-root.h"
 | 
			
		||||
#include "trace.h"
 | 
			
		||||
#ifdef CONFIG_EPOLL_CREATE1
 | 
			
		||||
#include <sys/epoll.h>
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										55
									
								
								util/aiocb.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								util/aiocb.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
/*
 | 
			
		||||
 * BlockAIOCB allocation
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2003-2017 Fabrice Bellard and other QEMU contributors
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
 * in the Software without restriction, including without limitation the rights
 | 
			
		||||
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
 * copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
 * THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "qemu/osdep.h"
 | 
			
		||||
#include "block/aio.h"
 | 
			
		||||
 | 
			
		||||
void *qemu_aio_get(const AIOCBInfo *aiocb_info, BlockDriverState *bs,
 | 
			
		||||
                   BlockCompletionFunc *cb, void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    BlockAIOCB *acb;
 | 
			
		||||
 | 
			
		||||
    acb = g_malloc(aiocb_info->aiocb_size);
 | 
			
		||||
    acb->aiocb_info = aiocb_info;
 | 
			
		||||
    acb->bs = bs;
 | 
			
		||||
    acb->cb = cb;
 | 
			
		||||
    acb->opaque = opaque;
 | 
			
		||||
    acb->refcnt = 1;
 | 
			
		||||
    return acb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_aio_ref(void *p)
 | 
			
		||||
{
 | 
			
		||||
    BlockAIOCB *acb = p;
 | 
			
		||||
    acb->refcnt++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_aio_unref(void *p)
 | 
			
		||||
{
 | 
			
		||||
    BlockAIOCB *acb = p;
 | 
			
		||||
    assert(acb->refcnt > 0);
 | 
			
		||||
    if (--acb->refcnt == 0) {
 | 
			
		||||
        g_free(acb);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * QEMU System Emulator
 | 
			
		||||
 * Data plane event loop
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2003-2008 Fabrice Bellard
 | 
			
		||||
 * Copyright (c) 2009-2017 QEMU contributors
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
#include "qemu/queue.h"
 | 
			
		||||
#include "qemu/thread.h"
 | 
			
		||||
#include "qemu/coroutine.h"
 | 
			
		||||
#include "trace-root.h"
 | 
			
		||||
#include "trace.h"
 | 
			
		||||
#include "block/thread-pool.h"
 | 
			
		||||
#include "qemu/main-loop.h"
 | 
			
		||||
 | 
			
		||||
@@ -1,5 +1,16 @@
 | 
			
		||||
# See docs/tracing.txt for syntax documentation.
 | 
			
		||||
 | 
			
		||||
# util/aio-posix.c
 | 
			
		||||
run_poll_handlers_begin(void *ctx, int64_t max_ns) "ctx %p max_ns %"PRId64
 | 
			
		||||
run_poll_handlers_end(void *ctx, bool progress) "ctx %p progress %d"
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
# util/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"
 | 
			
		||||
 | 
			
		||||
# util/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"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user