ChangeSet 1.1409, 2005/03/31 12:00:46+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx
Clean up ctrl msg handling in Linux. Remove VBD_GROW/SHRINK -- a VBD
now maps onto a single complete major/minor that is specified at
VBD_CREATE time. Also improve blkdev request_queue unplugging in the
2.6 backend driver to promote better batching.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
linux-2.6.11-xen-sparse/drivers/xen/balloon/balloon.c | 11
linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c | 31
linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h | 22
linux-2.6.11-xen-sparse/drivers/xen/blkback/control.c | 34
linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c | 407
+---------
linux-2.6.11-xen-sparse/drivers/xen/blkfront/blkfront.c | 12
linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_controlmsg.c | 26
linux-2.6.11-xen-sparse/drivers/xen/netback/control.c | 22
linux-2.6.11-xen-sparse/drivers/xen/netfront/netfront.c | 5
linux-2.6.11-xen-sparse/drivers/xen/usbback/control.c | 24
linux-2.6.11-xen-sparse/drivers/xen/usbfront/usbfront.c | 12
tools/blktap/blkdump.c | 8
tools/python/xen/lowlevel/xu/xu.c | 32
tools/python/xen/xend/server/blkif.py | 33
tools/python/xen/xend/server/messages.py | 9
tools/xcs/dump.c | 22
xen/include/public/io/domain_controller.h | 44 -
17 files changed, 127 insertions(+), 627 deletions(-)
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/balloon/balloon.c
b/linux-2.6.11-xen-sparse/drivers/xen/balloon/balloon.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/balloon/balloon.c 2005-03-31
07:03:54 -05:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/balloon/balloon.c 2005-03-31
07:03:54 -05:00
@@ -305,21 +305,16 @@
case CMSG_MEM_REQUEST_SET:
{
mem_request_t *req = (mem_request_t *)&msg->msg[0];
- if ( msg->length != sizeof(mem_request_t) )
- goto parse_error;
set_new_target(req->target);
req->status = 0;
}
break;
+
default:
- goto parse_error;
+ msg->length = 0;
+ break;
}
- ctrl_if_send_response(msg);
- return;
-
- parse_error:
- msg->length = 0;
ctrl_if_send_response(msg);
}
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c
b/linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c 2005-03-31
07:03:54 -05:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c 2005-03-31
07:03:54 -05:00
@@ -67,6 +67,19 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
static kmem_cache_t *buffer_head_cachep;
+#else
+static request_queue_t *plugged_queue;
+void bdev_put(struct block_device *bdev)
+{
+ request_queue_t *q = plugged_queue;
+ /* We might be giving up last reference to plugged queue. Flush if so. */
+ if ( (q != NULL) &&
+ (q == bdev_get_queue(bdev)) &&
+ (cmpxchg(&plugged_queue, q, NULL) == q) )
+ blk_run_queue(q);
+ /* It's now safe to drop the block device. */
+ blkdev_put(bdev);
+}
#endif
#ifdef CONFIG_XEN_BLKDEV_TAP_BE
@@ -189,9 +202,15 @@
blkif_put(blkif);
}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
/* Push the batch through to disc. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
run_task_queue(&tq_disk);
+#else
+ if ( plugged_queue != NULL )
+ {
+ blk_run_queue(plugged_queue);
+ plugged_queue = NULL;
+ }
#endif
}
}
@@ -512,6 +531,7 @@
for ( i = 0; i < nr_psegs; i++ )
{
struct bio *bio;
+ request_queue_t *q;
bio = bio_alloc(GFP_ATOMIC, 1);
if ( unlikely(bio == NULL) )
@@ -531,7 +551,14 @@
phys_seg[i].nr_sects << 9,
phys_seg[i].buffer & ~PAGE_MASK);
- submit_bio(operation | (1 << BIO_RW_SYNC), bio);
+ if ( (q = bdev_get_queue(bio->bi_bdev)) != plugged_queue )
+ {
+ if ( plugged_queue != NULL )
+ blk_run_queue(plugged_queue);
+ plugged_queue = q;
+ }
+
+ submit_bio(operation, bio);
}
#endif
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h
b/linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h
--- a/linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h 2005-03-31
07:03:53 -05:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h 2005-03-31
07:03:53 -05:00
@@ -31,8 +31,10 @@
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
typedef struct rb_root rb_root_t;
typedef struct rb_node rb_node_t;
+extern void bdev_put(struct block_device *bdev);
#else
struct block_device;
+#define bdev_put(_b) ((void)0)
#endif
typedef struct blkif_st {
@@ -80,24 +82,16 @@
blkif_disconnect_complete(_b); \
} while (0)
-/* An entry in a list of xen_extents. */
-typedef struct _blkif_extent_le {
- blkif_extent_t extent; /* an individual extent */
- struct _blkif_extent_le *next; /* and a pointer to the next */
- struct block_device *bdev;
-} blkif_extent_le_t;
-
typedef struct _vbd {
- blkif_vdev_t vdevice; /* what the domain refers to this vbd as */
- unsigned char readonly; /* Non-zero -> read-only */
- unsigned char type; /* VDISK_TYPE_xxx */
- blkif_extent_le_t *extents; /* list of xen_extents making up this vbd */
- rb_node_t rb; /* for linking into R-B tree lookup struct */
+ blkif_vdev_t vdevice; /* what the domain refers to this vbd as */
+ unsigned char readonly; /* Non-zero -> read-only */
+ unsigned char type; /* VDISK_TYPE_xxx */
+ blkif_pdev_t pdevice; /* phys device that this vbd maps to */
+ struct block_device *bdev;
+ rb_node_t rb; /* for linking into R-B tree lookup struct */
} vbd_t;
void vbd_create(blkif_be_vbd_create_t *create);
-void vbd_grow(blkif_be_vbd_grow_t *grow);
-void vbd_shrink(blkif_be_vbd_shrink_t *shrink);
void vbd_destroy(blkif_be_vbd_destroy_t *delete);
int vbd_probe(blkif_t *blkif, vdisk_t *vbd_info, int max_vbds);
void destroy_all_vbds(blkif_t *blkif);
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blkback/control.c
b/linux-2.6.11-xen-sparse/drivers/xen/blkback/control.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/blkback/control.c 2005-03-31
07:03:54 -05:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/control.c 2005-03-31
07:03:54 -05:00
@@ -15,57 +15,31 @@
switch ( msg->subtype )
{
case CMSG_BLKIF_BE_CREATE:
- if ( msg->length != sizeof(blkif_be_create_t) )
- goto parse_error;
blkif_create((blkif_be_create_t *)&msg->msg[0]);
break;
case CMSG_BLKIF_BE_DESTROY:
- if ( msg->length != sizeof(blkif_be_destroy_t) )
- goto parse_error;
blkif_destroy((blkif_be_destroy_t *)&msg->msg[0]);
break;
case CMSG_BLKIF_BE_CONNECT:
- if ( msg->length != sizeof(blkif_be_connect_t) )
- goto parse_error;
blkif_connect((blkif_be_connect_t *)&msg->msg[0]);
break;
case CMSG_BLKIF_BE_DISCONNECT:
- if ( msg->length != sizeof(blkif_be_disconnect_t) )
- goto parse_error;
if ( !blkif_disconnect((blkif_be_disconnect_t *)&msg->msg[0],msg->id) )
return; /* Sending the response is deferred until later. */
break;
case CMSG_BLKIF_BE_VBD_CREATE:
- if ( msg->length != sizeof(blkif_be_vbd_create_t) )
- goto parse_error;
vbd_create((blkif_be_vbd_create_t *)&msg->msg[0]);
break;
case CMSG_BLKIF_BE_VBD_DESTROY:
- if ( msg->length != sizeof(blkif_be_vbd_destroy_t) )
- goto parse_error;
vbd_destroy((blkif_be_vbd_destroy_t *)&msg->msg[0]);
break;
- case CMSG_BLKIF_BE_VBD_GROW:
- if ( msg->length != sizeof(blkif_be_vbd_grow_t) )
- goto parse_error;
- vbd_grow((blkif_be_vbd_grow_t *)&msg->msg[0]);
- break;
- case CMSG_BLKIF_BE_VBD_SHRINK:
- if ( msg->length != sizeof(blkif_be_vbd_shrink_t) )
- goto parse_error;
- vbd_shrink((blkif_be_vbd_shrink_t *)&msg->msg[0]);
- break;
default:
- goto parse_error;
+ DPRINTK("Parse error while reading message subtype %d, len %d\n",
+ msg->subtype, msg->length);
+ msg->length = 0;
+ break;
}
- ctrl_if_send_response(msg);
- return;
-
- parse_error:
- DPRINTK("Parse error while reading message subtype %d, len %d\n",
- msg->subtype, msg->length);
- msg->length = 0;
ctrl_if_send_response(msg);
}
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c
b/linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c 2005-03-31 07:03:53
-05:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c 2005-03-31 07:03:53
-05:00
@@ -7,13 +7,18 @@
* in vbd_translate. All other lookups are implicitly protected because the
* only caller (the control message dispatch routine) serializes the calls.
*
- * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
+ * Copyright (c) 2003-2005, Keir Fraser & Steve Hand
*/
#include "common.h"
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-static dev_t vbd_map_devnum(blkif_pdev_t);
+static inline dev_t vbd_map_devnum(blkif_pdev_t cookie)
+{ return MKDEV(cookie>>8, cookie&0xff); }
+#define vbd_sz(_v) ((_v)->bdev->bd_part ? \
+ (_v)->bdev->bd_part->nr_sects : (_v)->bdev->bd_disk->capacity)
+#else
+#define vbd_sz(_v) (blk_size[MAJOR((_v)->pdevice)][MINOR((_v)->pdevice)]*2)
#endif
void vbd_create(blkif_be_vbd_create_t *create)
@@ -63,203 +68,45 @@
vbd->vdevice = vdevice;
vbd->readonly = create->readonly;
vbd->type = VDISK_TYPE_DISK | VDISK_FLAG_VIRT;
- vbd->extents = NULL;
-
- spin_lock(&blkif->vbd_lock);
- rb_link_node(&vbd->rb, rb_parent, rb_p);
- rb_insert_color(&vbd->rb, &blkif->vbd_rb);
- spin_unlock(&blkif->vbd_lock);
-
- DPRINTK("Successful creation of vdev=%04x (dom=%u)\n",
- vdevice, create->domid);
- create->status = BLKIF_BE_STATUS_OKAY;
-}
-
-
-/* Grow a VBD by appending a new extent. Fails if the VBD doesn't exist. */
-void vbd_grow(blkif_be_vbd_grow_t *grow)
-{
- blkif_t *blkif;
- blkif_extent_le_t **px, *x;
- vbd_t *vbd = NULL;
- rb_node_t *rb;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|