All of lore.kernel.org
 help / color / mirror / Atom feed
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
To: qemu-block@nongnu.org
Cc: "Kevin Wolf" <kwolf@redhat.com>, "Fam Zheng" <fam@euphon.net>,
	"Vladimir Sementsov-Ogievskiy" <vsementsov@virtuozzo.com>,
	"Daniel P. Berrangé" <berrange@redhat.com>,
	"Eduardo Habkost" <ehabkost@redhat.com>,
	"Juan Quintela" <quintela@redhat.com>,
	qemu-devel@nongnu.org, "John Snow" <jsnow@redhat.com>,
	"Emanuele Giuseppe Esposito" <eesposit@redhat.com>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
	"Hanna Reitz" <hreitz@redhat.com>,
	"Stefan Hajnoczi" <stefanha@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Eric Blake" <eblake@redhat.com>
Subject: [RFC PATCH v2 09/25] include/block/blockjob_int.h: split header into I/O and GS API
Date: Tue,  5 Oct 2021 10:31:59 -0400	[thread overview]
Message-ID: <20211005143215.29500-10-eesposit@redhat.com> (raw)
In-Reply-To: <20211005143215.29500-1-eesposit@redhat.com>

Since the I/O functions are not many, keep a single file.
Also split the function pointers in BlockJobDriver.

Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
---
 include/block/blockjob_int.h | 55 ++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h
