* [PATCH 01/26] block/nvme: separate nvme_get_free_req cases for coroutine/non-coroutine context
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
@ 2022-09-22 8:48 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 02/26] block: add missing coroutine_fn annotations Paolo Bonzini
` (25 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:48 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
nvme_get_free_req has very difference semantics when called in
coroutine context (where it waits) and in non-coroutine context
(where it doesn't). Split the two cases to make it clear what
is being requested.
Cc: qemu-block@nongnu.org
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/nvme.c | 48 ++++++++++++++++++++++++++++--------------------
1 file changed, 28 insertions(+), 20 deletions(-)
diff --git a/block/nvme.c b/block/nvme.c
index 01fb28aa63..3e6abef1ce 100644
--- a/block/nvme.c
+++ b/block/nvme.c
@@ -293,34 +293,42 @@ static void nvme_kick(NVMeQueuePair *q)
q->need_kick = 0;
}
-/* Find a free request element if any, otherwise:
- * a) if in coroutine context, try to wait for one to become available;
- * b) if not in coroutine, return NULL;
- */
-static NVMeRequest *nvme_get_free_req(NVMeQueuePair *q)
+static NVMeRequest *nvme_get_free_req_nofail_locked(NVMeQueuePair *q)
{
NVMeRequest *req;
- qemu_mutex_lock(&q->lock);
-
- while (q->free_req_head == -1) {
- if (qemu_in_coroutine()) {
- trace_nvme_free_req_queue_wait(q->s, q->index);
- qemu_co_queue_wait(&q->free_req_queue, &q->lock);
- } else {
- qemu_mutex_unlock(&q->lock);
- return NULL;
- }
- }
-
req = &q->reqs[q->free_req_head];
q->free_req_head = req->free_req_next;
req->free_req_next = -1;
-
- qemu_mutex_unlock(&q->lock);
return req;
}
+/* Return a free request element if any, otherwise return NULL. */
+static NVMeRequest *nvme_get_free_req_nowait(NVMeQueuePair *q)
+{
+ QEMU_LOCK_GUARD(&q->lock);
+ if (q->free_req_head == -1) {
+ return NULL;
+ }
+ return nvme_get_free_req_nofail_locked(q);
+}
+
+/*
+ * Wait for a free request to become available if necessary, then
+ * return it.
+ */
+static coroutine_fn NVMeRequest *nvme_get_free_req(NVMeQueuePair *q)
+{
+ QEMU_LOCK_GUARD(&q->lock);
+
+ while (q->free_req_head == -1) {
+ trace_nvme_free_req_queue_wait(q->s, q->index);
+ qemu_co_queue_wait(&q->free_req_queue, &q->lock);
+ }
+
+ return nvme_get_free_req_nofail_locked(q);
+}
+
/* With q->lock */
static void nvme_put_free_req_locked(NVMeQueuePair *q, NVMeRequest *req)
{
@@ -506,7 +514,7 @@ static int nvme_admin_cmd_sync(BlockDriverState *bs, NvmeCmd *cmd)
AioContext *aio_context = bdrv_get_aio_context(bs);
NVMeRequest *req;
int ret = -EINPROGRESS;
- req = nvme_get_free_req(q);
+ req = nvme_get_free_req_nowait(q);
if (!req) {
return -EBUSY;
}
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 02/26] block: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
2022-09-22 8:48 ` [PATCH 01/26] block/nvme: separate nvme_get_free_req cases for coroutine/non-coroutine context Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 15:11 ` Alberto Campinho Faria
2022-09-22 8:49 ` [PATCH 03/26] qcow2: remove incorrect " Paolo Bonzini
` (24 subsequent siblings)
26 siblings, 1 reply; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block.c | 6 +++---
block/block-backend.c | 10 +++++-----
block/io.c | 22 +++++++++++-----------
3 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/block.c b/block.c
index bc85f46eed..5c34ada53f 100644
--- a/block.c
+++ b/block.c
@@ -631,9 +631,9 @@ static int64_t create_file_fallback_truncate(BlockBackend *blk,
* Helper function for bdrv_create_file_fallback(): Zero the first
* sector to remove any potentially pre-existing image header.
*/
-static int create_file_fallback_zero_first_sector(BlockBackend *blk,
- int64_t current_size,
- Error **errp)
+static int coroutine_fn create_file_fallback_zero_first_sector(BlockBackend *blk,
+ int64_t current_size,
+ Error **errp)
{
int64_t bytes_to_clear;
int ret;
diff --git a/block/block-backend.c b/block/block-backend.c
index d4a5df2ac2..aa4adf06ae 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -1546,7 +1546,7 @@ static BlockAIOCB *blk_aio_prwv(BlockBackend *blk, int64_t offset,
return &acb->common;
}
-static void blk_aio_read_entry(void *opaque)
+static void coroutine_fn blk_aio_read_entry(void *opaque)
{
BlkAioEmAIOCB *acb = opaque;
BlkRwCo *rwco = &acb->rwco;
@@ -1558,7 +1558,7 @@ static void blk_aio_read_entry(void *opaque)
blk_aio_complete(acb);
}
-static void blk_aio_write_entry(void *opaque)
+static void coroutine_fn blk_aio_write_entry(void *opaque)
{
BlkAioEmAIOCB *acb = opaque;
BlkRwCo *rwco = &acb->rwco;
@@ -1669,7 +1669,7 @@ int coroutine_fn blk_co_ioctl(BlockBackend *blk, unsigned long int req,
return ret;
}
-static void blk_aio_ioctl_entry(void *opaque)
+static void coroutine_fn blk_aio_ioctl_entry(void *opaque)
{
BlkAioEmAIOCB *acb = opaque;
BlkRwCo *rwco = &acb->rwco;
@@ -1703,7 +1703,7 @@ blk_co_do_pdiscard(BlockBackend *blk, int64_t offset, int64_t bytes)
return bdrv_co_pdiscard(blk->root, offset, bytes);
}
-static void blk_aio_pdiscard_entry(void *opaque)
+static void coroutine_fn blk_aio_pdiscard_entry(void *opaque)
{
BlkAioEmAIOCB *acb = opaque;
BlkRwCo *rwco = &acb->rwco;
@@ -1747,7 +1747,7 @@ static int coroutine_fn blk_co_do_flush(BlockBackend *blk)
return bdrv_co_flush(blk_bs(blk));
}
-static void blk_aio_flush_entry(void *opaque)
+static void coroutine_fn blk_aio_flush_entry(void *opaque)
{
BlkAioEmAIOCB *acb = opaque;
BlkRwCo *rwco = &acb->rwco;
diff --git a/block/io.c b/block/io.c
index 0a8cbefe86..e3dcb8e7e6 100644
--- a/block/io.c
+++ b/block/io.c
@@ -751,11 +751,11 @@ static void coroutine_fn tracked_request_end(BdrvTrackedRequest *req)
/**
* Add an active request to the tracked requests list
*/
-static void tracked_request_begin(BdrvTrackedRequest *req,
- BlockDriverState *bs,
- int64_t offset,
- int64_t bytes,
- enum BdrvTrackedRequestType type)
+static void coroutine_fn tracked_request_begin(BdrvTrackedRequest *req,
+ BlockDriverState *bs,
+ int64_t offset,
+ int64_t bytes,
+ enum BdrvTrackedRequestType type)
{
bdrv_check_request(offset, bytes, &error_abort);
@@ -794,7 +794,7 @@ static bool tracked_request_overlaps(BdrvTrackedRequest *req,
}
/* Called with self->bs->reqs_lock held */
-static BdrvTrackedRequest *
+static coroutine_fn BdrvTrackedRequest *
bdrv_find_conflicting_request(BdrvTrackedRequest *self)
{
BdrvTrackedRequest *req;
@@ -1644,10 +1644,10 @@ static bool bdrv_init_padding(BlockDriverState *bs,
return true;
}
-static int bdrv_padding_rmw_read(BdrvChild *child,
- BdrvTrackedRequest *req,
- BdrvRequestPadding *pad,
- bool zero_middle)
+static coroutine_fn int bdrv_padding_rmw_read(BdrvChild *child,
+ BdrvTrackedRequest *req,
+ BdrvRequestPadding *pad,
+ bool zero_middle)
{
QEMUIOVector local_qiov;
BlockDriverState *bs = child->bs;
@@ -3168,7 +3168,7 @@ out:
return ret;
}
-int bdrv_co_ioctl(BlockDriverState *bs, int req, void *buf)
+int coroutine_fn bdrv_co_ioctl(BlockDriverState *bs, int req, void *buf)
{
BlockDriver *drv = bs->drv;
CoroutineIOCompletion co = {
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* Re: [PATCH 02/26] block: add missing coroutine_fn annotations
2022-09-22 8:49 ` [PATCH 02/26] block: add missing coroutine_fn annotations Paolo Bonzini
@ 2022-09-22 15:11 ` Alberto Campinho Faria
2022-09-24 13:41 ` Paolo Bonzini
0 siblings, 1 reply; 35+ messages in thread
From: Alberto Campinho Faria @ 2022-09-22 15:11 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel, Kevin Wolf, qemu-block
On Thu, Sep 22, 2022 at 9:49 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
> Callers of coroutine_fn must be coroutine_fn themselves, or the call
> must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
> functions where this holds.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> block.c | 6 +++---
> block/block-backend.c | 10 +++++-----
> block/io.c | 22 +++++++++++-----------
> 3 files changed, 19 insertions(+), 19 deletions(-)
>
> diff --git a/block.c b/block.c
> index bc85f46eed..5c34ada53f 100644
> --- a/block.c
> +++ b/block.c
> @@ -631,9 +631,9 @@ static int64_t create_file_fallback_truncate(BlockBackend *blk,
> * Helper function for bdrv_create_file_fallback(): Zero the first
> * sector to remove any potentially pre-existing image header.
> */
> -static int create_file_fallback_zero_first_sector(BlockBackend *blk,
> - int64_t current_size,
> - Error **errp)
> +static int coroutine_fn create_file_fallback_zero_first_sector(BlockBackend *blk,
> + int64_t current_size,
> + Error **errp)
Why mark this coroutine_fn? Maybe the intention was to also replace
the call to blk_pwrite_zeroes() with blk_co_pwrite_zeroes()?
Regardless:
Reviewed-by: Alberto Faria <afaria@redhat.com>
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [PATCH 02/26] block: add missing coroutine_fn annotations
2022-09-22 15:11 ` Alberto Campinho Faria
@ 2022-09-24 13:41 ` Paolo Bonzini
2022-10-05 18:11 ` Alberto Campinho Faria
0 siblings, 1 reply; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-24 13:41 UTC (permalink / raw)
To: Alberto Campinho Faria; +Cc: qemu-devel, Kevin Wolf, qemu-block
On Thu, Sep 22, 2022 at 5:12 PM Alberto Campinho Faria
<afaria@redhat.com> wrote:
>
> On Thu, Sep 22, 2022 at 9:49 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
> > Callers of coroutine_fn must be coroutine_fn themselves, or the call
> > must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
> > functions where this holds.
> >
> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> > ---
> > block.c | 6 +++---
> > block/block-backend.c | 10 +++++-----
> > block/io.c | 22 +++++++++++-----------
> > 3 files changed, 19 insertions(+), 19 deletions(-)
> >
> > diff --git a/block.c b/block.c
> > index bc85f46eed..5c34ada53f 100644
> > --- a/block.c
> > +++ b/block.c
> > @@ -631,9 +631,9 @@ static int64_t create_file_fallback_truncate(BlockBackend *blk,
> > * Helper function for bdrv_create_file_fallback(): Zero the first
> > * sector to remove any potentially pre-existing image header.
> > */
> > -static int create_file_fallback_zero_first_sector(BlockBackend *blk,
> > - int64_t current_size,
> > - Error **errp)
> > +static int coroutine_fn create_file_fallback_zero_first_sector(BlockBackend *blk,
> > + int64_t current_size,
> > + Error **errp)
>
> Why mark this coroutine_fn? Maybe the intention was to also replace
> the call to blk_pwrite_zeroes() with blk_co_pwrite_zeroes()?
Because at the time I wrote the patch, blk_pwrite_zeroes() was a
coroutine_fn. :)
It is called from bdrv_co_create_opts_simple which is coroutine_fn and
performs I/O, so it should be a coroutine_fn. I have a few more patches
to not go through the generated_co_wrappers, but I was curious to see
if we could automate those changes through your tool.
Paolo
>
> Regardless:
>
> Reviewed-by: Alberto Faria <afaria@redhat.com>
>
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [PATCH 02/26] block: add missing coroutine_fn annotations
2022-09-24 13:41 ` Paolo Bonzini
@ 2022-10-05 18:11 ` Alberto Campinho Faria
0 siblings, 0 replies; 35+ messages in thread
From: Alberto Campinho Faria @ 2022-10-05 18:11 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel, Kevin Wolf, qemu-block
On Sat, Sep 24, 2022 at 2:42 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
> Because at the time I wrote the patch, blk_pwrite_zeroes() was a
> coroutine_fn. :)
>
> It is called from bdrv_co_create_opts_simple which is coroutine_fn and
> performs I/O, so it should be a coroutine_fn. I have a few more patches
> to not go through the generated_co_wrappers, but I was curious to see
> if we could automate those changes through your tool.
The static analyzer [1] should find all such cases, e.g.:
./static-analyzer.py -c no_coroutine_fn build block
coroutine_fn and generated_co_wrapper must be adjusted for this to
work on master:
#define coroutine_fn __attribute__((__annotate__("coroutine_fn")))
#define generated_co_wrapper
__attribute__((__annotate__("no_coroutine_fn")))
[1] https://gitlab.com/albertofaria/qemu/-/tree/static-analysis
^ permalink raw reply [flat|nested] 35+ messages in thread
* [PATCH 03/26] qcow2: remove incorrect coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
2022-09-22 8:48 ` [PATCH 01/26] block/nvme: separate nvme_get_free_req cases for coroutine/non-coroutine context Paolo Bonzini
2022-09-22 8:49 ` [PATCH 02/26] block: add missing coroutine_fn annotations Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 04/26] nbd: " Paolo Bonzini
` (23 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Eric Blake
This is incorrect because qcow2_mark_clean() calls qcow2_flush_caches().
qcow2_mark_clean() is called from non-coroutine context in
qcow2_inactivate() and qcow2_amend_options().
Reviewed-by: Alberto Faria <afaria@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/qcow2-refcount.c | 4 ++--
block/qcow2.h | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index c4d99817b6..1a6277c783 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -1206,7 +1206,7 @@ void qcow2_free_any_cluster(BlockDriverState *bs, uint64_t l2_entry,
}
}
-int coroutine_fn qcow2_write_caches(BlockDriverState *bs)
+int qcow2_write_caches(BlockDriverState *bs)
{
BDRVQcow2State *s = bs->opaque;
int ret;
@@ -1226,7 +1226,7 @@ int coroutine_fn qcow2_write_caches(BlockDriverState *bs)
return 0;
}
-int coroutine_fn qcow2_flush_caches(BlockDriverState *bs)
+int qcow2_flush_caches(BlockDriverState *bs)
{
int ret = qcow2_write_caches(bs);
if (ret < 0) {
diff --git a/block/qcow2.h b/block/qcow2.h
index ba436a8d0d..c8d9e8ea79 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -874,8 +874,8 @@ void qcow2_free_any_cluster(BlockDriverState *bs, uint64_t l2_entry,
int qcow2_update_snapshot_refcount(BlockDriverState *bs,
int64_t l1_table_offset, int l1_size, int addend);
-int coroutine_fn qcow2_flush_caches(BlockDriverState *bs);
-int coroutine_fn qcow2_write_caches(BlockDriverState *bs);
+int qcow2_flush_caches(BlockDriverState *bs);
+int qcow2_write_caches(BlockDriverState *bs);
int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckMode fix);
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 04/26] nbd: remove incorrect coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (2 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 03/26] qcow2: remove incorrect " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 05/26] coroutine: " Paolo Bonzini
` (22 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Eric Blake
nbd_co_establish_connection_cancel() cancels a coroutine but is not called
from coroutine context itself, for example in nbd_cancel_in_flight()
and in timer callbacks reconnect_delay_timer_cb() and open_timer_cb().
Reviewed-by: Alberto Faria <afaria@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
include/block/nbd.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/block/nbd.h b/include/block/nbd.h
index c74b7a9d2e..4ede3b2bd0 100644
--- a/include/block/nbd.h
+++ b/include/block/nbd.h
@@ -424,6 +424,6 @@ QIOChannel *coroutine_fn
nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
bool blocking, Error **errp);
-void coroutine_fn nbd_co_establish_connection_cancel(NBDClientConnection *conn);
+void nbd_co_establish_connection_cancel(NBDClientConnection *conn);
#endif
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 05/26] coroutine: remove incorrect coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (3 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 04/26] nbd: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 06/26] blkdebug: add missing " Paolo Bonzini
` (21 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Eric Blake
qemu_coroutine_get_aio_context inspects a coroutine, but it does
not have to be called from the coroutine itself (or from any
coroutine).
Reviewed-by: Alberto Faria <afaria@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
include/qemu/coroutine.h | 2 +-
util/qemu-coroutine.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h
index 08c5bb3c76..e55b36f49a 100644
--- a/include/qemu/coroutine.h
+++ b/include/qemu/coroutine.h
@@ -92,7 +92,7 @@ void coroutine_fn qemu_coroutine_yield(void);
/**
* Get the AioContext of the given coroutine
*/
-AioContext *coroutine_fn qemu_coroutine_get_aio_context(Coroutine *co);
+AioContext *qemu_coroutine_get_aio_context(Coroutine *co);
/**
* Get the currently executing coroutine
diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c
index 4a8bd63ef0..356b746f0b 100644
--- a/util/qemu-coroutine.c
+++ b/util/qemu-coroutine.c
@@ -213,7 +213,7 @@ bool qemu_coroutine_entered(Coroutine *co)
return co->caller;
}
-AioContext *coroutine_fn qemu_coroutine_get_aio_context(Coroutine *co)
+AioContext *qemu_coroutine_get_aio_context(Coroutine *co)
{
return co->ctx;
}
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 06/26] blkdebug: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (4 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 05/26] coroutine: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-10-05 10:32 ` Kevin Wolf
2022-09-22 8:49 ` [PATCH 07/26] blkverify: " Paolo Bonzini
` (20 subsequent siblings)
26 siblings, 1 reply; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Eric Blake
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/blkdebug.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/block/blkdebug.c b/block/blkdebug.c
index bbf2948703..a93ba61487 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -587,8 +587,8 @@ out:
return ret;
}
-static int rule_check(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
- BlkdebugIOType iotype)
+static int coroutine_fn rule_check(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
+ BlkdebugIOType iotype)
{
BDRVBlkdebugState *s = bs->opaque;
BlkdebugRule *rule = NULL;
@@ -672,7 +672,7 @@ blkdebug_co_pwritev(BlockDriverState *bs, int64_t offset, int64_t bytes,
return bdrv_co_pwritev(bs->file, offset, bytes, qiov, flags);
}
-static int blkdebug_co_flush(BlockDriverState *bs)
+static int coroutine_fn blkdebug_co_flush(BlockDriverState *bs)
{
int err = rule_check(bs, 0, 0, BLKDEBUG_IO_TYPE_FLUSH);
@@ -791,7 +791,7 @@ static void blkdebug_close(BlockDriverState *bs)
}
/* Called with lock held. */
-static void suspend_request(BlockDriverState *bs, BlkdebugRule *rule)
+static void coroutine_fn suspend_request(BlockDriverState *bs, BlkdebugRule *rule)
{
BDRVBlkdebugState *s = bs->opaque;
BlkdebugSuspendedReq *r;
@@ -810,8 +810,8 @@ static void suspend_request(BlockDriverState *bs, BlkdebugRule *rule)
}
/* Called with lock held. */
-static void process_rule(BlockDriverState *bs, struct BlkdebugRule *rule,
- int *action_count, int *new_state)
+static void coroutine_fn process_rule(BlockDriverState *bs, struct BlkdebugRule *rule,
+ int *action_count, int *new_state)
{
BDRVBlkdebugState *s = bs->opaque;
@@ -840,7 +840,7 @@ static void process_rule(BlockDriverState *bs, struct BlkdebugRule *rule,
}
}
-static void blkdebug_debug_event(BlockDriverState *bs, BlkdebugEvent event)
+static void coroutine_fn blkdebug_debug_event(BlockDriverState *bs, BlkdebugEvent event)
{
BDRVBlkdebugState *s = bs->opaque;
struct BlkdebugRule *rule, *next;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* Re: [PATCH 06/26] blkdebug: add missing coroutine_fn annotations
2022-09-22 8:49 ` [PATCH 06/26] blkdebug: add missing " Paolo Bonzini
@ 2022-10-05 10:32 ` Kevin Wolf
2022-10-05 21:11 ` Paolo Bonzini
0 siblings, 1 reply; 35+ messages in thread
From: Kevin Wolf @ 2022-10-05 10:32 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel, qemu-block, afaria, Eric Blake
Am 22.09.2022 um 10:49 hat Paolo Bonzini geschrieben:
> Callers of coroutine_fn must be coroutine_fn themselves, or the call
> must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
> functions where this holds.
>
> Reviewed-by: Alberto Faria <afaria@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Hm... blkdebug_debug_event() is called from bdrv_debug_event(), which is
not coroutine_fn. And I think that it's not coroutine_fn is correct:
For example, with 'qemu-img snapshot -c' you get img_snapshot() ->
bdrv_snapshot_create() -> qcow2_snapshot_create() ->
qcow2_alloc_clusters() -> BLKDBG_EVENT. I'm sure many other calls in
qcow2 can be reached from non-coroutine context as well.
It almost looks like your code analysis didn't consider calls through
function pointers?
Kevin
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [PATCH 06/26] blkdebug: add missing coroutine_fn annotations
2022-10-05 10:32 ` Kevin Wolf
@ 2022-10-05 21:11 ` Paolo Bonzini
2022-10-06 8:45 ` Kevin Wolf
0 siblings, 1 reply; 35+ messages in thread
From: Paolo Bonzini @ 2022-10-05 21:11 UTC (permalink / raw)
To: Kevin Wolf
Cc: qemu-devel, open list:Block layer core, Alberto Campinho Faria,
Eric Blake
[-- Attachment #1: Type: text/plain, Size: 985 bytes --]
Il mer 5 ott 2022, 06:32 Kevin Wolf <kwolf@redhat.com> ha scritto:
> Hm... blkdebug_debug_event() is called from bdrv_debug_event(), which is
> not coroutine_fn. And I think that it's not coroutine_fn is correct:
> For example, with 'qemu-img snapshot -c' you get img_snapshot() ->
> bdrv_snapshot_create() -> qcow2_snapshot_create() ->
> qcow2_alloc_clusters() -> BLKDBG_EVENT. I'm sure many other calls in
> qcow2 can be reached from non-coroutine context as well.
>
> It almost looks like your code analysis didn't consider calls through
> function pointers?
>
No, that is not what happened. Rather it's that the analysis goes the other
way round: because SUSPEND rules call qemu_coroutine_yield(), clang wants
all the callers to be coroutine_fn too. It is technically incorrect that
bdrv_debug_events sometimes are placed outside coroutine context, and QEMU
would crash if those events were associated with a suspend rule.
I guess I (or you) can just drop this patch?
Paolo
>
[-- Attachment #2: Type: text/html, Size: 1660 bytes --]
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: [PATCH 06/26] blkdebug: add missing coroutine_fn annotations
2022-10-05 21:11 ` Paolo Bonzini
@ 2022-10-06 8:45 ` Kevin Wolf
0 siblings, 0 replies; 35+ messages in thread
From: Kevin Wolf @ 2022-10-06 8:45 UTC (permalink / raw)
To: Paolo Bonzini
Cc: qemu-devel, open list:Block layer core, Alberto Campinho Faria,
Eric Blake
Am 05.10.2022 um 23:11 hat Paolo Bonzini geschrieben:
> Il mer 5 ott 2022, 06:32 Kevin Wolf <kwolf@redhat.com> ha scritto:
>
> > Hm... blkdebug_debug_event() is called from bdrv_debug_event(), which is
> > not coroutine_fn. And I think that it's not coroutine_fn is correct:
> > For example, with 'qemu-img snapshot -c' you get img_snapshot() ->
> > bdrv_snapshot_create() -> qcow2_snapshot_create() ->
> > qcow2_alloc_clusters() -> BLKDBG_EVENT. I'm sure many other calls in
> > qcow2 can be reached from non-coroutine context as well.
> >
> > It almost looks like your code analysis didn't consider calls through
> > function pointers?
> >
>
> No, that is not what happened. Rather it's that the analysis goes the
> other way round: because SUSPEND rules call qemu_coroutine_yield(),
> clang wants all the callers to be coroutine_fn too.
Ah, ok, makes sense. So checking the callers is indeed something that
requires manual review.
> It is technically incorrect that bdrv_debug_events sometimes are
> placed outside coroutine context, and QEMU would crash if those events
> were associated with a suspend rule.
Yes, looks like a bug. As long as it's only in blkdebug, we can probably
live with it (the easiest fix would probably be generating coroutine
wrappers for bdrv_debug_event(), too).
> I guess I (or you) can just drop this patch?
Yes, I can do that.
Kevin
^ permalink raw reply [flat|nested] 35+ messages in thread
* [PATCH 07/26] blkverify: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (5 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 06/26] blkdebug: add missing " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 08/26] file-posix: " Paolo Bonzini
` (19 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Eric Blake
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/blkverify.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/blkverify.c b/block/blkverify.c
index e4a37af3b2..020b1ae7b6 100644
--- a/block/blkverify.c
+++ b/block/blkverify.c
@@ -258,7 +258,7 @@ blkverify_co_pwritev(BlockDriverState *bs, int64_t offset, int64_t bytes,
return blkverify_co_prwv(bs, &r, offset, bytes, qiov, qiov, flags, true);
}
-static int blkverify_co_flush(BlockDriverState *bs)
+static int coroutine_fn blkverify_co_flush(BlockDriverState *bs)
{
BDRVBlkverifyState *s = bs->opaque;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 08/26] file-posix: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (6 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 07/26] blkverify: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 09/26] iscsi: " Paolo Bonzini
` (18 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Eric Blake
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/file-posix.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/file-posix.c b/block/file-posix.c
index 48cd096624..76eea8d350 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -2158,7 +2158,7 @@ static void raw_aio_unplug(BlockDriverState *bs)
#endif
}
-static int raw_co_flush_to_disk(BlockDriverState *bs)
+static int coroutine_fn raw_co_flush_to_disk(BlockDriverState *bs)
{
BDRVRawState *s = bs->opaque;
RawPosixAIOData acb;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 09/26] iscsi: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (7 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 08/26] file-posix: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 10/26] nbd: " Paolo Bonzini
` (17 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Eric Blake
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/iscsi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/iscsi.c b/block/iscsi.c
index d707d0b354..b33eeec794 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -290,7 +290,7 @@ iscsi_co_generic_cb(struct iscsi_context *iscsi, int status,
}
}
-static void iscsi_co_init_iscsitask(IscsiLun *iscsilun, struct IscsiTask *iTask)
+static void coroutine_fn iscsi_co_init_iscsitask(IscsiLun *iscsilun, struct IscsiTask *iTask)
{
*iTask = (struct IscsiTask) {
.co = qemu_coroutine_self(),
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 10/26] nbd: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (8 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 09/26] iscsi: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 11/26] nfs: " Paolo Bonzini
` (16 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Eric Blake
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/nbd.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/block/nbd.c b/block/nbd.c
index 97683cce27..786ee79013 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -983,11 +983,11 @@ static void nbd_iter_request_error(NBDReplyChunkIter *iter, int ret)
* nbd_reply_chunk_iter_receive
* The pointer stored in @payload requires g_free() to free it.
*/
-static bool nbd_reply_chunk_iter_receive(BDRVNBDState *s,
- NBDReplyChunkIter *iter,
- uint64_t handle,
- QEMUIOVector *qiov, NBDReply *reply,
- void **payload)
+static bool coroutine_fn nbd_reply_chunk_iter_receive(BDRVNBDState *s,
+ NBDReplyChunkIter *iter,
+ uint64_t handle,
+ QEMUIOVector *qiov, NBDReply *reply,
+ void **payload)
{
int ret, request_ret;
NBDReply local_reply;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 11/26] nfs: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (9 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 10/26] nbd: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 12/26] nvme: " Paolo Bonzini
` (15 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/nfs.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/nfs.c b/block/nfs.c
index 444c40b458..596ebe98cb 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -223,7 +223,7 @@ static void nfs_process_write(void *arg)
qemu_mutex_unlock(&client->mutex);
}
-static void nfs_co_init_task(BlockDriverState *bs, NFSRPC *task)
+static void coroutine_fn nfs_co_init_task(BlockDriverState *bs, NFSRPC *task)
{
*task = (NFSRPC) {
.co = qemu_coroutine_self(),
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 12/26] nvme: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (10 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 11/26] nfs: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 13/26] parallels: " Paolo Bonzini
` (14 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/nvme.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/block/nvme.c b/block/nvme.c
index 3e6abef1ce..c51b9f5cd3 100644
--- a/block/nvme.c
+++ b/block/nvme.c
@@ -1242,8 +1242,9 @@ static inline bool nvme_qiov_aligned(BlockDriverState *bs,
return true;
}
-static int nvme_co_prw(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
- QEMUIOVector *qiov, bool is_write, int flags)
+static coroutine_fn int nvme_co_prw(BlockDriverState *bs,
+ uint64_t offset, uint64_t bytes,
+ QEMUIOVector *qiov, bool is_write, int flags)
{
BDRVNVMeState *s = bs->opaque;
int r;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 13/26] parallels: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (11 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 12/26] nvme: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-10-05 10:44 ` Kevin Wolf
2022-09-22 8:49 ` [PATCH 14/26] qcow2: " Paolo Bonzini
` (13 subsequent siblings)
26 siblings, 1 reply; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/parallels.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/block/parallels.c b/block/parallels.c
index a229c06f25..5fc726f446 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -165,8 +165,9 @@ static int64_t block_status(BDRVParallelsState *s, int64_t sector_num,
return start_off;
}
-static int64_t allocate_clusters(BlockDriverState *bs, int64_t sector_num,
- int nb_sectors, int *pnum)
+static coroutine_fn int64_t allocate_clusters(BlockDriverState *bs,
+ int64_t sector_num,
+ int nb_sectors, int *pnum)
{
int ret = 0;
BDRVParallelsState *s = bs->opaque;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* Re: [PATCH 13/26] parallels: add missing coroutine_fn annotations
2022-09-22 8:49 ` [PATCH 13/26] parallels: " Paolo Bonzini
@ 2022-10-05 10:44 ` Kevin Wolf
0 siblings, 0 replies; 35+ messages in thread
From: Kevin Wolf @ 2022-10-05 10:44 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel, qemu-block, afaria
Am 22.09.2022 um 10:49 hat Paolo Bonzini geschrieben:
> Callers of coroutine_fn must be coroutine_fn themselves, or the call
> must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
> functions where this holds.
>
> Reviewed-by: Alberto Faria <afaria@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> block/parallels.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/block/parallels.c b/block/parallels.c
> index a229c06f25..5fc726f446 100644
> --- a/block/parallels.c
> +++ b/block/parallels.c
> @@ -165,8 +165,9 @@ static int64_t block_status(BDRVParallelsState *s, int64_t sector_num,
> return start_off;
> }
>
> -static int64_t allocate_clusters(BlockDriverState *bs, int64_t sector_num,
> - int nb_sectors, int *pnum)
> +static coroutine_fn int64_t allocate_clusters(BlockDriverState *bs,
> + int64_t sector_num,
> + int nb_sectors, int *pnum)
Indentation with spaces instead of tabs for QEMU, please.
Kevin
> {
> int ret = 0;
> BDRVParallelsState *s = bs->opaque;
> --
> 2.37.3
>
^ permalink raw reply [flat|nested] 35+ messages in thread
* [PATCH 14/26] qcow2: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (12 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 13/26] parallels: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 15/26] copy-before-write: " Paolo Bonzini
` (12 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/qcow2-cluster.c | 18 +++++++++---------
block/qcow2-refcount.c | 2 +-
block/qcow2.c | 4 ++--
block/qcow2.h | 14 +++++++-------
4 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index fd32316d6f..f6a12ed510 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -884,7 +884,7 @@ int qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
return 0;
}
-static int perform_cow(BlockDriverState *bs, QCowL2Meta *m)
+static int coroutine_fn perform_cow(BlockDriverState *bs, QCowL2Meta *m)
{
BDRVQcow2State *s = bs->opaque;
Qcow2COWRegion *start = &m->cow_start;
@@ -1024,7 +1024,7 @@ fail:
return ret;
}
-int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m)
+int coroutine_fn qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m)
{
BDRVQcow2State *s = bs->opaque;
int i, j = 0, l2_index, ret;
@@ -1397,8 +1397,8 @@ static int count_single_write_clusters(BlockDriverState *bs, int nb_clusters,
* information on cluster allocation may be invalid now. The caller
* must start over anyway, so consider *cur_bytes undefined.
*/
-static int handle_dependencies(BlockDriverState *bs, uint64_t guest_offset,
- uint64_t *cur_bytes, QCowL2Meta **m)
+static int coroutine_fn handle_dependencies(BlockDriverState *bs, uint64_t guest_offset,
+ uint64_t *cur_bytes, QCowL2Meta **m)
{
BDRVQcow2State *s = bs->opaque;
QCowL2Meta *old_alloc;
@@ -1772,9 +1772,9 @@ out:
*
* Return 0 on success and -errno in error cases
*/
-int qcow2_alloc_host_offset(BlockDriverState *bs, uint64_t offset,
- unsigned int *bytes, uint64_t *host_offset,
- QCowL2Meta **m)
+int coroutine_fn qcow2_alloc_host_offset(BlockDriverState *bs, uint64_t offset,
+ unsigned int *bytes, uint64_t *host_offset,
+ QCowL2Meta **m)
{
BDRVQcow2State *s = bs->opaque;
uint64_t start, remaining;
@@ -2105,8 +2105,8 @@ out:
return ret;
}
-int qcow2_subcluster_zeroize(BlockDriverState *bs, uint64_t offset,
- uint64_t bytes, int flags)
+int coroutine_fn qcow2_subcluster_zeroize(BlockDriverState *bs, uint64_t offset,
+ uint64_t bytes, int flags)
{
BDRVQcow2State *s = bs->opaque;
uint64_t end_offset = offset + bytes;
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 1a6277c783..1fbb07ca77 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -3706,7 +3706,7 @@ int64_t qcow2_get_last_cluster(BlockDriverState *bs, int64_t size)
return -EIO;
}
-int qcow2_detect_metadata_preallocation(BlockDriverState *bs)
+int coroutine_fn qcow2_detect_metadata_preallocation(BlockDriverState *bs)
{
BDRVQcow2State *s = bs->opaque;
int64_t i, end_cluster, cluster_count = 0, threshold;
diff --git a/block/qcow2.c b/block/qcow2.c
index c6c6692fb7..b4d04e91fa 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2436,7 +2436,7 @@ static bool merge_cow(uint64_t offset, unsigned bytes,
* Return 1 if the COW regions read as zeroes, 0 if not, < 0 on error.
* Note that returning 0 does not guarantee non-zero data.
*/
-static int is_zero_cow(BlockDriverState *bs, QCowL2Meta *m)
+static int coroutine_fn is_zero_cow(BlockDriverState *bs, QCowL2Meta *m)
{
/*
* This check is designed for optimization shortcut so it must be
@@ -2454,7 +2454,7 @@ static int is_zero_cow(BlockDriverState *bs, QCowL2Meta *m)
m->cow_end.nb_bytes);
}
-static int handle_alloc_space(BlockDriverState *bs, QCowL2Meta *l2meta)
+static int coroutine_fn handle_alloc_space(BlockDriverState *bs, QCowL2Meta *l2meta)
{
BDRVQcow2State *s = bs->opaque;
QCowL2Meta *m;
diff --git a/block/qcow2.h b/block/qcow2.h
index c8d9e8ea79..36495d9051 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -895,7 +895,7 @@ int qcow2_change_refcount_order(BlockDriverState *bs, int refcount_order,
void *cb_opaque, Error **errp);
int qcow2_shrink_reftable(BlockDriverState *bs);
int64_t qcow2_get_last_cluster(BlockDriverState *bs, int64_t size);
-int qcow2_detect_metadata_preallocation(BlockDriverState *bs);
+int coroutine_fn qcow2_detect_metadata_preallocation(BlockDriverState *bs);
/* qcow2-cluster.c functions */
int qcow2_grow_l1_table(BlockDriverState *bs, uint64_t min_size,
@@ -908,9 +908,9 @@ int qcow2_encrypt_sectors(BDRVQcow2State *s, int64_t sector_num,
int qcow2_get_host_offset(BlockDriverState *bs, uint64_t offset,
unsigned int *bytes, uint64_t *host_offset,
QCow2SubclusterType *subcluster_type);
-int qcow2_alloc_host_offset(BlockDriverState *bs, uint64_t offset,
- unsigned int *bytes, uint64_t *host_offset,
- QCowL2Meta **m);
+int coroutine_fn qcow2_alloc_host_offset(BlockDriverState *bs, uint64_t offset,
+ unsigned int *bytes, uint64_t *host_offset,
+ QCowL2Meta **m);
int qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
uint64_t offset,
int compressed_size,
@@ -918,13 +918,13 @@ int qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
void qcow2_parse_compressed_l2_entry(BlockDriverState *bs, uint64_t l2_entry,
uint64_t *coffset, int *csize);
-int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
+int coroutine_fn qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
void qcow2_alloc_cluster_abort(BlockDriverState *bs, QCowL2Meta *m);
int qcow2_cluster_discard(BlockDriverState *bs, uint64_t offset,
uint64_t bytes, enum qcow2_discard_type type,
bool full_discard);
-int qcow2_subcluster_zeroize(BlockDriverState *bs, uint64_t offset,
- uint64_t bytes, int flags);
+int coroutine_fn qcow2_subcluster_zeroize(BlockDriverState *bs, uint64_t offset,
+ uint64_t bytes, int flags);
int qcow2_expand_zero_clusters(BlockDriverState *bs,
BlockDriverAmendStatusCB *status_cb,
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 15/26] copy-before-write: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (13 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 14/26] qcow2: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 16/26] curl: " Paolo Bonzini
` (11 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/copy-before-write.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
index c24b8dd117..14af7eb753 100644
--- a/block/copy-before-write.c
+++ b/block/copy-before-write.c
@@ -203,9 +203,9 @@ static int coroutine_fn cbw_co_flush(BlockDriverState *bs)
* It's guaranteed that guest writes will not interact in the region until
* cbw_snapshot_read_unlock() called.
*/
-static BlockReq *cbw_snapshot_read_lock(BlockDriverState *bs,
- int64_t offset, int64_t bytes,
- int64_t *pnum, BdrvChild **file)
+static coroutine_fn BlockReq *cbw_snapshot_read_lock(BlockDriverState *bs,
+ int64_t offset, int64_t bytes,
+ int64_t *pnum, BdrvChild **file)
{
BDRVCopyBeforeWriteState *s = bs->opaque;
BlockReq *req = g_new(BlockReq, 1);
@@ -240,7 +240,7 @@ static BlockReq *cbw_snapshot_read_lock(BlockDriverState *bs,
return req;
}
-static void cbw_snapshot_read_unlock(BlockDriverState *bs, BlockReq *req)
+static coroutine_fn void cbw_snapshot_read_unlock(BlockDriverState *bs, BlockReq *req)
{
BDRVCopyBeforeWriteState *s = bs->opaque;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 16/26] curl: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (14 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 15/26] copy-before-write: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 17/26] qed: " Paolo Bonzini
` (10 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/curl.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/curl.c b/block/curl.c
index 1e0f609579..cba4c4cac7 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -855,7 +855,7 @@ out_noclean:
return -EINVAL;
}
-static void curl_setup_preadv(BlockDriverState *bs, CURLAIOCB *acb)
+static void coroutine_fn curl_setup_preadv(BlockDriverState *bs, CURLAIOCB *acb)
{
CURLState *state;
int running;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 17/26] qed: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (15 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 16/26] curl: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 18/26] quorum: " Paolo Bonzini
` (9 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/qed.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/block/qed.c b/block/qed.c
index 40943e679b..8b6a5288c5 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -254,7 +254,7 @@ static CachedL2Table *qed_new_l2_table(BDRVQEDState *s)
return l2_table;
}
-static bool qed_plug_allocating_write_reqs(BDRVQEDState *s)
+static bool coroutine_fn qed_plug_allocating_write_reqs(BDRVQEDState *s)
{
qemu_co_mutex_lock(&s->table_lock);
@@ -273,7 +273,7 @@ static bool qed_plug_allocating_write_reqs(BDRVQEDState *s)
return true;
}
-static void qed_unplug_allocating_write_reqs(BDRVQEDState *s)
+static void coroutine_fn qed_unplug_allocating_write_reqs(BDRVQEDState *s)
{
qemu_co_mutex_lock(&s->table_lock);
assert(s->allocating_write_reqs_plugged);
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 18/26] quorum: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (16 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 17/26] qed: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 19/26] throttle: " Paolo Bonzini
` (8 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/quorum.c | 35 ++++++++++++++++++-----------------
1 file changed, 18 insertions(+), 17 deletions(-)
diff --git a/block/quorum.c b/block/quorum.c
index f33f30d36b..5ff69d7443 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -161,11 +161,10 @@ static bool quorum_64bits_compare(QuorumVoteValue *a, QuorumVoteValue *b)
return a->l == b->l;
}
-static QuorumAIOCB *quorum_aio_get(BlockDriverState *bs,
- QEMUIOVector *qiov,
- uint64_t offset,
- uint64_t bytes,
- int flags)
+static QuorumAIOCB *coroutine_fn quorum_aio_get(BlockDriverState *bs,
+ QEMUIOVector *qiov,
+ uint64_t offset, uint64_t bytes,
+ int flags)
{
BDRVQuorumState *s = bs->opaque;
QuorumAIOCB *acb = g_new(QuorumAIOCB, 1);
@@ -273,7 +272,7 @@ static void quorum_report_bad_versions(BDRVQuorumState *s,
}
}
-static void quorum_rewrite_entry(void *opaque)
+static void coroutine_fn quorum_rewrite_entry(void *opaque)
{
QuorumCo *co = opaque;
QuorumAIOCB *acb = co->acb;
@@ -574,7 +573,7 @@ free_exit:
quorum_free_vote_list(&acb->votes);
}
-static void read_quorum_children_entry(void *opaque)
+static void coroutine_fn read_quorum_children_entry(void *opaque)
{
QuorumCo *co = opaque;
QuorumAIOCB *acb = co->acb;
@@ -602,7 +601,7 @@ static void read_quorum_children_entry(void *opaque)
}
}
-static int read_quorum_children(QuorumAIOCB *acb)
+static int coroutine_fn read_quorum_children(QuorumAIOCB *acb)
{
BDRVQuorumState *s = acb->bs->opaque;
int i;
@@ -643,7 +642,7 @@ static int read_quorum_children(QuorumAIOCB *acb)
return acb->vote_ret;
}
-static int read_fifo_child(QuorumAIOCB *acb)
+static int coroutine_fn read_fifo_child(QuorumAIOCB *acb)
{
BDRVQuorumState *s = acb->bs->opaque;
int n, ret;
@@ -664,8 +663,9 @@ static int read_fifo_child(QuorumAIOCB *acb)
return ret;
}
-static int quorum_co_preadv(BlockDriverState *bs, int64_t offset, int64_t bytes,
- QEMUIOVector *qiov, BdrvRequestFlags flags)
+static int coroutine_fn quorum_co_preadv(BlockDriverState *bs,
+ int64_t offset, int64_t bytes,
+ QEMUIOVector *qiov, BdrvRequestFlags flags)
{
BDRVQuorumState *s = bs->opaque;
QuorumAIOCB *acb = quorum_aio_get(bs, qiov, offset, bytes, flags);
@@ -684,7 +684,7 @@ static int quorum_co_preadv(BlockDriverState *bs, int64_t offset, int64_t bytes,
return ret;
}
-static void write_quorum_entry(void *opaque)
+static void coroutine_fn write_quorum_entry(void *opaque)
{
QuorumCo *co = opaque;
QuorumAIOCB *acb = co->acb;
@@ -715,9 +715,9 @@ static void write_quorum_entry(void *opaque)
}
}
-static int quorum_co_pwritev(BlockDriverState *bs, int64_t offset,
- int64_t bytes, QEMUIOVector *qiov,
- BdrvRequestFlags flags)
+static int coroutine_fn quorum_co_pwritev(BlockDriverState *bs, int64_t offset,
+ int64_t bytes, QEMUIOVector *qiov,
+ BdrvRequestFlags flags)
{
BDRVQuorumState *s = bs->opaque;
QuorumAIOCB *acb = quorum_aio_get(bs, qiov, offset, bytes, flags);
@@ -746,8 +746,9 @@ static int quorum_co_pwritev(BlockDriverState *bs, int64_t offset,
return ret;
}
-static int quorum_co_pwrite_zeroes(BlockDriverState *bs, int64_t offset,
- int64_t bytes, BdrvRequestFlags flags)
+static int coroutine_fn quorum_co_pwrite_zeroes(BlockDriverState *bs,
+ int64_t offset, int64_t bytes,
+ BdrvRequestFlags flags)
{
return quorum_co_pwritev(bs, offset, bytes, NULL,
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 19/26] throttle: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (17 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 18/26] quorum: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 20/26] vmdk: " Paolo Bonzini
` (7 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/throttle.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/throttle.c b/block/throttle.c
index 6e8d52fa24..ddd450593a 100644
--- a/block/throttle.c
+++ b/block/throttle.c
@@ -162,7 +162,7 @@ static int coroutine_fn throttle_co_pwritev_compressed(BlockDriverState *bs,
BDRV_REQ_WRITE_COMPRESSED);
}
-static int throttle_co_flush(BlockDriverState *bs)
+static int coroutine_fn throttle_co_flush(BlockDriverState *bs)
{
return bdrv_co_flush(bs->file->bs);
}
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 20/26] vmdk: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (18 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 19/26] throttle: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 21/26] job: " Paolo Bonzini
` (6 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/vmdk.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/block/vmdk.c b/block/vmdk.c
index fe07a54866..34b5e3f52e 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -1787,10 +1787,10 @@ static int coroutine_fn vmdk_co_block_status(BlockDriverState *bs,
return ret;
}
-static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset,
- int64_t offset_in_cluster, QEMUIOVector *qiov,
- uint64_t qiov_offset, uint64_t n_bytes,
- uint64_t offset)
+static int coroutine_fn vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset,
+ int64_t offset_in_cluster, QEMUIOVector *qiov,
+ uint64_t qiov_offset, uint64_t n_bytes,
+ uint64_t offset)
{
int ret;
VmdkGrainMarker *data = NULL;
@@ -1868,9 +1868,9 @@ static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset,
return ret;
}
-static int vmdk_read_extent(VmdkExtent *extent, int64_t cluster_offset,
- int64_t offset_in_cluster, QEMUIOVector *qiov,
- int bytes)
+static int coroutine_fn vmdk_read_extent(VmdkExtent *extent, int64_t cluster_offset,
+ int64_t offset_in_cluster, QEMUIOVector *qiov,
+ int bytes)
{
int ret;
int cluster_bytes, buf_bytes;
@@ -2015,9 +2015,9 @@ fail:
*
* Returns: error code with 0 for success.
*/
-static int vmdk_pwritev(BlockDriverState *bs, uint64_t offset,
- uint64_t bytes, QEMUIOVector *qiov,
- bool zeroed, bool zero_dry_run)
+static int coroutine_fn vmdk_pwritev(BlockDriverState *bs, uint64_t offset,
+ uint64_t bytes, QEMUIOVector *qiov,
+ bool zeroed, bool zero_dry_run)
{
BDRVVmdkState *s = bs->opaque;
VmdkExtent *extent = NULL;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 21/26] job: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (19 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 20/26] vmdk: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 22/26] coroutine-lock: " Paolo Bonzini
` (5 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
include/qemu/job.h | 2 +-
job.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/qemu/job.h b/include/qemu/job.h
index c105b31076..397ac39608 100644
--- a/include/qemu/job.h
+++ b/include/qemu/job.h
@@ -436,7 +436,7 @@ void coroutine_fn job_pause_point(Job *job);
*
* Yield the job coroutine.
*/
-void job_yield(Job *job);
+void coroutine_fn job_yield(Job *job);
/**
* @job: The job that calls the function.
diff --git a/job.c b/job.c
index 075c6f3a20..20f0d8b2cd 100644
--- a/job.c
+++ b/job.c
@@ -525,7 +525,7 @@ void coroutine_fn job_pause_point(Job *job)
}
}
-void job_yield(Job *job)
+void coroutine_fn job_yield(Job *job)
{
assert(job->busy);
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 22/26] coroutine-lock: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (20 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 21/26] job: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 23/26] raw-format: " Paolo Bonzini
` (4 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
util/qemu-coroutine-lock.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/util/qemu-coroutine-lock.c b/util/qemu-coroutine-lock.c
index 9ad24ab1af..15c82d9348 100644
--- a/util/qemu-coroutine-lock.c
+++ b/util/qemu-coroutine-lock.c
@@ -135,7 +135,7 @@ typedef struct CoWaitRecord {
QSLIST_ENTRY(CoWaitRecord) next;
} CoWaitRecord;
-static void push_waiter(CoMutex *mutex, CoWaitRecord *w)
+static void coroutine_fn push_waiter(CoMutex *mutex, CoWaitRecord *w)
{
w->co = qemu_coroutine_self();
QSLIST_INSERT_HEAD_ATOMIC(&mutex->from_push, w, next);
@@ -332,7 +332,7 @@ void qemu_co_rwlock_init(CoRwlock *lock)
}
/* Releases the internal CoMutex. */
-static void qemu_co_rwlock_maybe_wake_one(CoRwlock *lock)
+static void coroutine_fn qemu_co_rwlock_maybe_wake_one(CoRwlock *lock)
{
CoRwTicket *tkt = QSIMPLEQ_FIRST(&lock->tickets);
Coroutine *co = NULL;
@@ -365,7 +365,7 @@ static void qemu_co_rwlock_maybe_wake_one(CoRwlock *lock)
}
}
-void qemu_co_rwlock_rdlock(CoRwlock *lock)
+void coroutine_fn qemu_co_rwlock_rdlock(CoRwlock *lock)
{
Coroutine *self = qemu_coroutine_self();
@@ -390,7 +390,7 @@ void qemu_co_rwlock_rdlock(CoRwlock *lock)
self->locks_held++;
}
-void qemu_co_rwlock_unlock(CoRwlock *lock)
+void coroutine_fn qemu_co_rwlock_unlock(CoRwlock *lock)
{
Coroutine *self = qemu_coroutine_self();
@@ -408,7 +408,7 @@ void qemu_co_rwlock_unlock(CoRwlock *lock)
qemu_co_rwlock_maybe_wake_one(lock);
}
-void qemu_co_rwlock_downgrade(CoRwlock *lock)
+void coroutine_fn qemu_co_rwlock_downgrade(CoRwlock *lock)
{
qemu_co_mutex_lock(&lock->mutex);
assert(lock->owners == -1);
@@ -418,7 +418,7 @@ void qemu_co_rwlock_downgrade(CoRwlock *lock)
qemu_co_rwlock_maybe_wake_one(lock);
}
-void qemu_co_rwlock_wrlock(CoRwlock *lock)
+void coroutine_fn qemu_co_rwlock_wrlock(CoRwlock *lock)
{
Coroutine *self = qemu_coroutine_self();
@@ -438,7 +438,7 @@ void qemu_co_rwlock_wrlock(CoRwlock *lock)
self->locks_held++;
}
-void qemu_co_rwlock_upgrade(CoRwlock *lock)
+void coroutine_fn qemu_co_rwlock_upgrade(CoRwlock *lock)
{
qemu_co_mutex_lock(&lock->mutex);
assert(lock->owners > 0);
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 23/26] raw-format: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (21 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 22/26] coroutine-lock: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 24/26] 9p: " Paolo Bonzini
` (3 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/raw-format.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/raw-format.c b/block/raw-format.c
index 69fd650eaf..45440345b6 100644
--- a/block/raw-format.c
+++ b/block/raw-format.c
@@ -411,7 +411,7 @@ static void raw_lock_medium(BlockDriverState *bs, bool locked)
bdrv_lock_medium(bs->file->bs, locked);
}
-static int raw_co_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
+static int coroutine_fn raw_co_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
{
BDRVRawState *s = bs->opaque;
if (s->offset || s->has_size) {
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 24/26] 9p: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (22 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 23/26] raw-format: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 25/26] migration: " Paolo Bonzini
` (2 subsequent siblings)
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Marc-André Lureau, Greg Kurz
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Acked-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/9pfs/9p.h | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h
index 994f952600..a523ac34a9 100644
--- a/hw/9pfs/9p.h
+++ b/hw/9pfs/9p.h
@@ -424,21 +424,24 @@ typedef struct V9fsGetlock
extern int open_fd_hw;
extern int total_open_fd;
-static inline void v9fs_path_write_lock(V9fsState *s)
+static inline void coroutine_fn
+v9fs_path_write_lock(V9fsState *s)
{
if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) {
qemu_co_rwlock_wrlock(&s->rename_lock);
}
}
-static inline void v9fs_path_read_lock(V9fsState *s)
+static inline void coroutine_fn
+v9fs_path_read_lock(V9fsState *s)
{
if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) {
qemu_co_rwlock_rdlock(&s->rename_lock);
}
}
-static inline void v9fs_path_unlock(V9fsState *s)
+static inline void coroutine_fn
+v9fs_path_unlock(V9fsState *s)
{
if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) {
qemu_co_rwlock_unlock(&s->rename_lock);
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 25/26] migration: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (23 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 24/26] 9p: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-09-22 8:49 ` [PATCH 26/26] test-coroutine: " Paolo Bonzini
2022-10-06 12:17 ` [PATCH v3 00/26] block: fix " Kevin Wolf
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, qemu-block, afaria, Marc-André Lureau, Juan Quintela,
Stefan Hajnoczi
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
migration/migration.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/migration/migration.c b/migration/migration.c
index bb8bbddfe4..739bb683f3 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -574,7 +574,8 @@ static void process_incoming_migration_bh(void *opaque)
migration_incoming_state_destroy();
}
-static void process_incoming_migration_co(void *opaque)
+static void coroutine_fn
+process_incoming_migration_co(void *opaque)
{
MigrationIncomingState *mis = migration_incoming_get_current();
PostcopyState ps;
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* [PATCH 26/26] test-coroutine: add missing coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (24 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 25/26] migration: " Paolo Bonzini
@ 2022-09-22 8:49 ` Paolo Bonzini
2022-10-06 12:17 ` [PATCH v3 00/26] block: fix " Kevin Wolf
26 siblings, 0 replies; 35+ messages in thread
From: Paolo Bonzini @ 2022-09-22 8:49 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, qemu-block, afaria, Marc-André Lureau
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Callers of coroutine_fn must be coroutine_fn themselves, or the call
must be within "if (qemu_in_coroutine())". Apply coroutine_fn to
functions where this holds.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Alberto Faria <afaria@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
tests/unit/test-coroutine.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/unit/test-coroutine.c b/tests/unit/test-coroutine.c
index aa77a3bcb3..e16b80c245 100644
--- a/tests/unit/test-coroutine.c
+++ b/tests/unit/test-coroutine.c
@@ -610,7 +610,7 @@ static void perf_baseline(void)
g_test_message("Function call %u iterations: %f s", maxcycles, duration);
}
-static __attribute__((noinline)) void perf_cost_func(void *opaque)
+static __attribute__((noinline)) void coroutine_fn perf_cost_func(void *opaque)
{
qemu_coroutine_yield();
}
--
2.37.3
^ permalink raw reply related [flat|nested] 35+ messages in thread
* Re: [PATCH v3 00/26] block: fix coroutine_fn annotations
2022-09-22 8:48 [PATCH v3 00/26] block: fix coroutine_fn annotations Paolo Bonzini
` (25 preceding siblings ...)
2022-09-22 8:49 ` [PATCH 26/26] test-coroutine: " Paolo Bonzini
@ 2022-10-06 12:17 ` Kevin Wolf
26 siblings, 0 replies; 35+ messages in thread
From: Kevin Wolf @ 2022-10-06 12:17 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel, qemu-block, afaria
Am 22.09.2022 um 10:48 hat Paolo Bonzini geschrieben:
> As discussed at KVM Forum 2022, I am reposting this series to
> add more coroutine_fn annotations. Fixing the annotations
> enables static analysis of which functions are coroutine-only
> and which are mixed (coroutine/non-coroutine).
>
> A lot of the patches are similar to the ones that Marc-André Lureau
> wrote back in 2017 (posted at [1]) but due to the changes in the code
> it was easier to redo them.
Thanks, dropped patch 6, fixed up the coding style in several patches
(long lines, tab, wrong number of spaces for indentation), and applied
to the block branch.
Kevin
^ permalink raw reply [flat|nested] 35+ messages in thread