]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/block/xen-blkback/common.h
xen/blkback: pseudo support for multi hardware queues/rings
[mirror_ubuntu-artful-kernel.git] / drivers / block / xen-blkback / common.h
index 68e87a037b992df8c64d6894719b5b390ef1d10a..310eff3cf43f8bb0c6230fe83fed6c74d89499ef 100644 (file)
@@ -269,34 +269,50 @@ struct persistent_gnt {
        struct list_head remove_node;
 };
 
+/* Per-ring information. */
+struct xen_blkif_ring {
+       /* Physical parameters of the comms window. */
+       unsigned int            irq;
+       union blkif_back_rings  blk_rings;
+       void                    *blk_ring;
+       /* Private fields. */
+       spinlock_t              blk_ring_lock;
+
+       wait_queue_head_t       wq;
+       atomic_t                inflight;
+       /* One thread per blkif ring. */
+       struct task_struct      *xenblkd;
+       unsigned int            waiting_reqs;
+
+       /* List of all 'pending_req' available */
+       struct list_head        pending_free;
+       /* And its spinlock. */
+       spinlock_t              pending_free_lock;
+       wait_queue_head_t       pending_free_wq;
+
+       struct work_struct      free_work;
+       /* Thread shutdown wait queue. */
+       wait_queue_head_t       shutdown_wq;
+       struct xen_blkif        *blkif;
+};
+
 struct xen_blkif {
        /* Unique identifier for this interface. */
        domid_t                 domid;
        unsigned int            handle;
-       /* Physical parameters of the comms window. */
-       unsigned int            irq;
        /* Comms information. */
        enum blkif_protocol     blk_protocol;
-       union blkif_back_rings  blk_rings;
-       void                    *blk_ring;
        /* The VBD attached to this interface. */
        struct xen_vbd          vbd;
        /* Back pointer to the backend_info. */
        struct backend_info     *be;
-       /* Private fields. */
-       spinlock_t              blk_ring_lock;
        atomic_t                refcnt;
-
-       wait_queue_head_t       wq;
        /* for barrier (drain) requests */
        struct completion       drain_complete;
        atomic_t                drain;
-       atomic_t                inflight;
-       /* One thread per one blkif. */
-       struct task_struct      *xenblkd;
-       unsigned int            waiting_reqs;
 
        /* tree to store persistent grants */
+       spinlock_t              pers_gnts_lock;
        struct rb_root          persistent_gnts;
        unsigned int            persistent_gnt_c;
        atomic_t                persistent_gnt_in_use;
@@ -311,12 +327,6 @@ struct xen_blkif {
        int                     free_pages_num;
        struct list_head        free_pages;
 
-       /* List of all 'pending_req' available */
-       struct list_head        pending_free;
-       /* And its spinlock. */
-       spinlock_t              pending_free_lock;
-       wait_queue_head_t       pending_free_wq;
-
        /* statistics */
        unsigned long           st_print;
        unsigned long long                      st_rd_req;
@@ -328,9 +338,10 @@ struct xen_blkif {
        unsigned long long                      st_wr_sect;
 
        struct work_struct      free_work;
-       /* Thread shutdown wait queue. */
-       wait_queue_head_t       shutdown_wq;
-       unsigned int nr_ring_pages;
+       unsigned int            nr_ring_pages;
+       /* All rings for this device. */
+       struct xen_blkif_ring   *rings;
+       unsigned int            nr_rings;
 };
 
 struct seg_buf {
@@ -352,7 +363,7 @@ struct grant_page {
  * response queued for it, with the saved 'id' passed back.
  */
 struct pending_req {
-       struct xen_blkif        *blkif;
+       struct xen_blkif_ring   *ring;
        u64                     id;
        int                     nr_segs;
        atomic_t                pendcnt;
@@ -394,7 +405,7 @@ int xen_blkif_xenbus_init(void);
 irqreturn_t xen_blkif_be_int(int irq, void *dev_id);
 int xen_blkif_schedule(void *arg);
 int xen_blkif_purge_persistent(void *arg);
-void xen_blkbk_free_caches(struct xen_blkif *blkif);
+void xen_blkbk_free_caches(struct xen_blkif_ring *ring);
 
 int xen_blkbk_flush_diskcache(struct xenbus_transaction xbt,
                              struct backend_info *be, int state);