index 6633d83da2..bac4e8f46d 100644
--- a/include/block/blockjob_int.h
+++ b/include/block/blockjob_int.h
@@ -38,6 +38,12 @@ struct BlockJobDriver {
     /** Generic JobDriver callbacks and settings */
     JobDriver job_driver;
 
+    /*
+     * I/O API functions. These functions are thread-safe, and therefore
+     * can run in any thread as long as they have called
+     * aio_context_acquire/release().
+     */
+
     /*
      * Returns whether the job has pending requests for the child or will
      * submit new requests before the next pause point. This callback is polled
@@ -46,6 +52,28 @@ struct BlockJobDriver {
      */
     bool (*drained_poll)(BlockJob *job);
 
+    /*
+     * Global state (GS) API. These functions run under the BQL lock.
+     *
+     * If a function modifies the graph, it also uses drain and/or
+     * aio_context_acquire/release to be sure it has unique access.
+     * aio_context locking is needed together with BQL because of
+     * the thread-safe I/O API that concurrently runs and accesses
+     * the graph without the BQL.
+     *
+     * It is important to note that not all of these functions are
+     * necessarily limited to running under the BQL, but they would
+     * require additional auditing and may small thread-safety changes
+     * to move them into the I/O API. Often it's not worth doing that
+     * work since the APIs are only used with the BQL held at the
+     * moment, so they have been placed in the GS API (for now).
+     *
+     * All callers that use these function pointers must
+     * use this assertion:
+     * g_assert(qemu_in_main_thread());
+     * to catch when they are accidentally called without the BQL.
+     */
+
     /*
      * If the callback is not NULL, it will be invoked before the job is
      * resumed in a new AioContext.  This is the place to move any resources
@@ -56,6 +84,27 @@ struct BlockJobDriver {
     void (*set_speed)(BlockJob *job, int64_t speed);
 };
 
+/*
+ * Global state (GS) API. These functions run under the BQL lock.
+ *
+ * If a function modifies the graph, it also uses drain and/or
+ * aio_context_acquire/release to be sure it has unique access.
+ * aio_context locking is needed together with BQL because of
+ * the thread-safe I/O API that concurrently runs and accesses
+ * the graph without the BQL.
+ *
+ * It is important to note that not all of these functions are
+ * necessarily limited to running under the BQL, but they would
+ * require additional auditing and may small thread-safety changes
+ * to move them into the I/O API. Often it's not worth doing that
+ * work since the APIs are only used with the BQL held at the
+ * moment, so they have been placed in the GS API (for now).
+ *
+ * All functions below must use this assertion:
+ * g_assert(qemu_in_main_thread());
+ * to catch when they are accidentally called without the BQL.
+ */
+
 /**
  * block_job_create:
  * @job_id: The id of the newly-created job, or %NULL to have one
@@ -98,6 +147,12 @@ void block_job_free(Job *job);
  */
 void block_job_user_resume(Job *job);
 
+/*
+ * I/O API functions. These functions are thread-safe, and therefore
+ * can run in any thread as long as they have called
+ * aio_context_acquire/release().
+ */
+
 /**
  * block_job_ratelimit_get_delay:
  *
-- 
2.27.0



  parent reply	other threads:[~2021-10-05 14:54 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-05 14:31 [RFC PATCH v2 00/25] block layer: split block APIs in global state and I/O Emanuele Giuseppe Esposito
2021-10-05 14:31 ` [RFC PATCH v2 01/25] main-loop.h: introduce qemu_in_main_thread() Emanuele Giuseppe Esposito
2021-10-07  9:05   ` Stefan Hajnoczi
2021-10-05 14:31 ` [RFC PATCH v2 02/25] include/sysemu/block-backend: split header into I/O and global state (GS) API Emanuele Giuseppe Esposito
2021-10-07  9:13   ` Stefan Hajnoczi
2021-10-05 14:31 ` [RFC PATCH v2 03/25] block/block-backend.c: assertions for block-backend Emanuele Giuseppe Esposito
2021-10-05 16:29   ` Eric Blake
2021-10-06  9:36     ` Emanuele Giuseppe Esposito
2021-10-07 10:48   ` Stefan Hajnoczi
2021-10-05 14:31 ` [RFC PATCH v2 04/25] include/block/block: split header into I/O and global state API Emanuele Giuseppe Esposito
2021-10-07  9:33   ` Stefan Hajnoczi
2021-10-07 10:54     ` Emanuele Giuseppe Esposito
2021-10-07 11:51       ` Paolo Bonzini
2021-10-07 13:18         ` Eric Blake
2021-10-07 11:43   ` Daniel P. Berrangé
2021-10-07 13:01     ` Stefan Hajnoczi
2021-10-08  7:26       ` Emanuele Giuseppe Esposito
2021-10-05 14:31 ` [RFC PATCH v2 05/25] assertions for block " Emanuele Giuseppe Esposito
2021-10-07 10:44   ` Stefan Hajnoczi
2021-10-05 14:31 ` [RFC PATCH v2 06/25] include/block/block_int: split header into I/O and " Emanuele Giuseppe Esposito
2021-10-07 10:52   ` Stefan Hajnoczi
2021-10-07 11:30     ` Emanuele Giuseppe Esposito
2021-10-07 13:38       ` Stefan Hajnoczi
2021-10-05 14:31 ` [RFC PATCH v2 07/25] assertions for block_int " Emanuele Giuseppe Esposito
2021-10-07 14:19   ` Stefan Hajnoczi
2021-10-05 14:31 ` [RFC PATCH v2 08/25] block: introduce assert_bdrv_graph_writable Emanuele Giuseppe Esposito
2021-10-07 12:01   ` Paolo Bonzini
2021-10-07 12:02   ` Paolo Bonzini
2021-10-07 13:47     ` Emanuele Giuseppe Esposito
2021-10-07 14:18       ` Stefan Hajnoczi
2021-10-05 14:31 ` Emanuele Giuseppe Esposito [this message]
2021-10-07 14:21   ` [RFC PATCH v2 09/25] include/block/blockjob_int.h: split header into I/O and GS API Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 10/25] assertions for blockjob_int.h Emanuele Giuseppe Esposito
2021-10-07 14:21   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 11/25] include/block/blockjob.h: global state API Emanuele Giuseppe Esposito
2021-10-07 14:23   ` Stefan Hajnoczi
2021-10-08  7:20     ` Emanuele Giuseppe Esposito
2021-10-11 11:10       ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 12/25] assertions for blockob.h " Emanuele Giuseppe Esposito
2021-10-07 14:25   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 13/25] include/systemu/blockdev.h: " Emanuele Giuseppe Esposito
2021-10-07 12:00   ` Paolo Bonzini
2021-10-07 14:28   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 14/25] assertions for blockdev.h " Emanuele Giuseppe Esposito
2021-10-07 12:04   ` Paolo Bonzini
2021-10-07 14:29   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 15/25] include/block/snapshot: global state API + assertions Emanuele Giuseppe Esposito
2021-10-07 12:06   ` Paolo Bonzini
2021-10-07 14:31   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 16/25] block/backup-top.h: " Emanuele Giuseppe Esposito
2021-10-07 12:08   ` Paolo Bonzini
2021-10-07 14:32   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 17/25] include/block/transactions: " Emanuele Giuseppe Esposito
2021-10-07 14:47   ` Stefan Hajnoczi
2021-10-08  7:18     ` Emanuele Giuseppe Esposito
2021-10-05 14:32 ` [RFC PATCH v2 18/25] block/coroutines: I/O API Emanuele Giuseppe Esposito
2021-10-07 11:52   ` Paolo Bonzini
2021-10-07 14:47   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 19/25] block_int-common.h: split function pointers in BlockDriver Emanuele Giuseppe Esposito
2021-10-07 14:49   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 20/25] block_int-common.h: assertion in the callers of BlockDriver function pointers Emanuele Giuseppe Esposito
2021-10-07 14:50   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 21/25] block_int-common.h: split function pointers in BdrvChildClass Emanuele Giuseppe Esposito
2021-10-07 14:51   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 22/25] block_int-common.h: assertions in the callers of BdrvChildClass function pointers Emanuele Giuseppe Esposito
2021-10-07 14:51   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 23/25] block-backend-common.h: split function pointers in BlockDevOps Emanuele Giuseppe Esposito
2021-10-07 14:52   ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 24/25] job.h: split function pointers in JobDriver Emanuele Giuseppe Esposito
2021-10-07 14:54   ` Stefan Hajnoczi
2021-10-08 10:48     ` Emanuele Giuseppe Esposito
2021-10-11 11:12       ` Stefan Hajnoczi
2021-10-05 14:32 ` [RFC PATCH v2 25/25] job.h: assertions in the callers of JobDriver funcion pointers Emanuele Giuseppe Esposito
2021-10-07 14:54   ` Stefan Hajnoczi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211005143215.29500-10-eesposit@redhat.com \
    --to=eesposit@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=eblake@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=fam@euphon.net \
    --cc=hreitz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=richard.henderson@linaro.org \
    --cc=stefanha@redhat.com \
    --cc=vsementsov@virtuozzo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.