qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

blockjob.h (6361B)


      1 /*
      2  * Declarations for long-running block device operations
      3  *
      4  * Copyright (c) 2011 IBM Corp.
      5  * Copyright (c) 2012 Red Hat, Inc.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a copy
      8  * of this software and associated documentation files (the "Software"), to deal
      9  * in the Software without restriction, including without limitation the rights
     10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11  * copies of the Software, and to permit persons to whom the Software is
     12  * furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included in
     15  * all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     23  * THE SOFTWARE.
     24  */
     25 
     26 #ifndef BLOCKJOB_H
     27 #define BLOCKJOB_H
     28 
     29 #include "qemu/job.h"
     30 #include "block/block.h"
     31 #include "qemu/ratelimit.h"
     32 
     33 #define BLOCK_JOB_SLICE_TIME 100000000ULL /* ns */
     34 
     35 typedef struct BlockJobDriver BlockJobDriver;
     36 
     37 /**
     38  * BlockJob:
     39  *
     40  * Long-running operation on a BlockDriverState.
     41  */
     42 typedef struct BlockJob {
     43     /**
     44      * Data belonging to the generic Job infrastructure.
     45      * Protected by job mutex.
     46      */
     47     Job job;
     48 
     49     /**
     50      * Status that is published by the query-block-jobs QMP API.
     51      * Protected by job mutex.
     52      */
     53     BlockDeviceIoStatus iostatus;
     54 
     55     /**
     56      * Speed that was set with @block_job_set_speed.
     57      * Always modified and read under QEMU global mutex (GLOBAL_STATE_CODE).
     58      */
     59     int64_t speed;
     60 
     61     /**
     62      * Rate limiting data structure for implementing @speed.
     63      * RateLimit API is thread-safe.
     64      */
     65     RateLimit limit;
     66 
     67     /**
     68      * Block other operations when block job is running.
     69      * Always modified and read under QEMU global mutex (GLOBAL_STATE_CODE).
     70      */
     71     Error *blocker;
     72 
     73     /** All notifiers are set once in block_job_create() and never modified. */
     74 
     75     /** Called when a cancelled job is finalised. */
     76     Notifier finalize_cancelled_notifier;
     77 
     78     /** Called when a successfully completed job is finalised. */
     79     Notifier finalize_completed_notifier;
     80 
     81     /** Called when the job transitions to PENDING */
     82     Notifier pending_notifier;
     83 
     84     /** Called when the job transitions to READY */
     85     Notifier ready_notifier;
     86 
     87     /** Called when the job coroutine yields or terminates */
     88     Notifier idle_notifier;
     89 
     90     /**
     91      * BlockDriverStates that are involved in this block job.
     92      * Always modified and read under QEMU global mutex (GLOBAL_STATE_CODE).
     93      */
     94     GSList *nodes;
     95 } BlockJob;
     96 
     97 /*
     98  * Global state (GS) API. These functions run under the BQL.
     99  *
    100  * See include/block/block-global-state.h for more information about
    101  * the GS API.
    102  */
    103 
    104 /**
    105  * block_job_next_locked:
    106  * @job: A block job, or %NULL.
    107  *
    108  * Get the next element from the list of block jobs after @job, or the
    109  * first one if @job is %NULL.
    110  *
    111  * Returns the requested job, or %NULL if there are no more jobs left.
    112  * Called with job lock held.
    113  */
    114 BlockJob *block_job_next_locked(BlockJob *job);
    115 
    116 /**
    117  * block_job_get:
    118  * @id: The id of the block job.
    119  *
    120  * Get the block job identified by @id (which must not be %NULL).
    121  *
    122  * Returns the requested job, or %NULL if it doesn't exist.
    123  * Called with job lock *not* held.
    124  */
    125 BlockJob *block_job_get(const char *id);
    126 
    127 /* Same as block_job_get(), but called with job lock held. */
    128 BlockJob *block_job_get_locked(const char *id);
    129 
    130 /**
    131  * block_job_add_bdrv:
    132  * @job: A block job
    133  * @name: The name to assign to the new BdrvChild
    134  * @bs: A BlockDriverState that is involved in @job
    135  * @perm, @shared_perm: Permissions to request on the node
    136  *
    137  * Add @bs to the list of BlockDriverState that are involved in
    138  * @job. This means that all operations will be blocked on @bs while
    139  * @job exists.
    140  */
    141 int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
    142                        uint64_t perm, uint64_t shared_perm, Error **errp);
    143 
    144 /**
    145  * block_job_remove_all_bdrv:
    146  * @job: The block job
    147  *
    148  * Remove all BlockDriverStates from the list of nodes that are involved in the
    149  * job. This removes the blockers added with block_job_add_bdrv().
    150  */
    151 void block_job_remove_all_bdrv(BlockJob *job);
    152 
    153 /**
    154  * block_job_has_bdrv:
    155  * @job: The block job
    156  *
    157  * Searches for @bs in the list of nodes that are involved in the
    158  * job.
    159  */
    160 bool block_job_has_bdrv(BlockJob *job, BlockDriverState *bs);
    161 
    162 /**
    163  * block_job_set_speed_locked:
    164  * @job: The job to set the speed for.
    165  * @speed: The new value
    166  * @errp: Error object.
    167  *
    168  * Set a rate-limiting parameter for the job; the actual meaning may
    169  * vary depending on the job type.
    170  *
    171  * Called with job lock held, but might release it temporarily.
    172  */
    173 bool block_job_set_speed_locked(BlockJob *job, int64_t speed, Error **errp);
    174 
    175 /**
    176  * block_job_query_locked:
    177  * @job: The job to get information about.
    178  *
    179  * Return information about a job.
    180  *
    181  * Called with job lock held.
    182  */
    183 BlockJobInfo *block_job_query_locked(BlockJob *job, Error **errp);
    184 
    185 /**
    186  * block_job_iostatus_reset_locked:
    187  * @job: The job whose I/O status should be reset.
    188  *
    189  * Reset I/O status on @job and on BlockDriverState objects it uses,
    190  * other than job->blk.
    191  *
    192  * Called with job lock held.
    193  */
    194 void block_job_iostatus_reset_locked(BlockJob *job);
    195 
    196 /*
    197  * block_job_get_aio_context:
    198  *
    199  * Returns aio context associated with a block job.
    200  */
    201 AioContext *block_job_get_aio_context(BlockJob *job);
    202 
    203 
    204 /*
    205  * Common functions that are neither I/O nor Global State.
    206  *
    207  * See include/block/block-common.h for more information about
    208  * the Common API.
    209  */
    210 
    211 /**
    212  * block_job_is_internal:
    213  * @job: The job to determine if it is user-visible or not.
    214  *
    215  * Returns true if the job should not be visible to the management layer.
    216  */
    217 bool block_job_is_internal(BlockJob *job);
    218 
    219 /**
    220  * block_job_driver:
    221  *
    222  * Returns the driver associated with a block job.
    223  */
    224 const BlockJobDriver *block_job_driver(BlockJob *job);
    225 
    226 #endif