4 #include <linux/slab.h>
6 #include <linux/poll.h>
7 #include <linux/cdev.h>
8 #include <linux/init.h>
9 #include <linux/scatterlist.h>
10 #include <xen/blkif.h>
11 #include <xen/gnttab.h>
13 //#define ENABLE_PASSTHROUGH
15 extern int blktap_debug_level;
17 #define BTPRINTK(level, tag, force, _f, _a...) \
19 if (blktap_debug_level > level && \
20 (force || printk_ratelimit())) \
21 printk(tag "%s: " _f, __func__, ##_a); \
24 #define BTDBG(_f, _a...) BTPRINTK(8, KERN_DEBUG, 1, _f, ##_a)
25 #define BTINFO(_f, _a...) BTPRINTK(0, KERN_INFO, 0, _f, ##_a)
26 #define BTWARN(_f, _a...) BTPRINTK(0, KERN_WARNING, 0, _f, ##_a)
27 #define BTERR(_f, _a...) BTPRINTK(0, KERN_ERR, 0, _f, ##_a)
29 #define BLKTAP2_DEV_DIR "xen/blktap-2/"
31 #define BLKTAP_CONTROL 1
32 #define BLKTAP_RING_FD 2
33 #define BLKTAP_RING_VMA 3
34 #define BLKTAP_DEVICE 4
35 #define BLKTAP_SYSFS 5
36 #define BLKTAP_PAUSE_REQUESTED 6
37 #define BLKTAP_PAUSED 7
38 #define BLKTAP_SHUTDOWN_REQUESTED 8
39 #define BLKTAP_PASSTHROUGH 9
40 #define BLKTAP_DEFERRED 10
43 #define BLKTAP2_IOCTL_KICK_FE 1
44 #define BLKTAP2_IOCTL_ALLOC_TAP 200
45 #define BLKTAP2_IOCTL_FREE_TAP 201
46 #define BLKTAP2_IOCTL_CREATE_DEVICE 202
47 #define BLKTAP2_IOCTL_SET_PARAMS 203
48 #define BLKTAP2_IOCTL_PAUSE 204
49 #define BLKTAP2_IOCTL_REOPEN 205
50 #define BLKTAP2_IOCTL_RESUME 206
52 #define BLKTAP2_MAX_MESSAGE_LEN 256
54 #define BLKTAP2_RING_MESSAGE_PAUSE 1
55 #define BLKTAP2_RING_MESSAGE_RESUME 2
56 #define BLKTAP2_RING_MESSAGE_CLOSE 3
58 #define BLKTAP_REQUEST_FREE 0
59 #define BLKTAP_REQUEST_PENDING 1
62 * The maximum number of requests that can be outstanding at any time
65 * [mmap_alloc * MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST]
67 * where mmap_alloc < MAX_DYNAMIC_MEM.
70 * mmap_alloc is initialised to 2 and should be adjustable on the fly via
73 #define BLK_RING_SIZE __CONST_RING_SIZE(blkif, PAGE_SIZE)
74 #define MAX_DYNAMIC_MEM BLK_RING_SIZE
75 #define MAX_PENDING_REQS BLK_RING_SIZE
76 #define MMAP_PAGES (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST)
77 #define MMAP_VADDR(_start, _req, _seg) \
79 ((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * PAGE_SIZE) + \
82 #define blktap_get(_b) (atomic_inc(&(_b)->refcnt))
83 #define blktap_put(_b) \
85 if (atomic_dec_and_test(&(_b)->refcnt)) \
91 struct grant_handle_pair {
92 grant_handle_t kernel;
95 #define INVALID_GRANT_HANDLE 0xFFFF
97 struct blktap_handle {
103 struct blktap_params {
104 char name[BLKTAP2_MAX_MESSAGE_LEN];
105 unsigned long long capacity;
106 unsigned long sector_size;
109 struct blktap_device {
114 #ifdef ENABLE_PASSTHROUGH
115 struct block_device *bdev;
120 struct vm_area_struct *vma;
121 blkif_front_ring_t ring;
122 struct vm_foreign_map foreign_map;
123 unsigned long ring_vstart;
124 unsigned long user_vstart;
128 wait_queue_head_t poll_wait;
132 atomic_t sysfs_refcnt;
133 struct mutex sysfs_mutex;
136 struct blktap_statistics {
137 unsigned long st_print;
152 struct blktap_request {
159 unsigned short operation;
162 struct grant_handle_pair handles[BLKIF_MAX_SEGMENTS_PER_REQUEST];
163 struct list_head free_list;
170 unsigned long dev_inuse;
172 struct blktap_params params;
174 struct rw_semaphore tap_sem;
176 struct blktap_ring ring;
177 struct blktap_device device;
180 struct blktap_request *pending_requests[MAX_PENDING_REQS];
181 struct scatterlist sg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
183 wait_queue_head_t wq;
184 struct list_head deferred_queue;
186 struct blktap_statistics stats;
189 extern struct blktap *blktaps[];
192 blktap_active(struct blktap *tap)
194 return test_bit(BLKTAP_RING_VMA, &tap->dev_inuse);
198 blktap_validate_params(struct blktap *tap, struct blktap_params *params)
200 /* TODO: sanity check */
201 params->name[sizeof(params->name) - 1] = '\0';
202 BTINFO("%s: capacity: %llu, sector-size: %lu\n",
203 params->name, params->capacity, params->sector_size);
207 int blktap_control_destroy_device(struct blktap *);
208 int blktap_control_finish_destroy(struct blktap *);
210 int blktap_ring_init(int *);
211 int blktap_ring_free(void);
212 int blktap_ring_create(struct blktap *);
213 int blktap_ring_destroy(struct blktap *);
214 int blktap_ring_pause(struct blktap *);
215 int blktap_ring_resume(struct blktap *);
216 void blktap_ring_kick_user(struct blktap *);
219 int blktap_sysfs_init(void);
220 void blktap_sysfs_free(void);
221 int blktap_sysfs_create(struct blktap *);
222 int blktap_sysfs_destroy(struct blktap *);
224 static inline int blktap_sysfs_init(void) { return 0; }
225 static inline void blktap_sysfs_exit(void) {}
226 static inline int blktap_sysfs_create(struct blktap *tapdev) { return 0; }
227 static inline int blktap_sysfs_destroy(struct blktap *tapdev) { return 0; }
230 int blktap_device_init(int *);
231 void blktap_device_free(void);
232 int blktap_device_create(struct blktap *);
233 int blktap_device_destroy(struct blktap *);
234 int blktap_device_pause(struct blktap *);
235 int blktap_device_resume(struct blktap *);
236 void blktap_device_restart(struct blktap *);
237 void blktap_device_finish_request(struct blktap *,
239 struct blktap_request *);
240 void blktap_device_fail_pending_requests(struct blktap *);
241 #ifdef ENABLE_PASSTHROUGH
242 int blktap_device_enable_passthrough(struct blktap *,
246 void blktap_defer(struct blktap *);
247 void blktap_run_deferred(void);
249 int blktap_request_pool_init(void);
250 void blktap_request_pool_free(void);
251 int blktap_request_pool_grow(void);
252 int blktap_request_pool_shrink(void);
253 struct blktap_request *blktap_request_allocate(struct blktap *);
254 void blktap_request_free(struct blktap *, struct blktap_request *);
255 struct page *request_to_page(struct blktap_request *, int);
257 static inline unsigned long
258 request_to_kaddr(struct blktap_request *req, int seg)
260 unsigned long pfn = page_to_pfn(request_to_page(req, seg));
261 return (unsigned long)pfn_to_kaddr(pfn);