提交 91bcea48 编写于 作者: P Paolo Bonzini 提交者: Stefan Hajnoczi

block: document fields protected by AioContext lock

Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
Reviewed-by: NFam Zheng <famz@redhat.com>
Reviewed-by: NDaniel P. Berrange <berrange@redhat.com>
Message-id: 20170213135235.12274-19-pbonzini@redhat.com
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 bd451435
...@@ -430,8 +430,9 @@ struct BdrvChild { ...@@ -430,8 +430,9 @@ struct BdrvChild {
* copied as well. * copied as well.
*/ */
struct BlockDriverState { struct BlockDriverState {
int64_t total_sectors; /* if we are reading a disk image, give its /* Protected by big QEMU lock or read-only after opening. No special
size in sectors */ * locking needed during I/O...
*/
int open_flags; /* flags used to open the file, re-used for re-open */ int open_flags; /* flags used to open the file, re-used for re-open */
bool read_only; /* if true, the media is read only */ bool read_only; /* if true, the media is read only */
bool encrypted; /* if true, the media is encrypted */ bool encrypted; /* if true, the media is encrypted */
...@@ -439,14 +440,6 @@ struct BlockDriverState { ...@@ -439,14 +440,6 @@ struct BlockDriverState {
bool sg; /* if true, the device is a /dev/sg* */ bool sg; /* if true, the device is a /dev/sg* */
bool probed; /* if true, format was probed rather than specified */ bool probed; /* if true, format was probed rather than specified */
int copy_on_read; /* if nonzero, copy read backing sectors into image.
note this is a reference count */
CoQueue flush_queue; /* Serializing flush queue */
bool active_flush_req; /* Flush request in flight? */
unsigned int write_gen; /* Current data generation */
unsigned int flushed_gen; /* Flushed write generation */
BlockDriver *drv; /* NULL means no media */ BlockDriver *drv; /* NULL means no media */
void *opaque; void *opaque;
...@@ -468,18 +461,6 @@ struct BlockDriverState { ...@@ -468,18 +461,6 @@ struct BlockDriverState {
BdrvChild *backing; BdrvChild *backing;
BdrvChild *file; BdrvChild *file;
/* Callback before write request is processed */
NotifierWithReturnList before_write_notifiers;
/* number of in-flight requests; overall and serialising */
unsigned int in_flight;
unsigned int serialising_in_flight;
bool wakeup;
/* Offset after the highest byte written to */
uint64_t wr_highest_offset;
/* I/O Limits */ /* I/O Limits */
BlockLimits bl; BlockLimits bl;
...@@ -497,11 +478,8 @@ struct BlockDriverState { ...@@ -497,11 +478,8 @@ struct BlockDriverState {
QTAILQ_ENTRY(BlockDriverState) bs_list; QTAILQ_ENTRY(BlockDriverState) bs_list;
/* element of the list of monitor-owned BDS */ /* element of the list of monitor-owned BDS */
QTAILQ_ENTRY(BlockDriverState) monitor_list; QTAILQ_ENTRY(BlockDriverState) monitor_list;
QLIST_HEAD(, BdrvDirtyBitmap) dirty_bitmaps;
int refcnt; int refcnt;
QLIST_HEAD(, BdrvTrackedRequest) tracked_requests;
/* operation blockers */ /* operation blockers */
QLIST_HEAD(, BdrvOpBlocker) op_blockers[BLOCK_OP_TYPE_MAX]; QLIST_HEAD(, BdrvOpBlocker) op_blockers[BLOCK_OP_TYPE_MAX];
...@@ -522,6 +500,31 @@ struct BlockDriverState { ...@@ -522,6 +500,31 @@ struct BlockDriverState {
/* The error object in use for blocking operations on backing_hd */ /* The error object in use for blocking operations on backing_hd */
Error *backing_blocker; Error *backing_blocker;
/* Protected by AioContext lock */
/* If true, copy read backing sectors into image. Can be >1 if more
* than one client has requested copy-on-read.
*/
int copy_on_read;
/* If we are reading a disk image, give its size in sectors.
* Generally read-only; it is written to by load_vmstate and save_vmstate,
* but the block layer is quiescent during those.
*/
int64_t total_sectors;
/* Callback before write request is processed */
NotifierWithReturnList before_write_notifiers;
/* number of in-flight requests; overall and serialising */
unsigned int in_flight;
unsigned int serialising_in_flight;
bool wakeup;
/* Offset after the highest byte written to */
uint64_t wr_highest_offset;
/* threshold limit for writes, in bytes. "High water mark". */ /* threshold limit for writes, in bytes. "High water mark". */
uint64_t write_threshold_offset; uint64_t write_threshold_offset;
NotifierWithReturn write_threshold_notifier; NotifierWithReturn write_threshold_notifier;
...@@ -529,6 +532,17 @@ struct BlockDriverState { ...@@ -529,6 +532,17 @@ struct BlockDriverState {
/* counter for nested bdrv_io_plug */ /* counter for nested bdrv_io_plug */
unsigned io_plugged; unsigned io_plugged;
QLIST_HEAD(, BdrvTrackedRequest) tracked_requests;
CoQueue flush_queue; /* Serializing flush queue */
bool active_flush_req; /* Flush request in flight? */
unsigned int write_gen; /* Current data generation */
unsigned int flushed_gen; /* Flushed write generation */
QLIST_HEAD(, BdrvDirtyBitmap) dirty_bitmaps;
/* do we need to tell the quest if we have a volatile write cache? */
int enable_write_cache;
int quiesce_counter; int quiesce_counter;
}; };
......
...@@ -64,14 +64,20 @@ typedef struct BlockDevOps { ...@@ -64,14 +64,20 @@ typedef struct BlockDevOps {
* fields that must be public. This is in particular for QLIST_ENTRY() and * fields that must be public. This is in particular for QLIST_ENTRY() and
* friends so that BlockBackends can be kept in lists outside block-backend.c */ * friends so that BlockBackends can be kept in lists outside block-backend.c */
typedef struct BlockBackendPublic { typedef struct BlockBackendPublic {
/* I/O throttling. /* I/O throttling has its own locking, but also some fields are
* throttle_state tells us if this BlockBackend has I/O limits configured. * protected by the AioContext lock.
* io_limits_disabled tells us if they are currently being enforced */ */
/* Protected by AioContext lock. */
CoQueue throttled_reqs[2]; CoQueue throttled_reqs[2];
/* Nonzero if the I/O limits are currently being ignored; generally
* it is zero. */
unsigned int io_limits_disabled; unsigned int io_limits_disabled;
/* The following fields are protected by the ThrottleGroup lock. /* The following fields are protected by the ThrottleGroup lock.
* See the ThrottleGroup documentation for details. */ * See the ThrottleGroup documentation for details.
* throttle_state tells us if I/O limits are configured. */
ThrottleState *throttle_state; ThrottleState *throttle_state;
ThrottleTimers throttle_timers; ThrottleTimers throttle_timers;
unsigned pending_reqs[2]; unsigned pending_reqs[2];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册