mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-31 14:02:05 -06:00
block: document fields protected by AioContext lock
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 20170213135235.12274-19-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
bd451435c0
commit
91bcea4899
2 changed files with 49 additions and 29 deletions
|
@ -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 {
|
||||||
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 {
|
||||||
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 {
|
||||||
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 {
|
||||||
/* 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 {
|
||||||
/* 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 {
|
||||||
* 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];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue