[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Drop support for multiple vbds per blkif.



# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID a826ad59b3eaf35a4ceed7fda47f1a550e1d62e7
# Parent  b3eb952c04ee963bd7a92e922cb6cb25969e5a0d
Drop support for multiple vbds per blkif.
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>

diff -r b3eb952c04ee -r a826ad59b3ea 
linux-2.6-xen-sparse/drivers/xen/blkback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Tue Aug 23 15:26:54 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Tue Aug 23 15:43:04 2005
@@ -48,8 +48,7 @@
     /* Comms information. */
     blkif_back_ring_t blk_ring;
     /* VBDs attached to this interface. */
-    rb_root_t         vbd_rb;        /* Mapping from 16-bit vdevices to VBDs.*/
-    spinlock_t        vbd_lock;      /* Protects VBD mapping. */
+    struct vbd *vbd;
     /* Private fields. */
     enum { DISCONNECTED, CONNECTED } status;
     /*
@@ -61,7 +60,6 @@
     /* Is this a blktap frontend */
     unsigned int     is_blktap;
 #endif
-    struct blkif_st *hash_next;
     struct list_head blkdev_list;
     spinlock_t       blk_ring_lock;
     atomic_t         refcnt;
@@ -77,7 +75,7 @@
 void blkif_connect(blkif_be_connect_t *connect);
 int  blkif_disconnect(blkif_be_disconnect_t *disconnect, u8 rsp_id);
 void blkif_disconnect_complete(blkif_t *blkif);
-blkif_t *blkif_find(domid_t domid);
+blkif_t *alloc_blkif(domid_t domid);
 void free_blkif(blkif_t *blkif);
 int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn);
 
diff -r b3eb952c04ee -r a826ad59b3ea 
linux-2.6-xen-sparse/drivers/xen/blkback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Tue Aug 23 
15:26:54 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Tue Aug 23 
15:43:04 2005
@@ -13,23 +13,11 @@
 #define VMALLOC_VMADDR(x) ((unsigned long)(x))
 #endif
 
-#define BLKIF_HASHSZ 1024
-#define BLKIF_HASH(_d) (((int)(_d))&(BLKIF_HASHSZ-1))
+static kmem_cache_t *blkif_cachep;
 
-static kmem_cache_t *blkif_cachep;
-static blkif_t      *blkif_hash[BLKIF_HASHSZ];
-
-blkif_t *blkif_find(domid_t domid)
+blkif_t *alloc_blkif(domid_t domid)
 {
-    blkif_t *blkif = blkif_hash[BLKIF_HASH(domid)];
-
-    while (blkif) {
-       if (blkif->domid == domid) {
-           blkif_get(blkif);
-           return blkif;
-       }
-        blkif = blkif->hash_next;
-    }
+    blkif_t *blkif;
 
     blkif = kmem_cache_alloc(blkif_cachep, GFP_KERNEL);
     if (!blkif)
@@ -38,12 +26,9 @@
     memset(blkif, 0, sizeof(*blkif));
     blkif->domid = domid;
     blkif->status = DISCONNECTED;
-    spin_lock_init(&blkif->vbd_lock);
     spin_lock_init(&blkif->blk_ring_lock);
     atomic_set(&blkif->refcnt, 1);
 
-    blkif->hash_next = blkif_hash[BLKIF_HASH(domid)];
-    blkif_hash[BLKIF_HASH(domid)] = blkif;
     return blkif;
 }
 
@@ -55,7 +40,7 @@
     op.flags = GNTMAP_host_map;
     op.ref = shared_page;
     op.dom = blkif->domid;
-       
+
     BUG_ON( HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1) );
 
     if (op.handle < 0) {
@@ -125,7 +110,6 @@
 
 void free_blkif(blkif_t *blkif)
 {
-    blkif_t     **pblkif;
     evtchn_op_t op = { .cmd = EVTCHNOP_close };
 
     op.u.close.port = blkif->evtchn;
@@ -143,14 +127,6 @@
        vfree(blkif->blk_ring.sring);
     }
 
-    pblkif = &blkif_hash[BLKIF_HASH(blkif->domid)];
-    while ( *pblkif != blkif )
-    {
-       BUG_ON(!*pblkif);
-        pblkif = &(*pblkif)->hash_next;
-    }
-    *pblkif = blkif->hash_next;
-    destroy_all_vbds(blkif);
     kmem_cache_free(blkif_cachep, blkif);
 }
 
@@ -158,5 +134,4 @@
 {
     blkif_cachep = kmem_cache_create("blkif_cache", sizeof(blkif_t), 
                                      0, 0, NULL, NULL);
-    memset(blkif_hash, 0, sizeof(blkif_hash));
 }
diff -r b3eb952c04ee -r a826ad59b3ea 
linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c    Tue Aug 23 15:26:54 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c    Tue Aug 23 15:43:04 2005
@@ -2,10 +2,6 @@
  * blkback/vbd.c
  * 
  * Routines for managing virtual block devices (VBDs).
- * 
- * NOTE: vbd_lock protects updates to the rb_tree against concurrent lookups 
- * in vbd_translate.  All other lookups are implicitly protected because the 
- * only caller (the control message dispatch routine) serializes the calls.
  * 
  * Copyright (c) 2003-2005, Keir Fraser & Steve Hand
  */
@@ -13,20 +9,21 @@
 #include "common.h"
 #include <asm-xen/xenbus.h>
 
-struct vbd { 
-    blkif_vdev_t   handle;     /* what the domain refers to this vbd as */
+struct vbd {
+    blkif_vdev_t   handle;      /* what the domain refers to this vbd as */
     unsigned char  readonly;    /* Non-zero -> read-only */
     unsigned char  type;        /* VDISK_xxx */
     blkif_pdev_t   pdevice;     /* phys device that this vbd maps to */
     struct block_device *bdev;
 
     int active;
-    rb_node_t      rb;          /* for linking into R-B tree lookup struct */
 }; 
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 static inline dev_t vbd_map_devnum(blkif_pdev_t cookie)
-{ return MKDEV(cookie>>8, cookie&0xff); }
+{
+    return MKDEV(BLKIF_MAJOR(cookie), BLKIF_MINOR(cookie));
+}
 #define vbd_sz(_v)   ((_v)->bdev->bd_part ? \
     (_v)->bdev->bd_part->nr_sects : (_v)->bdev->bd_disk->capacity)
 #define bdev_put(_b) blkdev_put(_b)
@@ -59,7 +56,7 @@
 struct vbd *vbd_create(blkif_t *blkif, blkif_vdev_t handle,
                       blkif_pdev_t pdevice, int readonly)
 {
-    struct vbd  *vbd; 
+    struct vbd *vbd, *err; 
 
     if ( unlikely((vbd = kmalloc(sizeof(struct vbd), GFP_KERNEL)) == NULL) )
     {
@@ -67,6 +64,7 @@
        return ERR_PTR(-ENOMEM);
     }
 
+    blkif->vbd = vbd;
     vbd->handle   = handle; 
     vbd->readonly = readonly;
     vbd->type     = 0;
@@ -74,7 +72,6 @@
 
     vbd->pdevice  = pdevice;
 
-    /* FIXME: Who frees vbd on failure? --RR */
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     vbd->bdev = open_by_devnum(
         vbd_map_devnum(vbd->pdevice),
@@ -82,136 +79,67 @@
     if ( IS_ERR(vbd->bdev) )
     {
         DPRINTK("vbd_creat: device %08x doesn't exist.\n", vbd->pdevice);
-        return ERR_PTR(-ENOENT);
+        err = ERR_PTR(-ENOENT);
+       goto out;
     }
 
     if ( (vbd->bdev->bd_disk == NULL) )
     {
         DPRINTK("vbd_creat: device %08x doesn't exist.\n", vbd->pdevice);
         bdev_put(vbd->bdev);
-        return ERR_PTR(-ENOENT);
+        err = ERR_PTR(-ENOENT);
+       goto out;
     }
 
     if ( vbd->bdev->bd_disk->flags & GENHD_FL_CD )
         vbd->type |= VDISK_CDROM;
     if ( vbd->bdev->bd_disk->flags & GENHD_FL_REMOVABLE )
         vbd->type |= VDISK_REMOVABLE;
-
 #else
     if ( (blk_size[MAJOR(vbd->pdevice)] == NULL) || (vbd_sz(vbd) == 0) )
     {
         DPRINTK("vbd_creat: device %08x doesn't exist.\n", vbd->pdevice);
-        return ERR_PTR(-ENOENT);
+        err = ERR_PTR(-ENOENT);
+       goto out;
     }
 #endif
 
     DPRINTK("Successful creation of handle=%04x (dom=%u)\n",
             handle, blkif->domid);
     return vbd;
+
+ out:
+    kfree(vbd);
+    return err;
 }
 
 void vbd_activate(blkif_t *blkif, struct vbd *vbd)
 {
-    rb_node_t  **rb_p, *rb_parent = NULL;
-    struct vbd *i;
     BUG_ON(vbd_is_active(vbd));
-
-    /* Find where to put it. */
-    rb_p = &blkif->vbd_rb.rb_node;
-    while ( *rb_p != NULL )
-    {
-        rb_parent = *rb_p;
-        i = rb_entry(rb_parent, struct vbd, rb);
-        if ( vbd->handle < i->handle )
-        {
-            rb_p = &rb_parent->rb_left;
-        }
-        else if ( vbd->handle > i->handle )
-        {
-            rb_p = &rb_parent->rb_right;
-        }
-        else
-        {
-           /* We never create two of same vbd, so not possible. */
-           BUG();
-        }
-    }
 
     /* Now we're active. */
     vbd->active = 1;
     blkif_get(blkif);
-
-    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);
 }
 
 void vbd_free(blkif_t *blkif, struct vbd *vbd)
 {
     if (vbd_is_active(vbd)) {
-       spin_lock(&blkif->vbd_lock);
-       rb_erase(&vbd->rb, &blkif->vbd_rb);
-       spin_unlock(&blkif->vbd_lock);
        blkif_put(blkif);
     }
     bdev_put(vbd->bdev);
     kfree(vbd);
 }
 
