1
The following changes since commit 00928a421d47f49691cace1207481b7aad31b1f1:
1
The following changes since commit 15ef89d2a1a7b93845a6b09c2ee8e1979f6eb30b:
2
2
3
Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20180626' into staging (2018-06-26 18:23:49 +0100)
3
Update version for v7.0.0-rc1 release (2022-03-22 22:58:44 +0000)
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 2539eade4f689eda7e9fe45486f18334bfbafaf0:
10
10
11
linux-aio: properly bubble up errors from initialization (2018-06-27 13:06:34 +0100)
11
hw: Fix misleading hexadecimal format (2022-03-24 10:38:42 +0000)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Pull request
14
Pull request
15
15
16
* Gracefully handle Linux AIO init failure
16
Philippe found cases where the 0x%d format string was used, leading to
17
misleading output. The patches look harmless and could save people time, so I
18
think it's worth including them in 7.0.
17
19
18
----------------------------------------------------------------
20
----------------------------------------------------------------
19
21
20
Nishanth Aravamudan (1):
22
Philippe Mathieu-Daudé (2):
21
linux-aio: properly bubble up errors from initialization
23
block: Fix misleading hexadecimal format
24
hw: Fix misleading hexadecimal format
22
25
23
Stefan Hajnoczi (1):
26
block/parallels-ext.c | 2 +-
24
compiler: add a sizeof_field() macro
27
hw/i386/sgx.c | 2 +-
25
28
hw/i386/trace-events | 6 +++---
26
include/block/aio.h | 3 +++
29
hw/misc/trace-events | 4 ++--
27
include/block/raw-aio.h | 2 +-
30
hw/scsi/trace-events | 4 ++--
28
include/hw/xen/io/ring.h | 2 +-
31
5 files changed, 9 insertions(+), 9 deletions(-)
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
32
43
--
33
--
44
2.17.1
34
2.35.1
45
35
46
diff view generated by jsdifflib
1
Determining the size of a field is useful when you don't have a struct
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
variable handy. Open-coding this is ugly.
3
2
4
This patch adds the sizeof_field() macro, which is similar to
3
"0x%u" format is very misleading, replace by "0x%x".
5
typeof_field(). Existing instances are updated to use the macro.
6
4
7
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
5
Found running:
8
Reviewed-by: John Snow <jsnow@redhat.com>
6
9
Message-id: 20180614164431.29305-1-stefanha@redhat.com
7
$ git grep -E '0x%[0-9]*([lL]*|" ?PRI)[dDuU]' block/
8
9
Inspired-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
12
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
13
Reviewed-by: Denis V. Lunev <den@openvz.org>
14
Message-id: 20220323114718.58714-2-philippe.mathieu.daude@gmail.com
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
15
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
---
16
---
12
include/hw/xen/io/ring.h | 2 +-
17
block/parallels-ext.c | 2 +-
13
include/qemu/compiler.h | 2 ++
18
1 file changed, 1 insertion(+), 1 deletion(-)
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
19
23
diff --git a/include/hw/xen/io/ring.h b/include/hw/xen/io/ring.h
20
diff --git a/block/parallels-ext.c b/block/parallels-ext.c
24
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/xen/io/ring.h
22
--- a/block/parallels-ext.c
26
+++ b/include/hw/xen/io/ring.h
23
+++ b/block/parallels-ext.c
27
@@ -XXX,XX +XXX,XX @@ typedef unsigned int RING_IDX;
24
@@ -XXX,XX +XXX,XX @@ static int parallels_parse_format_extension(BlockDriverState *bs,
28
*/
25
break;
29
#define __CONST_RING_SIZE(_s, _sz) \
26
30
(__RD32(((_sz) - offsetof(struct _s##_sring, ring)) / \
27
default:
31
-     sizeof(((struct _s##_sring *)0)->ring[0])))
28
- error_setg(errp, "Unknown feature: 0x%" PRIu64, fh.magic);
32
+ sizeof_field(struct _s##_sring, ring[0])))
29
+ error_setg(errp, "Unknown feature: 0x%" PRIx64, fh.magic);
33
/*
30
goto fail;
34
* The same for passing in an actual pointer instead of a name tag.
31
}
35
*/
36
diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h
37
index XXXXXXX..XXXXXXX 100644
38
--- a/include/qemu/compiler.h
39
+++ b/include/qemu/compiler.h
40
@@ -XXX,XX +XXX,XX @@
41
(type *) ((char *) __mptr - offsetof(type, member));})
42
#endif
43
44
+#define sizeof_field(type, field) sizeof(((type *)0)->field)
45
+
46
/* Convert from a base type to a parent type, with compile time checking. */
47
#ifdef __GNUC__
48
#define DO_UPCAST(type, field, dev) ( __extension__ ( { \
49
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/accel/tcg/translate-all.c
52
+++ b/accel/tcg/translate-all.c
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
{
70
- size_t mfn_sz = sizeof(*((struct xenfb_page *)0)->pd);
71
- size_t pd_len = sizeof(((struct xenfb_page *)0)->pd) / mfn_sz;
72
+ size_t mfn_sz = sizeof_field(struct xenfb_page, pd[0]);
73
+ size_t pd_len = sizeof_field(struct xenfb_page, pd) / mfn_sz;
74
size_t fb_pages = pd_len * XC_PAGE_SIZE / mfn_sz;
75
size_t fb_len_max = fb_pages * XC_PAGE_SIZE;
76
int max_width, max_height;
77
diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/net/rocker/rocker_of_dpa.c
80
+++ b/hw/net/rocker/rocker_of_dpa.c
81
@@ -XXX,XX +XXX,XX @@ typedef struct of_dpa_flow_key {
82
83
/* Width of key which includes field 'f' in u64s, rounded up */
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
32
172
--
33
--
173
2.17.1
34
2.35.1
174
35
175
36
diff view generated by jsdifflib
1
From: Nishanth Aravamudan <naravamudan@digitalocean.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
laio_init() can fail for a couple of reasons, which will lead to a NULL
3
"0x%u" format is very misleading, replace by "0x%x".
4
pointer dereference in laio_attach_aio_context().
5
4
6
To solve this, add a aio_setup_linux_aio() function which is called
5
Found running:
7
early in raw_open_common. If this fails, propagate the error up. The
8
signature of aio_get_linux_aio() was not modified, because it seems
9
preferable to return the actual errno from the possible failing
10
initialization calls.
11
6
12
Additionally, when the AioContext changes, we need to associate a
7
$ git grep -E '0x%[0-9]*([lL]*|" ?PRI)[dDuU]' hw/
13
LinuxAioState with the new AioContext. Use the bdrv_attach_aio_context
14
callback and call the new aio_setup_linux_aio(), which will allocate a
15
new AioContext if needed, and return errors on failures. If it fails for
16
any reason, fallback to threaded AIO with an error message, as the
17
device is already in-use by the guest.
18
8
19
Add an assert that aio_get_linux_aio() cannot return NULL.
9
Inspired-by: Richard Henderson <richard.henderson@linaro.org>
20
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Signed-off-by: Nishanth Aravamudan <naravamudan@digitalocean.com>
11
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
22
Message-id: 20180622193700.6523-1-naravamudan@digitalocean.com
12
Message-id: 20220323114718.58714-3-philippe.mathieu.daude@gmail.com
23
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
13
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
24
---
14
---
25
include/block/aio.h | 3 +++
15
hw/i386/sgx.c | 2 +-
26
include/block/raw-aio.h | 2 +-
16
hw/i386/trace-events | 6 +++---
27
block/file-posix.c | 33 ++++++++++++++++++++++++++++-----
17
hw/misc/trace-events | 4 ++--
28
block/linux-aio.c | 12 +++++++++---
18
hw/scsi/trace-events | 4 ++--
29
stubs/linux-aio.c | 2 +-
19
4 files changed, 8 insertions(+), 8 deletions(-)
30
util/async.c | 14 +++++++++++---
31
6 files changed, 53 insertions(+), 13 deletions(-)
32
20
33
diff --git a/include/block/aio.h b/include/block/aio.h
21
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
34
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
35
--- a/include/block/aio.h
23
--- a/hw/i386/sgx.c
36
+++ b/include/block/aio.h
24
+++ b/hw/i386/sgx.c
37
@@ -XXX,XX +XXX,XX @@ GSource *aio_get_g_source(AioContext *ctx);
25
@@ -XXX,XX +XXX,XX @@ void pc_machine_init_sgx_epc(PCMachineState *pcms)
38
/* Return the ThreadPool bound to this AioContext */
26
}
39
struct ThreadPool *aio_get_thread_pool(AioContext *ctx);
27
40
28
if ((sgx_epc->base + sgx_epc->size) < sgx_epc->base) {
41
+/* Setup the LinuxAioState bound to this AioContext */
29
- error_report("Size of all 'sgx-epc' =0x%"PRIu64" causes EPC to wrap",
42
+struct LinuxAioState *aio_setup_linux_aio(AioContext *ctx, Error **errp);
30
+ error_report("Size of all 'sgx-epc' =0x%"PRIx64" causes EPC to wrap",
43
+
31
sgx_epc->size);
44
/* Return the LinuxAioState bound to this AioContext */
32
exit(EXIT_FAILURE);
45
struct LinuxAioState *aio_get_linux_aio(AioContext *ctx);
33
}
46
34
diff --git a/hw/i386/trace-events b/hw/i386/trace-events
47
diff --git a/include/block/raw-aio.h b/include/block/raw-aio.h
48
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
49
--- a/include/block/raw-aio.h
36
--- a/hw/i386/trace-events
50
+++ b/include/block/raw-aio.h
37
+++ b/hw/i386/trace-events
38
@@ -XXX,XX +XXX,XX @@ vtd_fault_disabled(void) "Fault processing disabled for context entry"
39
vtd_replay_ce_valid(const char *mode, uint8_t bus, uint8_t dev, uint8_t fn, uint16_t domain, uint64_t hi, uint64_t lo) "%s: replay valid context device %02"PRIx8":%02"PRIx8".%02"PRIx8" domain 0x%"PRIx16" hi 0x%"PRIx64" lo 0x%"PRIx64
40
vtd_replay_ce_invalid(uint8_t bus, uint8_t dev, uint8_t fn) "replay invalid context device %02"PRIx8":%02"PRIx8".%02"PRIx8
41
vtd_page_walk_level(uint64_t addr, uint32_t level, uint64_t start, uint64_t end) "walk (base=0x%"PRIx64", level=%"PRIu32") iova range 0x%"PRIx64" - 0x%"PRIx64
42
-vtd_page_walk_one(uint16_t domain, uint64_t iova, uint64_t gpa, uint64_t mask, int perm) "domain 0x%"PRIu16" iova 0x%"PRIx64" -> gpa 0x%"PRIx64" mask 0x%"PRIx64" perm %d"
43
+vtd_page_walk_one(uint16_t domain, uint64_t iova, uint64_t gpa, uint64_t mask, int perm) "domain 0x%"PRIx16" iova 0x%"PRIx64" -> gpa 0x%"PRIx64" mask 0x%"PRIx64" perm %d"
44
vtd_page_walk_one_skip_map(uint64_t iova, uint64_t mask, uint64_t translated) "iova 0x%"PRIx64" mask 0x%"PRIx64" translated 0x%"PRIx64
45
vtd_page_walk_one_skip_unmap(uint64_t iova, uint64_t mask) "iova 0x%"PRIx64" mask 0x%"PRIx64
46
vtd_page_walk_skip_read(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to unable to read"
47
vtd_page_walk_skip_reserve(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to rsrv set"
48
vtd_switch_address_space(uint8_t bus, uint8_t slot, uint8_t fn, bool on) "Device %02x:%02x.%x switching address space (iommu enabled=%d)"
49
vtd_as_unmap_whole(uint8_t bus, uint8_t slot, uint8_t fn, uint64_t iova, uint64_t size) "Device %02x:%02x.%x start 0x%"PRIx64" size 0x%"PRIx64
50
-vtd_translate_pt(uint16_t sid, uint64_t addr) "source id 0x%"PRIu16", iova 0x%"PRIx64
51
-vtd_pt_enable_fast_path(uint16_t sid, bool success) "sid 0x%"PRIu16" %d"
52
+vtd_translate_pt(uint16_t sid, uint64_t addr) "source id 0x%"PRIx16", iova 0x%"PRIx64
53
+vtd_pt_enable_fast_path(uint16_t sid, bool success) "sid 0x%"PRIx16" %d"
54
vtd_irq_generate(uint64_t addr, uint64_t data) "addr 0x%"PRIx64" data 0x%"PRIx64
55
vtd_reg_read(uint64_t addr, uint64_t size) "addr 0x%"PRIx64" size 0x%"PRIx64
56
vtd_reg_write(uint64_t addr, uint64_t size, uint64_t val) "addr 0x%"PRIx64" size 0x%"PRIx64" value 0x%"PRIx64
57
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
58
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/misc/trace-events
60
+++ b/hw/misc/trace-events
51
@@ -XXX,XX +XXX,XX @@
61
@@ -XXX,XX +XXX,XX @@
52
/* linux-aio.c - Linux native implementation */
62
# See docs/devel/tracing.rst for syntax documentation.
53
#ifdef CONFIG_LINUX_AIO
63
54
typedef struct LinuxAioState LinuxAioState;
64
# allwinner-cpucfg.c
55
-LinuxAioState *laio_init(void);
65
-allwinner_cpucfg_cpu_reset(uint8_t cpu_id, uint32_t reset_addr) "id %u, reset_addr 0x%" PRIu32
56
+LinuxAioState *laio_init(Error **errp);
66
+allwinner_cpucfg_cpu_reset(uint8_t cpu_id, uint32_t reset_addr) "id %u, reset_addr 0x%" PRIx32
57
void laio_cleanup(LinuxAioState *s);
67
allwinner_cpucfg_read(uint64_t offset, uint64_t data, unsigned size) "offset 0x%" PRIx64 " data 0x%" PRIx64 " size %" PRIu32
58
int coroutine_fn laio_co_submit(BlockDriverState *bs, LinuxAioState *s, int fd,
68
allwinner_cpucfg_write(uint64_t offset, uint64_t data, unsigned size) "offset 0x%" PRIx64 " data 0x%" PRIx64 " size %" PRIu32
59
uint64_t offset, QEMUIOVector *qiov, int type);
69
60
diff --git a/block/file-posix.c b/block/file-posix.c
70
@@ -XXX,XX +XXX,XX @@ imx7_gpr_write(uint64_t offset, uint64_t value) "addr 0x%08" PRIx64 "value 0x%08
71
72
# mos6522.c
73
mos6522_set_counter(int index, unsigned int val) "T%d.counter=%d"
74
-mos6522_get_next_irq_time(uint16_t latch, int64_t d, int64_t delta) "latch=%d counter=0x%"PRId64 " delta_next=0x%"PRId64
75
+mos6522_get_next_irq_time(uint16_t latch, int64_t d, int64_t delta) "latch=%d counter=0x%"PRIx64 " delta_next=0x%"PRIx64
76
mos6522_set_sr_int(void) "set sr_int"
77
mos6522_write(uint64_t addr, const char *name, uint64_t val) "reg=0x%"PRIx64 " [%s] val=0x%"PRIx64
78
mos6522_read(uint64_t addr, const char *name, unsigned val) "reg=0x%"PRIx64 " [%s] val=0x%x"
79
diff --git a/hw/scsi/trace-events b/hw/scsi/trace-events
61
index XXXXXXX..XXXXXXX 100644
80
index XXXXXXX..XXXXXXX 100644
62
--- a/block/file-posix.c
81
--- a/hw/scsi/trace-events
63
+++ b/block/file-posix.c
82
+++ b/hw/scsi/trace-events
64
@@ -XXX,XX +XXX,XX @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
83
@@ -XXX,XX +XXX,XX @@ lsi_bad_phase_interrupt(void) "Phase mismatch interrupt"
65
84
lsi_bad_selection(uint32_t id) "Selected absent target %"PRIu32
66
#ifdef CONFIG_LINUX_AIO
85
lsi_do_dma_unavailable(void) "DMA no data available"
67
/* Currently Linux does AIO only for files opened with O_DIRECT */
86
lsi_do_dma(uint64_t addr, int len) "DMA addr=0x%"PRIx64" len=%d"
68
- if (s->use_linux_aio && !(s->open_flags & O_DIRECT)) {
87
-lsi_queue_command(uint32_t tag) "Queueing tag=0x%"PRId32
69
- error_setg(errp, "aio=native was specified, but it requires "
88
+lsi_queue_command(uint32_t tag) "Queueing tag=0x%"PRIx32
70
- "cache.direct=on, which was not specified.");
89
lsi_add_msg_byte_error(void) "MSG IN data too long"
71
- ret = -EINVAL;
90
lsi_add_msg_byte(uint8_t data) "MSG IN 0x%02x"
72
- goto fail;
91
lsi_reselect(int id) "Reselected target %d"
73
+ if (s->use_linux_aio) {
92
@@ -XXX,XX +XXX,XX @@ lsi_do_msgout_noop(void) "MSG: No Operation"
74
+ if (!(s->open_flags & O_DIRECT)) {
93
lsi_do_msgout_extended(uint8_t msg, uint8_t len) "Extended message 0x%x (len %d)"
75
+ error_setg(errp, "aio=native was specified, but it requires "
94
lsi_do_msgout_ignored(const char *msg) "%s (ignored)"
76
+ "cache.direct=on, which was not specified.");
95
lsi_do_msgout_simplequeue(uint8_t select_tag) "SIMPLE queue tag=0x%x"
77
+ ret = -EINVAL;
96
-lsi_do_msgout_abort(uint32_t tag) "MSG: ABORT TAG tag=0x%"PRId32
78
+ goto fail;
97
+lsi_do_msgout_abort(uint32_t tag) "MSG: ABORT TAG tag=0x%"PRIx32
79
+ }
98
lsi_do_msgout_clearqueue(uint32_t tag) "MSG: CLEAR QUEUE tag=0x%"PRIx32
80
+ if (!aio_setup_linux_aio(bdrv_get_aio_context(bs), errp)) {
99
lsi_do_msgout_busdevicereset(uint32_t tag) "MSG: BUS DEVICE RESET tag=0x%"PRIx32
81
+ error_prepend(errp, "Unable to use native AIO: ");
100
lsi_do_msgout_select(int id) "Select LUN %d"
82
+ goto fail;
83
+ }
84
}
85
#else
86
if (s->use_linux_aio) {
87
@@ -XXX,XX +XXX,XX @@ static BlockAIOCB *raw_aio_flush(BlockDriverState *bs,
88
return paio_submit(bs, s->fd, 0, NULL, 0, cb, opaque, QEMU_AIO_FLUSH);
89
}
90
91
+static void raw_aio_attach_aio_context(BlockDriverState *bs,
92
+ AioContext *new_context)
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
{
109
BDRVRawState *s = bs->opaque;
110
@@ -XXX,XX +XXX,XX @@ BlockDriver bdrv_file = {
111
.bdrv_refresh_limits = raw_refresh_limits,
112
.bdrv_io_plug = raw_aio_plug,
113
.bdrv_io_unplug = raw_aio_unplug,
114
+ .bdrv_attach_aio_context = raw_aio_attach_aio_context,
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
}
147
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
--
101
--
199
2.17.1
102
2.35.1
200
103
201
104
diff view generated by jsdifflib