1
The following changes since commit 00928a421d47f49691cace1207481b7aad31b1f1:
1
The following changes since commit ca61fa4b803e5d0abaf6f1ceb690f23bb78a4def:
2
2
3
Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20180626' into staging (2018-06-26 18:23:49 +0100)
3
Merge remote-tracking branch 'remotes/quic/tags/pull-hex-20211006' into staging (2021-10-06 12:11:14 -0700)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
git://github.com/stefanha/qemu.git tags/block-pull-request
7
https://gitlab.com/stefanha/qemu.git tags/block-pull-request
8
8
9
for you to fetch changes up to ed6e2161715c527330f936d44af4c547f25f687e:
9
for you to fetch changes up to 1cc7eada97914f090125e588497986f6f7900514:
10
10
11
linux-aio: properly bubble up errors from initialization (2018-06-27 13:06:34 +0100)
11
iothread: use IOThreadParamInfo in iothread_[set|get]_param() (2021-10-07 15:29:50 +0100)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Pull request
14
Pull request
15
15
16
* Gracefully handle Linux AIO init failure
17
18
----------------------------------------------------------------
16
----------------------------------------------------------------
19
17
20
Nishanth Aravamudan (1):
18
Stefano Garzarella (2):
21
linux-aio: properly bubble up errors from initialization
19
iothread: rename PollParamInfo to IOThreadParamInfo
20
iothread: use IOThreadParamInfo in iothread_[set|get]_param()
22
21
23
Stefan Hajnoczi (1):
22
iothread.c | 28 +++++++++++++++-------------
24
compiler: add a sizeof_field() macro
23
1 file changed, 15 insertions(+), 13 deletions(-)
25
26
include/block/aio.h | 3 +++
27
include/block/raw-aio.h | 2 +-
28
include/hw/xen/io/ring.h | 2 +-
29
include/qemu/compiler.h | 2 ++
30
accel/tcg/translate-all.c | 2 +-
31
block/file-posix.c | 33 ++++++++++++++++++++++++++++-----
32
block/linux-aio.c | 12 +++++++++---
33
hw/display/xenfb.c | 4 ++--
34
hw/net/rocker/rocker_of_dpa.c | 2 +-
35
hw/net/virtio-net.c | 2 +-
36
stubs/linux-aio.c | 2 +-
37
target/i386/kvm.c | 2 +-
38
target/ppc/arch_dump.c | 10 +++++-----
39
target/s390x/arch_dump.c | 20 ++++++++++----------
40
util/async.c | 14 +++++++++++---
41
15 files changed, 77 insertions(+), 35 deletions(-)
42
24
43
--
25
--
44
2.17.1
26
2.31.1
45
27
46
28
29
diff view generated by jsdifflib
1
Determining the size of a field is useful when you don't have a struct
1
From: Stefano Garzarella <sgarzare@redhat.com>
2
variable handy. Open-coding this is ugly.
3
2
4
This patch adds the sizeof_field() macro, which is similar to
3
Commit 1793ad0247 ("iothread: add aio-max-batch parameter") added
5
typeof_field(). Existing instances are updated to use the macro.
4
a new parameter (aio-max-batch) to IOThread and used PollParamInfo
5
structure to handle it.
6
6
7
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
7
Since it is not a parameter of the polling mechanism, we rename the
8
Reviewed-by: John Snow <jsnow@redhat.com>
8
structure to a more generic IOThreadParamInfo.
9
Message-id: 20180614164431.29305-1-stefanha@redhat.com
9
10
Suggested-by: Kevin Wolf <kwolf@redhat.com>
11
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20210727145936.147032-2-sgarzare@redhat.com
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
14
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
---
15
---
12
include/hw/xen/io/ring.h | 2 +-
16
iothread.c | 14 +++++++-------
13
include/qemu/compiler.h | 2 ++
17
1 file changed, 7 insertions(+), 7 deletions(-)
14
accel/tcg/translate-all.c | 2 +-
15
hw/display/xenfb.c | 4 ++--
16
hw/net/rocker/rocker_of_dpa.c | 2 +-
17
hw/net/virtio-net.c | 2 +-
18
target/i386/kvm.c | 2 +-
19
target/ppc/arch_dump.c | 10 +++++-----
20
target/s390x/arch_dump.c | 20 ++++++++++----------
21
9 files changed, 24 insertions(+), 22 deletions(-)
22
18
23
diff --git a/include/hw/xen/io/ring.h b/include/hw/xen/io/ring.h
19
diff --git a/iothread.c b/iothread.c
24
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/xen/io/ring.h
21
--- a/iothread.c
26
+++ b/include/hw/xen/io/ring.h
22
+++ b/iothread.c
27
@@ -XXX,XX +XXX,XX @@ typedef unsigned int RING_IDX;
23
@@ -XXX,XX +XXX,XX @@ static void iothread_complete(UserCreatable *obj, Error **errp)
28
*/
24
typedef struct {
29
#define __CONST_RING_SIZE(_s, _sz) \
25
const char *name;
30
(__RD32(((_sz) - offsetof(struct _s##_sring, ring)) / \
26
ptrdiff_t offset; /* field's byte offset in IOThread struct */
31
-     sizeof(((struct _s##_sring *)0)->ring[0])))
27
-} PollParamInfo;
32
+ sizeof_field(struct _s##_sring, ring[0])))
28
+} IOThreadParamInfo;
33
/*
29
34
* The same for passing in an actual pointer instead of a name tag.
30
-static PollParamInfo poll_max_ns_info = {
35
*/
31
+static IOThreadParamInfo poll_max_ns_info = {
36
diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h
32
"poll-max-ns", offsetof(IOThread, poll_max_ns),
37
index XXXXXXX..XXXXXXX 100644
33
};
38
--- a/include/qemu/compiler.h
34
-static PollParamInfo poll_grow_info = {
39
+++ b/include/qemu/compiler.h
35
+static IOThreadParamInfo poll_grow_info = {
40
@@ -XXX,XX +XXX,XX @@
36
"poll-grow", offsetof(IOThread, poll_grow),
41
(type *) ((char *) __mptr - offsetof(type, member));})
37
};
42
#endif
38
-static PollParamInfo poll_shrink_info = {
43
39
+static IOThreadParamInfo poll_shrink_info = {
44
+#define sizeof_field(type, field) sizeof(((type *)0)->field)
40
"poll-shrink", offsetof(IOThread, poll_shrink),
45
+
41
};
46
/* Convert from a base type to a parent type, with compile time checking. */
42
-static PollParamInfo aio_max_batch_info = {
47
#ifdef __GNUC__
43
+static IOThreadParamInfo aio_max_batch_info = {
48
#define DO_UPCAST(type, field, dev) ( __extension__ ( { \
44
"aio-max-batch", offsetof(IOThread, aio_max_batch),
49
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
45
};
50
index XXXXXXX..XXXXXXX 100644
46
51
--- a/accel/tcg/translate-all.c
47
@@ -XXX,XX +XXX,XX @@ static void iothread_get_param(Object *obj, Visitor *v,
52
+++ b/accel/tcg/translate-all.c
48
const char *name, void *opaque, Error **errp)
53
@@ -XXX,XX +XXX,XX @@ struct page_collection {
54
55
/* Make sure all possible CPU event bits fit in tb->trace_vcpu_dstate */
56
QEMU_BUILD_BUG_ON(CPU_TRACE_DSTATE_MAX_EVENTS >
57
- sizeof(((TranslationBlock *)0)->trace_vcpu_dstate)
58
+ sizeof_field(TranslationBlock, trace_vcpu_dstate)
59
* BITS_PER_BYTE);
60
61
/*
62
diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/hw/display/xenfb.c
65
+++ b/hw/display/xenfb.c
66
@@ -XXX,XX +XXX,XX @@ static int xenfb_configure_fb(struct XenFB *xenfb, size_t fb_len_lim,
67
int width, int height, int depth,
68
size_t fb_len, int offset, int row_stride)
69
{
49
{
70
- size_t mfn_sz = sizeof(*((struct xenfb_page *)0)->pd);
50
IOThread *iothread = IOTHREAD(obj);
71
- size_t pd_len = sizeof(((struct xenfb_page *)0)->pd) / mfn_sz;
51
- PollParamInfo *info = opaque;
72
+ size_t mfn_sz = sizeof_field(struct xenfb_page, pd[0]);
52
+ IOThreadParamInfo *info = opaque;
73
+ size_t pd_len = sizeof_field(struct xenfb_page, pd) / mfn_sz;
53
int64_t *field = (void *)iothread + info->offset;
74
size_t fb_pages = pd_len * XC_PAGE_SIZE / mfn_sz;
54
75
size_t fb_len_max = fb_pages * XC_PAGE_SIZE;
55
visit_type_int64(v, name, field, errp);
76
int max_width, max_height;
56
@@ -XXX,XX +XXX,XX @@ static bool iothread_set_param(Object *obj, Visitor *v,
77
diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c
57
const char *name, void *opaque, Error **errp)
78
index XXXXXXX..XXXXXXX 100644
58
{
79
--- a/hw/net/rocker/rocker_of_dpa.c
59
IOThread *iothread = IOTHREAD(obj);
80
+++ b/hw/net/rocker/rocker_of_dpa.c
60
- PollParamInfo *info = opaque;
81
@@ -XXX,XX +XXX,XX @@ typedef struct of_dpa_flow_key {
61
+ IOThreadParamInfo *info = opaque;
82
62
int64_t *field = (void *)iothread + info->offset;
83
/* Width of key which includes field 'f' in u64s, rounded up */
63
int64_t value;
84
#define FLOW_KEY_WIDTH(f) \
85
- DIV_ROUND_UP(offsetof(OfDpaFlowKey, f) + sizeof(((OfDpaFlowKey *)0)->f), \
86
+ DIV_ROUND_UP(offsetof(OfDpaFlowKey, f) + sizeof_field(OfDpaFlowKey, f), \
87
sizeof(uint64_t))
88
89
typedef struct of_dpa_flow_action {
90
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/hw/net/virtio-net.c
93
+++ b/hw/net/virtio-net.c
94
@@ -XXX,XX +XXX,XX @@
95
* 'container'.
96
*/
97
#define endof(container, field) \
98
- (offsetof(container, field) + sizeof(((container *)0)->field))
99
+ (offsetof(container, field) + sizeof_field(container, field))
100
101
typedef struct VirtIOFeature {
102
uint64_t flags;
103
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
104
index XXXXXXX..XXXXXXX 100644
105
--- a/target/i386/kvm.c
106
+++ b/target/i386/kvm.c
107
@@ -XXX,XX +XXX,XX @@ static int kvm_put_fpu(X86CPU *cpu)
108
#define XSAVE_PKRU 672
109
110
#define XSAVE_BYTE_OFFSET(word_offset) \
111
- ((word_offset) * sizeof(((struct kvm_xsave *)0)->region[0]))
112
+ ((word_offset) * sizeof_field(struct kvm_xsave, region[0]))
113
114
#define ASSERT_OFFSET(word_offset, field) \
115
QEMU_BUILD_BUG_ON(XSAVE_BYTE_OFFSET(word_offset) != \
116
diff --git a/target/ppc/arch_dump.c b/target/ppc/arch_dump.c
117
index XXXXXXX..XXXXXXX 100644
118
--- a/target/ppc/arch_dump.c
119
+++ b/target/ppc/arch_dump.c
120
@@ -XXX,XX +XXX,XX @@ static const struct NoteFuncDescStruct {
121
int contents_size;
122
void (*note_contents_func)(NoteFuncArg *arg, PowerPCCPU *cpu);
123
} note_func[] = {
124
- {sizeof(((Note *)0)->contents.prstatus), ppc_write_elf_prstatus},
125
- {sizeof(((Note *)0)->contents.fpregset), ppc_write_elf_fpregset},
126
- {sizeof(((Note *)0)->contents.vmxregset), ppc_write_elf_vmxregset},
127
- {sizeof(((Note *)0)->contents.vsxregset), ppc_write_elf_vsxregset},
128
- {sizeof(((Note *)0)->contents.speregset), ppc_write_elf_speregset},
129
+ {sizeof_field(Note, contents.prstatus), ppc_write_elf_prstatus},
130
+ {sizeof_field(Note, contents.fpregset), ppc_write_elf_fpregset},
131
+ {sizeof_field(Note, contents.vmxregset), ppc_write_elf_vmxregset},
132
+ {sizeof_field(Note, contents.vsxregset), ppc_write_elf_vsxregset},
133
+ {sizeof_field(Note, contents.speregset), ppc_write_elf_speregset},
134
{ 0, NULL}
135
};
136
137
diff --git a/target/s390x/arch_dump.c b/target/s390x/arch_dump.c
138
index XXXXXXX..XXXXXXX 100644
139
--- a/target/s390x/arch_dump.c
140
+++ b/target/s390x/arch_dump.c
141
@@ -XXX,XX +XXX,XX @@ typedef struct NoteFuncDescStruct {
142
} NoteFuncDesc;
143
144
static const NoteFuncDesc note_core[] = {
145
- {sizeof(((Note *)0)->contents.prstatus), s390x_write_elf64_prstatus},
146
- {sizeof(((Note *)0)->contents.fpregset), s390x_write_elf64_fpregset},
147
+ {sizeof_field(Note, contents.prstatus), s390x_write_elf64_prstatus},
148
+ {sizeof_field(Note, contents.fpregset), s390x_write_elf64_fpregset},
149
{ 0, NULL}
150
};
151
152
static const NoteFuncDesc note_linux[] = {
153
- {sizeof(((Note *)0)->contents.prefix), s390x_write_elf64_prefix},
154
- {sizeof(((Note *)0)->contents.ctrs), s390x_write_elf64_ctrs},
155
- {sizeof(((Note *)0)->contents.timer), s390x_write_elf64_timer},
156
- {sizeof(((Note *)0)->contents.todcmp), s390x_write_elf64_todcmp},
157
- {sizeof(((Note *)0)->contents.todpreg), s390x_write_elf64_todpreg},
158
- {sizeof(((Note *)0)->contents.vregslo), s390x_write_elf64_vregslo},
159
- {sizeof(((Note *)0)->contents.vregshi), s390x_write_elf64_vregshi},
160
- {sizeof(((Note *)0)->contents.gscb), s390x_write_elf64_gscb},
161
+ {sizeof_field(Note, contents.prefix), s390x_write_elf64_prefix},
162
+ {sizeof_field(Note, contents.ctrs), s390x_write_elf64_ctrs},
163
+ {sizeof_field(Note, contents.timer), s390x_write_elf64_timer},
164
+ {sizeof_field(Note, contents.todcmp), s390x_write_elf64_todcmp},
165
+ {sizeof_field(Note, contents.todpreg), s390x_write_elf64_todpreg},
166
+ {sizeof_field(Note, contents.vregslo), s390x_write_elf64_vregslo},
167
+ {sizeof_field(Note, contents.vregshi), s390x_write_elf64_vregshi},
168
+ {sizeof_field(Note, contents.gscb), s390x_write_elf64_gscb},
169
{ 0, NULL}
170
};
171
64
172
--
65
--
173
2.17.1
66
2.31.1
174
67
175
68
diff view generated by jsdifflib
1
From: Nishanth Aravamudan <naravamudan@digitalocean.com>
1
From: Stefano Garzarella <sgarzare@redhat.com>
2
2
3
laio_init() can fail for a couple of reasons, which will lead to a NULL
3
Commit 0445409d74 ("iothread: generalize
4
pointer dereference in laio_attach_aio_context().
4
iothread_set_param/iothread_get_param") moved common code to set and
5
get IOThread parameters in two new functions.
5
6
6
To solve this, add a aio_setup_linux_aio() function which is called
7
These functions are called inside callbacks, so we don't need to use an
7
early in raw_open_common. If this fails, propagate the error up. The
8
opaque pointer. Let's replace `void *opaque` parameter with
8
signature of aio_get_linux_aio() was not modified, because it seems
9
`IOThreadParamInfo *info`.
9
preferable to return the actual errno from the possible failing
10
initialization calls.
11
10
12
Additionally, when the AioContext changes, we need to associate a
11
Suggested-by: Kevin Wolf <kwolf@redhat.com>
13
LinuxAioState with the new AioContext. Use the bdrv_attach_aio_context
12
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
14
callback and call the new aio_setup_linux_aio(), which will allocate a
13
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
new AioContext if needed, and return errors on failures. If it fails for
14
Message-id: 20210727145936.147032-3-sgarzare@redhat.com
16
any reason, fallback to threaded AIO with an error message, as the
17
device is already in-use by the guest.
18
19
Add an assert that aio_get_linux_aio() cannot return NULL.
20
21
Signed-off-by: Nishanth Aravamudan <naravamudan@digitalocean.com>
22
Message-id: 20180622193700.6523-1-naravamudan@digitalocean.com
23
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
15
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
24
---
16
---
25
include/block/aio.h | 3 +++
17
iothread.c | 18 ++++++++++--------
26
include/block/raw-aio.h | 2 +-
18
1 file changed, 10 insertions(+), 8 deletions(-)
27
block/file-posix.c | 33 ++++++++++++++++++++++++++++-----
28
block/linux-aio.c | 12 +++++++++---
29
stubs/linux-aio.c | 2 +-
30
util/async.c | 14 +++++++++++---
31
6 files changed, 53 insertions(+), 13 deletions(-)
32
19
33
diff --git a/include/block/aio.h b/include/block/aio.h
20
diff --git a/iothread.c b/iothread.c
34
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
35
--- a/include/block/aio.h
22
--- a/iothread.c
36
+++ b/include/block/aio.h
23
+++ b/iothread.c
37
@@ -XXX,XX +XXX,XX @@ GSource *aio_get_g_source(AioContext *ctx);
24
@@ -XXX,XX +XXX,XX @@ static IOThreadParamInfo aio_max_batch_info = {
38
/* Return the ThreadPool bound to this AioContext */
25
};
39
struct ThreadPool *aio_get_thread_pool(AioContext *ctx);
26
40
27
static void iothread_get_param(Object *obj, Visitor *v,
41
+/* Setup the LinuxAioState bound to this AioContext */
28
- const char *name, void *opaque, Error **errp)
42
+struct LinuxAioState *aio_setup_linux_aio(AioContext *ctx, Error **errp);
29
+ const char *name, IOThreadParamInfo *info, Error **errp)
43
+
30
{
44
/* Return the LinuxAioState bound to this AioContext */
31
IOThread *iothread = IOTHREAD(obj);
45
struct LinuxAioState *aio_get_linux_aio(AioContext *ctx);
32
- IOThreadParamInfo *info = opaque;
46
33
int64_t *field = (void *)iothread + info->offset;
47
diff --git a/include/block/raw-aio.h b/include/block/raw-aio.h
34
48
index XXXXXXX..XXXXXXX 100644
35
visit_type_int64(v, name, field, errp);
49
--- a/include/block/raw-aio.h
36
}
50
+++ b/include/block/raw-aio.h
37
51
@@ -XXX,XX +XXX,XX @@
38
static bool iothread_set_param(Object *obj, Visitor *v,
52
/* linux-aio.c - Linux native implementation */
39
- const char *name, void *opaque, Error **errp)
53
#ifdef CONFIG_LINUX_AIO
40
+ const char *name, IOThreadParamInfo *info, Error **errp)
54
typedef struct LinuxAioState LinuxAioState;
41
{
55
-LinuxAioState *laio_init(void);
42
IOThread *iothread = IOTHREAD(obj);
56
+LinuxAioState *laio_init(Error **errp);
43
- IOThreadParamInfo *info = opaque;
57
void laio_cleanup(LinuxAioState *s);
44
int64_t *field = (void *)iothread + info->offset;
58
int coroutine_fn laio_co_submit(BlockDriverState *bs, LinuxAioState *s, int fd,
45
int64_t value;
59
uint64_t offset, QEMUIOVector *qiov, int type);
46
60
diff --git a/block/file-posix.c b/block/file-posix.c
47
@@ -XXX,XX +XXX,XX @@ static bool iothread_set_param(Object *obj, Visitor *v,
61
index XXXXXXX..XXXXXXX 100644
48
static void iothread_get_poll_param(Object *obj, Visitor *v,
62
--- a/block/file-posix.c
49
const char *name, void *opaque, Error **errp)
63
+++ b/block/file-posix.c
50
{
64
@@ -XXX,XX +XXX,XX @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
51
+ IOThreadParamInfo *info = opaque;
65
52
66
#ifdef CONFIG_LINUX_AIO
53
- iothread_get_param(obj, v, name, opaque, errp);
67
/* Currently Linux does AIO only for files opened with O_DIRECT */
54
+ iothread_get_param(obj, v, name, info, errp);
68
- if (s->use_linux_aio && !(s->open_flags & O_DIRECT)) {
55
}
69
- error_setg(errp, "aio=native was specified, but it requires "
56
70
- "cache.direct=on, which was not specified.");
57
static void iothread_set_poll_param(Object *obj, Visitor *v,
71
- ret = -EINVAL;
58
const char *name, void *opaque, Error **errp)
72
- goto fail;
59
{
73
+ if (s->use_linux_aio) {
60
IOThread *iothread = IOTHREAD(obj);
74
+ if (!(s->open_flags & O_DIRECT)) {
61
+ IOThreadParamInfo *info = opaque;
75
+ error_setg(errp, "aio=native was specified, but it requires "
62
76
+ "cache.direct=on, which was not specified.");
63
- if (!iothread_set_param(obj, v, name, opaque, errp)) {
77
+ ret = -EINVAL;
64
+ if (!iothread_set_param(obj, v, name, info, errp)) {
78
+ goto fail;
65
return;
79
+ }
80
+ if (!aio_setup_linux_aio(bdrv_get_aio_context(bs), errp)) {
81
+ error_prepend(errp, "Unable to use native AIO: ");
82
+ goto fail;
83
+ }
84
}
66
}
85
#else
67
86
if (s->use_linux_aio) {
68
@@ -XXX,XX +XXX,XX @@ static void iothread_set_poll_param(Object *obj, Visitor *v,
87
@@ -XXX,XX +XXX,XX @@ static BlockAIOCB *raw_aio_flush(BlockDriverState *bs,
69
static void iothread_get_aio_param(Object *obj, Visitor *v,
88
return paio_submit(bs, s->fd, 0, NULL, 0, cb, opaque, QEMU_AIO_FLUSH);
70
const char *name, void *opaque, Error **errp)
71
{
72
+ IOThreadParamInfo *info = opaque;
73
74
- iothread_get_param(obj, v, name, opaque, errp);
75
+ iothread_get_param(obj, v, name, info, errp);
89
}
76
}
90
77
91
+static void raw_aio_attach_aio_context(BlockDriverState *bs,
78
static void iothread_set_aio_param(Object *obj, Visitor *v,
92
+ AioContext *new_context)
79
const char *name, void *opaque, Error **errp)
93
+{
94
+#ifdef CONFIG_LINUX_AIO
95
+ BDRVRawState *s = bs->opaque;
96
+ if (s->use_linux_aio) {
97
+ Error *local_err;
98
+ if (!aio_setup_linux_aio(new_context, &local_err)) {
99
+ error_reportf_err(local_err, "Unable to use native AIO, "
100
+ "falling back to thread pool: ");
101
+ s->use_linux_aio = false;
102
+ }
103
+ }
104
+#endif
105
+}
106
+
107
static void raw_close(BlockDriverState *bs)
108
{
80
{
109
BDRVRawState *s = bs->opaque;
81
IOThread *iothread = IOTHREAD(obj);
110
@@ -XXX,XX +XXX,XX @@ BlockDriver bdrv_file = {
82
+ IOThreadParamInfo *info = opaque;
111
.bdrv_refresh_limits = raw_refresh_limits,
83
112
.bdrv_io_plug = raw_aio_plug,
84
- if (!iothread_set_param(obj, v, name, opaque, errp)) {
113
.bdrv_io_unplug = raw_aio_unplug,
85
+ if (!iothread_set_param(obj, v, name, info, errp)) {
114
+ .bdrv_attach_aio_context = raw_aio_attach_aio_context,
86
return;
115
116
.bdrv_truncate = raw_truncate,
117
.bdrv_getlength = raw_getlength,
118
diff --git a/block/linux-aio.c b/block/linux-aio.c
119
index XXXXXXX..XXXXXXX 100644
120
--- a/block/linux-aio.c
121
+++ b/block/linux-aio.c
122
@@ -XXX,XX +XXX,XX @@
123
#include "block/raw-aio.h"
124
#include "qemu/event_notifier.h"
125
#include "qemu/coroutine.h"
126
+#include "qapi/error.h"
127
128
#include <libaio.h>
129
130
@@ -XXX,XX +XXX,XX @@ void laio_attach_aio_context(LinuxAioState *s, AioContext *new_context)
131
qemu_laio_poll_cb);
132
}
133
134
-LinuxAioState *laio_init(void)
135
+LinuxAioState *laio_init(Error **errp)
136
{
137
+ int rc;
138
LinuxAioState *s;
139
140
s = g_malloc0(sizeof(*s));
141
- if (event_notifier_init(&s->e, false) < 0) {
142
+ rc = event_notifier_init(&s->e, false);
143
+ if (rc < 0) {
144
+ error_setg_errno(errp, -rc, "failed to to initialize event notifier");
145
goto out_free_state;
146
}
87
}
147
88
148
- if (io_setup(MAX_EVENTS, &s->ctx) != 0) {
149
+ rc = io_setup(MAX_EVENTS, &s->ctx);
150
+ if (rc < 0) {
151
+ error_setg_errno(errp, -rc, "failed to create linux AIO context");
152
goto out_close_efd;
153
}
154
155
diff --git a/stubs/linux-aio.c b/stubs/linux-aio.c
156
index XXXXXXX..XXXXXXX 100644
157
--- a/stubs/linux-aio.c
158
+++ b/stubs/linux-aio.c
159
@@ -XXX,XX +XXX,XX @@ void laio_attach_aio_context(LinuxAioState *s, AioContext *new_context)
160
abort();
161
}
162
163
-LinuxAioState *laio_init(void)
164
+LinuxAioState *laio_init(Error **errp)
165
{
166
abort();
167
}
168
diff --git a/util/async.c b/util/async.c
169
index XXXXXXX..XXXXXXX 100644
170
--- a/util/async.c
171
+++ b/util/async.c
172
@@ -XXX,XX +XXX,XX @@ ThreadPool *aio_get_thread_pool(AioContext *ctx)
173
}
174
175
#ifdef CONFIG_LINUX_AIO
176
-LinuxAioState *aio_get_linux_aio(AioContext *ctx)
177
+LinuxAioState *aio_setup_linux_aio(AioContext *ctx, Error **errp)
178
{
179
if (!ctx->linux_aio) {
180
- ctx->linux_aio = laio_init();
181
- laio_attach_aio_context(ctx->linux_aio, ctx);
182
+ ctx->linux_aio = laio_init(errp);
183
+ if (ctx->linux_aio) {
184
+ laio_attach_aio_context(ctx->linux_aio, ctx);
185
+ }
186
}
187
return ctx->linux_aio;
188
}
189
+
190
+LinuxAioState *aio_get_linux_aio(AioContext *ctx)
191
+{
192
+ assert(ctx->linux_aio);
193
+ return ctx->linux_aio;
194
+}
195
#endif
196
197
void aio_notify(AioContext *ctx)
198
--
89
--
199
2.17.1
90
2.31.1
200
91
201
92
diff view generated by jsdifflib