-void destroy_all_vbds(blkif_t *blkif)
-{
-    struct vbd *vbd;
-    rb_node_t  *rb;
-
-    spin_lock(&blkif->vbd_lock);
-
-    while ( (rb = blkif->vbd_rb.rb_node) != NULL )
-    {
-        vbd = rb_entry(rb, struct vbd, rb);
-        rb_erase(rb, &blkif->vbd_rb);
-        spin_unlock(&blkif->vbd_lock);
-        bdev_put(vbd->bdev);
-        kfree(vbd);
-        spin_lock(&blkif->vbd_lock);
-        blkif_put(blkif);
-    }
-
-    spin_unlock(&blkif->vbd_lock);
-}
-
 int vbd_translate(struct phys_req *req, blkif_t *blkif, int operation)
 {
-    struct vbd *vbd;
-    rb_node_t  *rb;
-    int         rc = -EACCES;
+    struct vbd *vbd = blkif->vbd;
+    int rc = -EACCES;
 
-    /* Take the vbd_lock because another thread could be updating the tree. */
-    spin_lock(&blkif->vbd_lock);
-
-    rb = blkif->vbd_rb.rb_node;
-    while ( rb != NULL )
-    {
-        vbd = rb_entry(rb, struct vbd, rb);
-        if ( req->dev < vbd->handle )
-            rb = rb->rb_left;
-        else if ( req->dev > vbd->handle )
-            rb = rb->rb_right;
-        else
-            goto found;
-    }
-
-    DPRINTK("vbd_translate; domain %u attempted to access "
-            "non-existent VBD.\n", blkif->domid);
-    rc = -ENODEV;
-    goto out;
-
- found:
-
-    if ( (operation == WRITE) && vbd->readonly )
+    if ((operation == WRITE) && vbd->readonly)
         goto out;
 
-    if ( unlikely((req->sector_number + req->nr_sects) > vbd_sz(vbd)) )
+    if (unlikely((req->sector_number + req->nr_sects) > vbd_sz(vbd)))
         goto out;
 
     req->dev  = vbd->pdevice;
@@ -219,6 +147,5 @@
     rc = 0;
 
  out:
-    spin_unlock(&blkif->vbd_lock);
     return rc;
 }
diff -r b3eb952c04ee -r a826ad59b3ea 
linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Tue Aug 23 15:26:54 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Tue Aug 23 15:43:04 2005
@@ -228,7 +228,7 @@
                p = strrchr(be->frontpath, '/') + 1;
                handle = simple_strtoul(p, NULL, 0);
 
-               be->blkif = blkif_find(be->frontend_id);
+               be->blkif = alloc_blkif(be->frontend_id);
                if (IS_ERR(be->blkif)) {
                        err = PTR_ERR(be->blkif);
                        be->blkif = NULL;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.