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

[Xen-changelog] bug fixes to tap and parallax.



ChangeSet 1.1665.1.6, 2005/06/04 15:00:22+01:00, akw27@xxxxxxxxxxxxxxxxxxxxxx

        bug fixes to tap and parallax.
        
        Signed-off-by: andrew.warfield@xxxxxxxxxxxx



 linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_controlmsg.c |    1 
 linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_datapath.c   |   18 +-
 tools/blktap/blktaplib.c                                       |   30 ++--
 tools/blktap/parallax.c                                        |   61 
++++++++--
 tools/blktap/radix.c                                           |    1 
 tools/blktap/vdi.c                                             |    9 +
 tools/blktap/vdi.h                                             |    3 
 7 files changed, 83 insertions(+), 40 deletions(-)


diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_controlmsg.c 
b/linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_controlmsg.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_controlmsg.c    
2005-06-05 07:01:35 -04:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_controlmsg.c    
2005-06-05 07:01:35 -04:00
@@ -443,6 +443,7 @@
              (blktap_mode & BLKTAP_MODE_COPY_FE) ) {
             
             blktap_write_ctrl_ring(msg);
+            blktap_kick_user();
         }
         
         switch ( msg->subtype )
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_datapath.c 
b/linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_datapath.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_datapath.c      
2005-06-05 07:01:35 -04:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_datapath.c      
2005-06-05 07:01:35 -04:00
@@ -82,6 +82,8 @@
 
 /*-----[ Ring helpers ]---------------------------------------------------*/
 
+static void maybe_trigger_blktap_schedule(void);
+
 inline int write_resp_to_fe_ring(blkif_t *blkif, blkif_response_t *rsp)
 {
     blkif_response_t *resp_d;
@@ -125,6 +127,9 @@
     RING_PUSH_RESPONSES(&blkif->blk_ring);
     notify_via_evtchn(blkif->evtchn);
     DPRINTK("notified FE(dom %u)\n", blkif->domid);
+
+    /* We just feed up a batch of request slots... */
+    maybe_trigger_blktap_schedule();
     
 }
 
@@ -219,15 +224,10 @@
                 add_to_blkdev_list_tail(blkif);
             blkif_put(blkif);
         }
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-        /* Push the batch through to disc. */
-        run_task_queue(&tq_disk);
-#endif
     }
 }
 
-static void maybe_trigger_blkio_schedule(void)
+static void maybe_trigger_blktap_schedule(void)
 {
     /*
      * Needed so that two processes, who together make the following predicate
@@ -236,7 +236,7 @@
      */
     smp_mb();
 
-    if ( (NR_ACTIVE_REQS < (MAX_ACTIVE_REQS)) && /* XXX!!! was M_A_R/2*/
+    if ( (NR_ACTIVE_REQS < (MAX_ACTIVE_REQS/2)) &&
          !list_empty(&blkio_schedule_list) ) 
         wake_up(&blkio_schedule_wait);
 }
@@ -262,7 +262,7 @@
     blkif_t *blkif = dev_id;
 
     add_to_blkdev_list_tail(blkif);
-    maybe_trigger_blkio_schedule();
+    maybe_trigger_blktap_schedule();
     return IRQ_HANDLED;
 }
 
@@ -280,8 +280,6 @@
     int more_to_do = 0;
     int notify_be = 0, notify_user = 0;
     
-    DPRINTK("PT got FE interrupt.\n");
-
     if (NR_ACTIVE_REQS == MAX_ACTIVE_REQS) return 1;
     
     /* lock both rings */
diff -Nru a/tools/blktap/blktaplib.c b/tools/blktap/blktaplib.c
--- a/tools/blktap/blktaplib.c  2005-06-05 07:01:35 -04:00
+++ b/tools/blktap/blktaplib.c  2005-06-05 07:01:35 -04:00
@@ -34,7 +34,7 @@
 #else
 #define DPRINTF(_f, _a...) ((void)0)
 #endif
-#define DEBUG_RING_IDXS 1
+#define DEBUG_RING_IDXS 0
 
 #define POLLRDNORM     0x040 
 
@@ -171,27 +171,27 @@
     response_hook_t *rsp_hook;
     ctrl_hook_t     *ctrl_hook;
     
-    printf("Control Hooks:\n");
+    DPRINTF("Control Hooks:\n");
     ctrl_hook = ctrl_hook_chain;
     while (ctrl_hook != NULL)
     {
-        printf("  [0x%p] %s\n", ctrl_hook->func, ctrl_hook->name);
+        DPRINTF("  [0x%p] %s\n", ctrl_hook->func, ctrl_hook->name);
         ctrl_hook = ctrl_hook->next;
     }
     
-    printf("Request Hooks:\n");
+    DPRINTF("Request Hooks:\n");
     req_hook = request_hook_chain;
     while (req_hook != NULL)
     {
-        printf("  [0x%p] %s\n", req_hook->func, req_hook->name);
+        DPRINTF("  [0x%p] %s\n", req_hook->func, req_hook->name);
         req_hook = req_hook->next;
     }
     
-    printf("Response Hooks:\n");
+    DPRINTF("Response Hooks:\n");
     rsp_hook = response_hook_chain;
     while (rsp_hook != NULL)
     {
-        printf("  [0x%p] %s\n", rsp_hook->func, rsp_hook->name);
+        DPRINTF("  [0x%p] %s\n", rsp_hook->func, rsp_hook->name);
         rsp_hook = rsp_hook->next;
     }
 }
