1 /* 2 * This program is free software; you can redistribute it and/or 3 * modify it under the terms of the GNU General Public License version 2 4 * as published by the Free Software Foundation; or, when distributed 5 * separately from the Linux kernel or incorporated into other 6 * software packages, subject to the following license: 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a copy 9 * of this source file (the "Software"), to deal in the Software without 10 * restriction, including without limitation the rights to use, copy, modify, 11 * merge, publish, distribute, sublicense, and/or sell copies of the Software, 12 * and to permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be included in 16 * all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 24 * IN THE SOFTWARE. 25 */ 26 27 #ifndef __XEN_BLKIF__BACKEND__COMMON_H__ 28 #define __XEN_BLKIF__BACKEND__COMMON_H__ 29 30 #include <linux/module.h> 31 #include <linux/interrupt.h> 32 #include <linux/slab.h> 33 #include <linux/blkdev.h> 34 #include <linux/vmalloc.h> 35 #include <linux/wait.h> 36 #include <linux/io.h> 37 #include <linux/rbtree.h> 38 #include <asm/setup.h> 39 #include <asm/pgalloc.h> 40 #include <asm/hypervisor.h> 41 #include <xen/grant_table.h> 42 #include <xen/xenbus.h> 43 #include <xen/interface/io/ring.h> 44 #include <xen/interface/io/blkif.h> 45 #include <xen/interface/io/protocols.h> 46 47 #define DRV_PFX "xen-blkback:" 48 #define DPRINTK(fmt, args...) \ 49 pr_debug(DRV_PFX "(%s:%d) " fmt ".\n", \ 50 __func__, __LINE__, ##args) 51 52 53 /* Not a real protocol. Used to generate ring structs which contain 54 * the elements common to all protocols only. This way we get a 55 * compiler-checkable way to use common struct elements, so we can 56 * avoid using switch(protocol) in a number of places. */ 57 struct blkif_common_request { 58 char dummy; 59 }; 60 struct blkif_common_response { 61 char dummy; 62 }; 63 64 struct blkif_x86_32_request_rw { 65 uint8_t nr_segments; /* number of segments */ 66 blkif_vdev_t handle; /* only for read/write requests */ 67 uint64_t id; /* private guest value, echoed in resp */ 68 blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 69 struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; 70 } __attribute__((__packed__)); 71 72 struct blkif_x86_32_request_discard { 73 uint8_t flag; /* BLKIF_DISCARD_SECURE or zero */ 74 blkif_vdev_t _pad1; /* was "handle" for read/write requests */ 75 uint64_t id; /* private guest value, echoed in resp */ 76 blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 77 uint64_t nr_sectors; 78 } __attribute__((__packed__)); 79 80 struct blkif_x86_32_request { 81 uint8_t operation; /* BLKIF_OP_??? */ 82 union { 83 struct blkif_x86_32_request_rw rw; 84 struct blkif_x86_32_request_discard discard; 85 } u; 86 } __attribute__((__packed__)); 87 88 /* i386 protocol version */ 89 #pragma pack(push, 4) 90 struct blkif_x86_32_response { 91 uint64_t id; /* copied from request */ 92 uint8_t operation; /* copied from request */ 93 int16_t status; /* BLKIF_RSP_??? */ 94 }; 95 #pragma pack(pop) 96 /* x86_64 protocol version */ 97 98 struct blkif_x86_64_request_rw { 99 uint8_t nr_segments; /* number of segments */ 100 blkif_vdev_t handle; /* only for read/write requests */ 101 uint32_t _pad1; /* offsetof(blkif_reqest..,u.rw.id)==8 */ 102 uint64_t id; 103 blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 104 struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; 105 } __attribute__((__packed__)); 106 107 struct blkif_x86_64_request_discard { 108 uint8_t flag; /* BLKIF_DISCARD_SECURE or zero */ 109 blkif_vdev_t _pad1; /* was "handle" for read/write requests */ 110 uint32_t _pad2; /* offsetof(blkif_..,u.discard.id)==8 */ 111 uint64_t id; 112 blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 113 uint64_t nr_sectors; 114 } __attribute__((__packed__)); 115 116 struct blkif_x86_64_request { 117 uint8_t operation; /* BLKIF_OP_??? */ 118 union { 119 struct blkif_x86_64_request_rw rw; 120 struct blkif_x86_64_request_discard discard; 121 } u; 122 } __attribute__((__packed__)); 123 124 struct blkif_x86_64_response { 125 uint64_t __attribute__((__aligned__(8))) id; 126 uint8_t operation; /* copied from request */ 127 int16_t status; /* BLKIF_RSP_??? */ 128 }; 129 130 DEFINE_RING_TYPES(blkif_common, struct blkif_common_request, 131 struct blkif_common_response); 132 DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, 133 struct blkif_x86_32_response); 134 DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, 135 struct blkif_x86_64_response); 136 137 union blkif_back_rings { 138 struct blkif_back_ring native; 139 struct blkif_common_back_ring common; 140 struct blkif_x86_32_back_ring x86_32; 141 struct blkif_x86_64_back_ring x86_64; 142 }; 143 144 enum blkif_protocol { 145 BLKIF_PROTOCOL_NATIVE = 1, 146 BLKIF_PROTOCOL_X86_32 = 2, 147 BLKIF_PROTOCOL_X86_64 = 3, 148 }; 149 150 struct xen_vbd { 151 /* What the domain refers to this vbd as. */ 152 blkif_vdev_t handle; 153 /* Non-zero -> read-only */ 154 unsigned char readonly; 155 /* VDISK_xxx */ 156 unsigned char type; 157 /* phys device that this vbd maps to. */ 158 u32 pdevice; 159 struct block_device *bdev; 160 /* Cached size parameter. */ 161 sector_t size; 162 unsigned int flush_support:1; 163 unsigned int discard_secure:1; 164 unsigned int feature_gnt_persistent:1; 165 unsigned int overflow_max_grants:1; 166 }; 167 168 struct backend_info; 169 170 171 struct persistent_gnt { 172 struct page *page; 173 grant_ref_t gnt; 174 grant_handle_t handle; 175 uint64_t dev_bus_addr; 176 struct rb_node node; 177 }; 178 179 struct xen_blkif { 180 /* Unique identifier for this interface. */ 181 domid_t domid; 182 unsigned int handle; 183 /* Physical parameters of the comms window. */ 184 unsigned int irq; 185 /* Comms information. */ 186 enum blkif_protocol blk_protocol; 187 union blkif_back_rings blk_rings; 188 void *blk_ring; 189 /* The VBD attached to this interface. */ 190 struct xen_vbd vbd; 191 /* Back pointer to the backend_info. */ 192 struct backend_info *be; 193 /* Private fields. */ 194 spinlock_t blk_ring_lock; 195 atomic_t refcnt; 196 197 wait_queue_head_t wq; 198 /* for barrier (drain) requests */ 199 struct completion drain_complete; 200 atomic_t drain; 201 /* One thread per one blkif. */ 202 struct task_struct *xenblkd; 203 unsigned int waiting_reqs; 204 205 /* tree to store persistent grants */ 206 struct rb_root persistent_gnts; 207 unsigned int persistent_gnt_c; 208 209 /* statistics */ 210 unsigned long st_print; 211 int st_rd_req; 212 int st_wr_req; 213 int st_oo_req; 214 int st_f_req; 215 int st_ds_req; 216 int st_rd_sect; 217 int st_wr_sect; 218 219 wait_queue_head_t waiting_to_free; 220 }; 221 222 223 #define vbd_sz(_v) ((_v)->bdev->bd_part ? \ 224 (_v)->bdev->bd_part->nr_sects : \ 225 get_capacity((_v)->bdev->bd_disk)) 226 227 #define xen_blkif_get(_b) (atomic_inc(&(_b)->refcnt)) 228 #define xen_blkif_put(_b) \ 229 do { \ 230 if (atomic_dec_and_test(&(_b)->refcnt)) \ 231 wake_up(&(_b)->waiting_to_free);\ 232 } while (0) 233 234 struct phys_req { 235 unsigned short dev; 236 blkif_sector_t nr_sects; 237 struct block_device *bdev; 238 blkif_sector_t sector_number; 239 }; 240 int xen_blkif_interface_init(void); 241 242 int xen_blkif_xenbus_init(void); 243 244 irqreturn_t xen_blkif_be_int(int irq, void *dev_id); 245 int xen_blkif_schedule(void *arg); 246 247 int xen_blkbk_flush_diskcache(struct xenbus_transaction xbt, 248 struct backend_info *be, int state); 249 250 int xen_blkbk_barrier(struct xenbus_transaction xbt, 251 struct backend_info *be, int state); 252 struct xenbus_device *xen_blkbk_xenbus(struct backend_info *be); 253 254 static inline void blkif_get_x86_32_req(struct blkif_request *dst, 255 struct blkif_x86_32_request *src) 256 { 257 int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST; 258 dst->operation = src->operation; 259 switch (src->operation) { 260 case BLKIF_OP_READ: 261 case BLKIF_OP_WRITE: 262 case BLKIF_OP_WRITE_BARRIER: 263 case BLKIF_OP_FLUSH_DISKCACHE: 264 dst->u.rw.nr_segments = src->u.rw.nr_segments; 265 dst->u.rw.handle = src->u.rw.handle; 266 dst->u.rw.id = src->u.rw.id; 267 dst->u.rw.sector_number = src->u.rw.sector_number; 268 barrier(); 269 if (n > dst->u.rw.nr_segments) 270 n = dst->u.rw.nr_segments; 271 for (i = 0; i < n; i++) 272 dst->u.rw.seg[i] = src->u.rw.seg[i]; 273 break; 274 case BLKIF_OP_DISCARD: 275 dst->u.discard.flag = src->u.discard.flag; 276 dst->u.discard.id = src->u.discard.id; 277 dst->u.discard.sector_number = src->u.discard.sector_number; 278 dst->u.discard.nr_sectors = src->u.discard.nr_sectors; 279 break; 280 default: 281 break; 282 } 283 } 284 285 static inline void blkif_get_x86_64_req(struct blkif_request *dst, 286 struct blkif_x86_64_request *src) 287 { 288 int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST; 289 dst->operation = src->operation; 290 switch (src->operation) { 291 case BLKIF_OP_READ: 292 case BLKIF_OP_WRITE: 293 case BLKIF_OP_WRITE_BARRIER: 294 case BLKIF_OP_FLUSH_DISKCACHE: 295 dst->u.rw.nr_segments = src->u.rw.nr_segments; 296 dst->u.rw.handle = src->u.rw.handle; 297 dst->u.rw.id = src->u.rw.id; 298 dst->u.rw.sector_number = src->u.rw.sector_number; 299 barrier(); 300 if (n > dst->u.rw.nr_segments) 301 n = dst->u.rw.nr_segments; 302 for (i = 0; i < n; i++) 303 dst->u.rw.seg[i] = src->u.rw.seg[i]; 304 break; 305 case BLKIF_OP_DISCARD: 306 dst->u.discard.flag = src->u.discard.flag; 307 dst->u.discard.id = src->u.discard.id; 308 dst->u.discard.sector_number = src->u.discard.sector_number; 309 dst->u.discard.nr_sectors = src->u.discard.nr_sectors; 310 break; 311 default: 312 break; 313 } 314 } 315 316 #endif /* __XEN_BLKIF__BACKEND__COMMON_H__ */ 317