Moves blktap2 definitions into a common header file.
Includes xen/interface/io/ring.h and new ring definitions. Makes
blktap build independently from xen-devel headers.
New blktap_ring structs are fully congrent to blkif rings, for binary
compat.
Signed-off-by: Daniel Stodden <daniel.stodden@xxxxxxxxxx>
---
drivers/xen/blktap/blktap.h | 66 ++++----------------------------
drivers/xen/blktap/control.c | 14 +++---
drivers/xen/blktap/device.c | 12 +++---
drivers/xen/blktap/request.c | 8 ++--
drivers/xen/blktap/ring.c | 51 ++++++++++++++-----------
drivers/xen/blktap/sysfs.c | 6 +-
include/linux/blktap.h | 85 ++++++++++++++++++++++++++++++++++++++++++
7 files changed, 142 insertions(+), 100 deletions(-)
create mode 100644 include/linux/blktap.h
diff --git a/drivers/xen/blktap/blktap.h b/drivers/xen/blktap/blktap.h
index fe63fc9..1318cad 100644
--- a/drivers/xen/blktap/blktap.h
+++ b/drivers/xen/blktap/blktap.h
@@ -6,7 +6,7 @@
#include <linux/cdev.h>
#include <linux/init.h>
#include <linux/scatterlist.h>
-#include <xen/blkif.h>
+#include <linux/blktap.h>
extern int blktap_debug_level;
extern int blktap_ring_major;
@@ -30,74 +30,26 @@ extern int blktap_device_major;
#define BLKTAP_DEVICE_CLOSED 5
#define BLKTAP_SHUTDOWN_REQUESTED 8
-/* blktap IOCTLs: */
-#define BLKTAP2_IOCTL_KICK_FE 1
-#define BLKTAP2_IOCTL_ALLOC_TAP 200
-#define BLKTAP2_IOCTL_FREE_TAP 201
-#define BLKTAP2_IOCTL_CREATE_DEVICE 202
-#define BLKTAP2_IOCTL_REMOVE_DEVICE 207
-
-#define BLKTAP2_MAX_MESSAGE_LEN 256
-
-#define BLKTAP2_RING_MESSAGE_CLOSE 3
-
#define BLKTAP_REQUEST_FREE 0
#define BLKTAP_REQUEST_PENDING 1
-/*
- * The maximum number of requests that can be outstanding at any time
- * is determined by
- *
- * [mmap_alloc * MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST]
- *
- * where mmap_alloc < MAX_DYNAMIC_MEM.
- *
- * TODO:
- * mmap_alloc is initialised to 2 and should be adjustable on the fly via
- * sysfs.
- */
-#define BLK_RING_SIZE __RING_SIZE((struct blkif_sring *)0, PAGE_SIZE)
-#define MAX_DYNAMIC_MEM BLK_RING_SIZE
-#define MAX_PENDING_REQS BLK_RING_SIZE
-#define MMAP_PAGES (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST)
-#define MMAP_VADDR(_start, _req, _seg) \
- (_start + \
- ((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * PAGE_SIZE) + \
- ((_seg) * PAGE_SIZE))
-
-struct grant_handle_pair {
- grant_handle_t kernel;
- grant_handle_t user;
-};
-#define INVALID_GRANT_HANDLE 0xFFFF
-
-struct blktap_handle {
- unsigned int ring;
- unsigned int device;
- unsigned int minor;
-};
-
-struct blktap_params {
- char name[BLKTAP2_MAX_MESSAGE_LEN];
- unsigned long long capacity;
- unsigned long sector_size;
-};
-
struct blktap_device {
spinlock_t lock;
struct gendisk *gd;
};
+struct blktap_request;
+
struct blktap_ring {
struct task_struct *task;
struct vm_area_struct *vma;
- struct blkif_front_ring ring;
+ blktap_front_ring_t ring;
unsigned long ring_vstart;
unsigned long user_vstart;
int n_pending;
- struct blktap_request *pending[MAX_PENDING_REQS];
+ struct blktap_request *pending[BLKTAP_RING_SIZE];
wait_queue_head_t poll_wait;
@@ -128,8 +80,8 @@ struct blktap_request {
int operation;
struct timeval time;
- struct scatterlist sg_table[BLKIF_MAX_SEGMENTS_PER_REQUEST];
- struct page *pages[BLKIF_MAX_SEGMENTS_PER_REQUEST];
+ struct scatterlist sg_table[BLKTAP_SEGMENT_MAX];
+ struct page *pages[BLKTAP_SEGMENT_MAX];
int nr_pages;
};
@@ -148,7 +100,7 @@ struct blktap {
wait_queue_head_t remove_wait;
struct work_struct remove_work;
- char name[BLKTAP2_MAX_MESSAGE_LEN];
+ char name[BLKTAP_NAME_MAX];
struct blktap_statistics stats;
};
@@ -189,7 +141,7 @@ void blktap_sysfs_destroy(struct blktap *);
int blktap_device_init(void);
void blktap_device_exit(void);
size_t blktap_device_debug(struct blktap *, char *, size_t);
-int blktap_device_create(struct blktap *, struct blktap_params *);
+int blktap_device_create(struct blktap *, struct blktap_device_info *);
int blktap_device_destroy(struct blktap *);
void blktap_device_destroy_sync(struct blktap *);
void blktap_device_run_queue(struct blktap *);
diff --git a/drivers/xen/blktap/control.c b/drivers/xen/blktap/control.c
index f339bba..57b1a10 100644
--- a/drivers/xen/blktap/control.c
+++ b/drivers/xen/blktap/control.c
@@ -127,19 +127,19 @@ blktap_control_ioctl(struct inode *inode, struct file
*filp,
struct blktap *tap;
switch (cmd) {
- case BLKTAP2_IOCTL_ALLOC_TAP: {
- struct blktap_handle h;
+ case BLKTAP_IOCTL_ALLOC_TAP: {
+ struct blktap_info info;
void __user *ptr = (void __user*)arg;
tap = blktap_control_create_tap();
if (!tap)
return -ENOMEM;
- h.ring = blktap_ring_major;
- h.device = blktap_device_major;
- h.minor = tap->minor;
+ info.ring_major = blktap_ring_major;
+ info.bdev_major = blktap_device_major;
+ info.ring_minor = tap->minor;
- if (copy_to_user(ptr, &h, sizeof(h))) {
+ if (copy_to_user(ptr, &info, sizeof(info))) {
blktap_control_destroy_tap(tap);
return -EFAULT;
}
@@ -147,7 +147,7 @@ blktap_control_ioctl(struct inode *inode, struct file *filp,
return 0;
}
- case BLKTAP2_IOCTL_FREE_TAP: {
+ case BLKTAP_IOCTL_FREE_TAP: {
int minor = arg;
if (minor > MAX_BLKTAP_DEVICE)
diff --git a/drivers/xen/blktap/device.c b/drivers/xen/blktap/device.c
index fce2769..6bb04bd 100644
--- a/drivers/xen/blktap/device.c
+++ b/drivers/xen/blktap/device.c
@@ -186,7 +186,7 @@ blktap_device_make_request(struct blktap *tap, struct
request *rq)
write ? 'w' : 'r', blk_rq_bytes(rq), nsegs);
request->rq = rq;
- request->operation = write ? BLKIF_OP_WRITE : BLKIF_OP_READ;
+ request->operation = write ? BLKTAP_OP_WRITE : BLKTAP_OP_READ;
err = blktap_request_get_pages(tap, request, nsegs);
if (err)
@@ -276,7 +276,7 @@ blktap_device_do_request(struct request_queue *rq)
static void
blktap_device_configure(struct blktap *tap,
- struct blktap_params *params)
+ struct blktap_device_info *params)
{
struct request_queue *rq;
struct blktap_device *dev = &tap->device;
@@ -297,8 +297,8 @@ blktap_device_configure(struct blktap *tap,
blk_queue_max_segment_size(rq, PAGE_SIZE);
/* Ensure a merged request will fit in a single I/O ring slot. */
- blk_queue_max_phys_segments(rq, BLKIF_MAX_SEGMENTS_PER_REQUEST);
- blk_queue_max_hw_segments(rq, BLKIF_MAX_SEGMENTS_PER_REQUEST);
+ blk_queue_max_phys_segments(rq, BLKTAP_SEGMENT_MAX);
+ blk_queue_max_hw_segments(rq, BLKTAP_SEGMENT_MAX);
/* Make sure buffer addresses are sector-aligned. */
blk_queue_dma_alignment(rq, 511);
@@ -311,7 +311,7 @@ blktap_device_configure(struct blktap *tap,
static int
blktap_device_validate_params(struct blktap *tap,
- struct blktap_params *params)
+ struct blktap_device_info *params)
{
struct device *dev = tap->ring.dev;
int sector_order, name_sz;
@@ -425,7 +425,7 @@ blktap_device_destroy_sync(struct blktap *tap)
}
int
-blktap_device_create(struct blktap *tap, struct blktap_params *params)
+blktap_device_create(struct blktap *tap, struct blktap_device_info *params)
{
int minor, err;
struct gendisk *gd;
diff --git a/drivers/xen/blktap/request.c b/drivers/xen/blktap/request.c
index 9bef48c..8cfd6c9 100644
--- a/drivers/xen/blktap/request.c
+++ b/drivers/xen/blktap/request.c
@@ -7,18 +7,18 @@
#include "blktap.h"
/* max pages per shared pool. just to prevent accidental dos. */
-#define POOL_MAX_PAGES (256*BLKIF_MAX_SEGMENTS_PER_REQUEST)
+#define POOL_MAX_PAGES (256*BLKTAP_SEGMENT_MAX)
/* default page pool size. when considering to shrink a shared pool,
* note that paused tapdisks may grab a whole lot of pages for a long
* time. */
-#define POOL_DEFAULT_PAGES (2 * MMAP_PAGES)
+#define POOL_DEFAULT_PAGES (2 * BLKTAP_RING_SIZE * BLKTAP_SEGMENT_MAX)
/* max number of pages allocatable per request. */
-#define POOL_MAX_REQUEST_PAGES BLKIF_MAX_SEGMENTS_PER_REQUEST
+#define POOL_MAX_REQUEST_PAGES BLKTAP_SEGMENT_MAX
/* min request structs per pool. These grow dynamically. */
-#define POOL_MIN_REQS BLK_RING_SIZE
+#define POOL_MIN_REQS BLKTAP_RING_SIZE
static struct kset *pool_set;
diff --git a/drivers/xen/blktap/ring.c b/drivers/xen/blktap/ring.c
index 6b86be5..9442a64 100644
--- a/drivers/xen/blktap/ring.c
+++ b/drivers/xen/blktap/ring.c
@@ -18,7 +18,7 @@ static struct cdev blktap_ring_cdev;
static void
blktap_ring_read_response(struct blktap *tap,
- const struct blkif_response *rsp)
+ const blktap_ring_rsp_t *rsp)
{
struct blktap_ring *ring = &tap->ring;
struct blktap_request *request;
@@ -27,7 +27,7 @@ blktap_ring_read_response(struct blktap *tap,
request = NULL;
usr_idx = rsp->id;
- if (usr_idx < 0 || usr_idx >= MAX_PENDING_REQS) {
+ if (usr_idx < 0 || usr_idx >= BLKTAP_RING_SIZE) {
err = -ERANGE;
goto invalid;
}
@@ -48,7 +48,7 @@ blktap_ring_read_response(struct blktap *tap,
"request %d [%p] response: %d\n",
request->usr_idx, request, rsp->status);
- err = rsp->status == BLKIF_RSP_OKAY ? 0 : -EIO;
+ err = rsp->status == BLKTAP_RSP_OKAY ? 0 : -EIO;
end_request:
blktap_device_end_request(tap, request, err);
return;
@@ -67,7 +67,7 @@ static void
blktap_read_ring(struct blktap *tap)
{
struct blktap_ring *ring = &tap->ring;
- struct blkif_response rsp;
+ blktap_ring_rsp_t rsp;
RING_IDX rc, rp;
down_read(¤t->mm->mmap_sem);
@@ -90,6 +90,11 @@ blktap_read_ring(struct blktap *tap)
up_read(¤t->mm->mmap_sem);
}
+#define MMAP_VADDR(_start, _req, _seg) \
+ ((_start) + \
+ ((_req) * BLKTAP_SEGMENT_MAX * BLKTAP_PAGE_SIZE) + \
+ ((_seg) * BLKTAP_PAGE_SIZE))
+
static int blktap_ring_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
return VM_FAULT_SIGBUS;
@@ -102,7 +107,7 @@ blktap_ring_fail_pending(struct blktap *tap)
struct blktap_request *request;
int usr_idx;
- for (usr_idx = 0; usr_idx < MAX_PENDING_REQS; usr_idx++) {
+ for (usr_idx = 0; usr_idx < BLKTAP_RING_SIZE; usr_idx++) {
request = ring->pending[usr_idx];
if (!request)
continue;
@@ -154,7 +159,7 @@ blktap_ring_map_request(struct blktap *tap,
int seg, err = 0;
int write;
- write = request->operation == BLKIF_OP_WRITE;
+ write = request->operation == BLKTAP_OP_WRITE;
for (seg = 0; seg < request->nr_pages; seg++) {
if (write)
@@ -182,7 +187,7 @@ blktap_ring_unmap_request(struct blktap *tap,
uaddr = MMAP_VADDR(ring->user_vstart, request->usr_idx, 0);
size = request->nr_pages << PAGE_SHIFT;
- read = request->operation == BLKIF_OP_READ;
+ read = request->operation == BLKTAP_OP_READ;
if (read)
for (seg = 0; seg < request->nr_pages; seg++)
@@ -217,11 +222,11 @@ blktap_ring_make_request(struct blktap *tap)
if (!request)
return ERR_PTR(-ENOMEM);
- for (usr_idx = 0; usr_idx < BLK_RING_SIZE; usr_idx++)
+ for (usr_idx = 0; usr_idx < BLKTAP_RING_SIZE; usr_idx++)
if (!ring->pending[usr_idx])
break;
- BUG_ON(usr_idx >= BLK_RING_SIZE);
+ BUG_ON(usr_idx >= BLKTAP_RING_SIZE);
request->tap = tap;
request->usr_idx = usr_idx;
@@ -237,7 +242,7 @@ blktap_ring_submit_request(struct blktap *tap,
struct blktap_request *request)
{
struct blktap_ring *ring = &tap->ring;
- struct blkif_request *breq;
+ blktap_ring_req_t *breq;
struct scatterlist *sg;
int i, nsecs = 0;
@@ -248,12 +253,12 @@ blktap_ring_submit_request(struct blktap *tap,
breq->id = request->usr_idx;
breq->sector_number = blk_rq_pos(request->rq);
- breq->handle = 0;
+ breq->__pad = 0;
breq->operation = request->operation;
breq->nr_segments = request->nr_pages;
blktap_for_each_sg(sg, request, i) {
- struct blkif_request_segment *seg = &breq->seg[i];
+ struct blktap_segment *seg = &breq->seg[i];
int first, count;
count = sg->length >> 9;
@@ -270,12 +275,12 @@ blktap_ring_submit_request(struct blktap *tap,
do_gettimeofday(&request->time);
- if (request->operation == BLKIF_OP_WRITE) {
+ if (request->operation == BLKTAP_OP_WRITE) {
tap->stats.st_wr_sect += nsecs;
tap->stats.st_wr_req++;
}
- if (request->operation == BLKIF_OP_READ) {
+ if (request->operation == BLKTAP_OP_READ) {
tap->stats.st_rd_sect += nsecs;
tap->stats.st_rd_req++;
}
@@ -327,7 +332,7 @@ blktap_ring_mmap(struct file *filp, struct vm_area_struct
*vma)
{
struct blktap *tap = filp->private_data;
struct blktap_ring *ring = &tap->ring;
- struct blkif_sring *sring;
+ blktap_sring_t *sring;
struct page *page = NULL;
int err;
@@ -384,25 +389,25 @@ blktap_ring_ioctl(struct inode *inode, struct file *filp,
return -EACCES;
switch(cmd) {
- case BLKTAP2_IOCTL_KICK_FE:
+ case BLKTAP_IOCTL_RESPOND:
blktap_read_ring(tap);
return 0;
- case BLKTAP2_IOCTL_CREATE_DEVICE: {
- struct blktap_params params;
+ case BLKTAP_IOCTL_CREATE_DEVICE: {
+ struct blktap_device_info info;
void __user *ptr = (void *)arg;
if (!arg)
return -EINVAL;
- if (copy_from_user(¶ms, ptr, sizeof(params)))
+ if (copy_from_user(&info, ptr, sizeof(info)))
return -EFAULT;
- return blktap_device_create(tap, ¶ms);
+ return blktap_device_create(tap, &info);
}
- case BLKTAP2_IOCTL_REMOVE_DEVICE:
+ case BLKTAP_IOCTL_REMOVE_DEVICE:
return blktap_device_destroy(tap);
}
@@ -482,7 +487,7 @@ blktap_ring_debug(struct blktap *tap, char *buf, size_t
size)
s += snprintf(s, end - s,
"begin pending:%d\n", ring->n_pending);
- for (usr_idx = 0; usr_idx < MAX_PENDING_REQS; usr_idx++) {
+ for (usr_idx = 0; usr_idx < BLKTAP_RING_SIZE; usr_idx++) {
struct blktap_request *request;
struct timeval *time;
int write;
@@ -491,7 +496,7 @@ blktap_ring_debug(struct blktap *tap, char *buf, size_t
size)
if (!request)
continue;
- write = request->operation == BLKIF_OP_WRITE;
+ write = request->operation == BLKTAP_OP_WRITE;
time = &request->time;
s += snprintf(s, end - s,
diff --git a/drivers/xen/blktap/sysfs.c b/drivers/xen/blktap/sysfs.c
index 7bbfea8..182de9a 100644
--- a/drivers/xen/blktap/sysfs.c
+++ b/drivers/xen/blktap/sysfs.c
@@ -20,7 +20,7 @@ blktap_sysfs_set_name(struct device *dev, struct
device_attribute *attr, const c
if (!tap)
return 0;
- if (size >= BLKTAP2_MAX_MESSAGE_LEN)
+ if (size >= BLKTAP_NAME_MAX)
return -ENAMETOOLONG;
if (strnlen(buf, size) != size)
@@ -75,8 +75,8 @@ blktap_sysfs_remove_device(struct device *dev,
goto wait;
if (tap->ring.vma) {
- blkif_sring_t *sring = tap->ring.ring.sring;
- sring->private.tapif_user.msg = BLKTAP2_RING_MESSAGE_CLOSE;
+ blktap_sring_t *sring = tap->ring.ring.sring;
+ sring->private.tapif_user.msg = BLKTAP_RING_MESSAGE_CLOSE;
blktap_ring_kick_user(tap);
} else {
INIT_WORK(&tap->remove_work, blktap_sysfs_remove_work);
diff --git a/include/linux/blktap.h b/include/linux/blktap.h
new file mode 100644
index 0000000..ec33429
--- /dev/null
+++ b/include/linux/blktap.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2011, XenSource Inc.
+ * All rights reserved.
+ */
+
+#ifndef _LINUX_BLKTAP_H
+#define _LINUX_BLKTAP_H
+
+/*
+ * Control
+ */
+
+#define BLKTAP_IOCTL_RESPOND 1
+#define BLKTAP_IOCTL_ALLOC_TAP 200
+#define BLKTAP_IOCTL_FREE_TAP 201
+#define BLKTAP_IOCTL_CREATE_DEVICE 202
+#define BLKTAP_IOCTL_REMOVE_DEVICE 207
+
+#define BLKTAP_NAME_MAX 256
+
+struct blktap_info {
+ unsigned int ring_major;
+ unsigned int bdev_major;
+ unsigned int ring_minor;
+};
+
+struct blktap_device_info {
+ char name[BLKTAP_NAME_MAX];
+ unsigned long long capacity;
+ unsigned long sector_size;
+};
+
+/*
+ * I/O ring
+ */
+
+#ifdef __KERNEL__
+#define BLKTAP_PAGE_SIZE PAGE_SIZE
+#endif
+
+#include <xen/interface/io/ring.h>
+
+typedef struct blktap_ring_request blktap_ring_req_t;
+typedef struct blktap_ring_response blktap_ring_rsp_t;
+
+struct blktap_segment {
+ uint32_t __pad;
+ uint8_t first_sect;
+ uint8_t last_sect;
+};
+
+#define BLKTAP_OP_READ 0
+#define BLKTAP_OP_WRITE 1
+
+#define BLKTAP_SEGMENT_MAX 11
+
+struct blktap_ring_request {
+ uint8_t operation;
+ uint8_t nr_segments;
+ uint16_t __pad;
+ uint64_t id;
+ uint64_t sector_number;
+ struct blktap_segment seg[BLKTAP_SEGMENT_MAX];
+};
+
+#define BLKTAP_RSP_EOPNOTSUPP -2
+#define BLKTAP_RSP_ERROR -1
+#define BLKTAP_RSP_OKAY 0
+
+struct blktap_ring_response {
+ uint64_t id;
+ uint8_t operation;
+ int16_t status;
+};
+
+DEFINE_RING_TYPES(blktap, struct blktap_ring_request, struct
blktap_ring_response);
+#define BLKTAP_RING_SIZE __CONST_RING_SIZE(blktap, BLKTAP_PAGE_SIZE)
+
+/*
+ * Ring messages (DEPRECATED)
+ */
+
+#define BLKTAP_RING_MESSAGE_CLOSE 3
+
+#endif /* _LINUX_BLKTAP_H */
--
1.7.0.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|