@@ -300,7 +300,7 @@
     ph->events      = events;
     ph->active      = 1;
     
-    printf("Added fd %d at ph index %d, now %d phs.\n", fd, ph_cons-1, 
+    DPRINTF("Added fd %d at ph index %d, now %d phs.\n", fd, ph_cons-1, 
             nr_pollhooks());
     
     return 0;
@@ -318,7 +318,7 @@
             break;
         }
         
-    printf("Removed fd %d at ph index %d, now %d phs.\n", fd, i, 
+    DPRINTF("Removed fd %d at ph index %d, now %d phs.\n", fd, i, 
             nr_pollhooks());
 }
 
@@ -337,7 +337,6 @@
 
 void __attribute__ ((constructor)) blktaplib_init(void)
 {
-    printf("[[ C O N S T R U C T O R ]]\n");
     pollhook_init();
 }
 
@@ -385,7 +384,7 @@
 
     /* assign the rings to the mapped memory */
     csring = (ctrl_sring_t *)blktap_mem;
-    BACK_RING_INIT(&ctrl_ring, csring, CONTROL_RING_MEM);
+    BACK_RING_INIT(&ctrl_ring, csring, PAGE_SIZE);
     
     sring = (blkif_sring_t *)((unsigned long)blktap_mem + PAGE_SIZE);
     FRONT_RING_INIT(&be_ring, sring, PAGE_SIZE);
@@ -393,10 +392,7 @@
     sring = (blkif_sring_t *)((unsigned long)blktap_mem + (2 *PAGE_SIZE));
     BACK_RING_INIT(&fe_ring, sring, PAGE_SIZE);
 
-    mmap_vstart = (unsigned long)blktap_mem + (BLKTAP_RING_PAGES << 
PAGE_SHIFT);
-    
-    printf("fe_ring mapped at: %p\n", fe_ring.sring);
-    printf("be_ring mapped at: %p\n", be_ring.sring);
+    mmap_vstart = (unsigned long)blktap_mem +(BLKTAP_RING_PAGES << PAGE_SHIFT);
 
     ioctl(fd, BLKTAP_IOCTL_SETMODE, BLKTAP_MODE_INTERPOSE );
 
@@ -560,7 +556,9 @@
 }
 
 void got_sig_int() {
-    printf("quitting -- returning to passthrough mode.\n");
+    DPRINTF("quitting -- returning to passthrough mode.\n");
     if (fd > 0) ioctl(fd, BLKTAP_IOCTL_SETMODE, BLKTAP_MODE_PASSTHROUGH );
+    close(fd);
+    fd = 0;
     exit(0);
 } 
diff -Nru a/tools/blktap/parallax.c b/tools/blktap/parallax.c
--- a/tools/blktap/parallax.c   2005-06-05 07:01:35 -04:00
+++ b/tools/blktap/parallax.c   2005-06-05 07:01:35 -04:00
@@ -88,17 +88,14 @@
     blkif->domid  = domid;
     blkif->handle = handle;
     blkif->status = DISCONNECTED;
-/*
-    spin_lock_init(&blkif->vbd_lock);
-    spin_lock_init(&blkif->blk_ring_lock);
-    atomic_set(&blkif->refcnt, 0);
-*/
+
     pblkif = &blkif_hash[BLKIF_HASH(domid, handle)];
     while ( *pblkif != NULL )
     {
         if ( ((*pblkif)->domid == domid) && ((*pblkif)->handle == handle) )
         {
-            DPRINTF("Could not create blkif: already exists\n");
+            DPRINTF("Could not create blkif: already exists (%d,%d)\n",
+                domid, handle);
             create->status = BLKIF_BE_STATUS_INTERFACE_EXISTS;
             free(blkif);
             return;
@@ -142,7 +139,6 @@
 
  destroy:
     *pblkif = blkif->hash_next;
-    /* destroy_all_vbds(blkif); */
     free(blkif);
     destroy->status = BLKIF_BE_STATUS_OKAY;
 }
@@ -184,10 +180,38 @@
         vdip = &(*vdip)->next;
     *vdip = vdi;
     
-    DPRINTF("vbd_grow: happy return!\n"); 
+    DPRINTF("blkif_create succeeded\n"); 
     create->status = BLKIF_BE_STATUS_OKAY;
 }
 
+void vbd_destroy(blkif_be_vbd_destroy_t *destroy)
+{
+    blkif_t            *blkif;
+    vdi_t              *vdi, **vdip;
+    blkif_vdev_t        vdevice = destroy->vdevice;
+    
+    blkif = blkif_find_by_handle(destroy->domid, destroy->blkif_handle);
+    if ( blkif == NULL )
+    {
+        DPRINTF("vbd_destroy attempted for non-existent blkif (%u,%u)\n", 
+                destroy->domid, destroy->blkif_handle); 
+        destroy->status = BLKIF_BE_STATUS_INTERFACE_NOT_FOUND;
+        return;
+    }
+
+    vdip = &blkif->vdi_hash[VDI_HASH(vdevice)];
+    while ((*vdip != NULL) && ((*vdip)->vdevice != vdevice))
+        vdip = &(*vdip)->next;
+
+    if (*vdip != NULL) 
+    {
+        vdi = *vdip;
+        *vdip = vdi->next;
+        vdi_put(vdi);
+    }
+        
+}
+

_______________________________________________
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®.