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

[Xen-changelog] Fix blkdev suspend/resume.



ChangeSet 1.1350, 2005/04/21 10:14:12+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        Fix blkdev suspend/resume.
        Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>



 arch/xen/kernel/gnttab.c        |   20 +--
 drivers/xen/blkfront/blkfront.c |  249 +++++++++++++++++++++-------------------
 2 files changed, 146 insertions(+), 123 deletions(-)


diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/kernel/gnttab.c 
b/linux-2.6.11-xen-sparse/arch/xen/kernel/gnttab.c
--- a/linux-2.6.11-xen-sparse/arch/xen/kernel/gnttab.c  2005-04-21 06:02:28 
-04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/kernel/gnttab.c  2005-04-21 06:02:28 
-04:00
@@ -330,34 +330,36 @@
     setup.nr_frames  = NR_GRANT_FRAMES;
     setup.frame_list = frames;
 
-    if ( HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1) != 0 )
-        BUG();
-    if ( setup.status != 0 )
-        BUG();
+    BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1) != 0);
+    BUG_ON(setup.status != 0);
 
     for ( i = 0; i < NR_GRANT_FRAMES; i++ )
         set_fixmap_ma(FIX_GNTTAB_END - i, frames[i] << PAGE_SHIFT);
 
-    shared = (grant_entry_t *)fix_to_virt(FIX_GNTTAB_END);
-
-    for ( i = 0; i < NR_GRANT_ENTRIES; i++ )
-        gnttab_free_list[i] = i + 1;
-    
     return 0;
 }
 
 int gnttab_suspend(void)
 {
     int i;
+
     for ( i = 0; i < NR_GRANT_FRAMES; i++ )
        clear_fixmap(FIX_GNTTAB_END - i);
+
     return 0;
 }
 
 static int __init gnttab_init(void)
 {
+    int i;
+
     BUG_ON(gnttab_resume());
 
+    shared = (grant_entry_t *)fix_to_virt(FIX_GNTTAB_END);
+
+    for ( i = 0; i < NR_GRANT_ENTRIES; i++ )
+        gnttab_free_list[i] = i + 1;
+    
     /*
      *  /proc/xen/grant : used by libxc to access grant tables
      */
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blkfront/blkfront.c 
b/linux-2.6.11-xen-sparse/drivers/xen/blkfront/blkfront.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/blkfront/blkfront.c   2005-04-21 
06:02:28 -04:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blkfront/blkfront.c   2005-04-21 
06:02:28 -04:00
@@ -94,37 +94,38 @@
 static grant_ref_t gref_head, gref_terminal;
 #define MAXIMUM_OUTSTANDING_BLOCK_REQS \
     (BLKIF_MAX_SEGMENTS_PER_REQUEST * BLKIF_RING_SIZE)
+#define GRANTREF_INVALID (1<<15)
 #endif
 
-unsigned long rec_ring_free;
-blkif_request_t rec_ring[BLK_RING_SIZE];
+static struct blk_shadow {
+    blkif_request_t req;
+    unsigned long request;
+    unsigned long frame[BLKIF_MAX_SEGMENTS_PER_REQUEST];
+} blk_shadow[BLK_RING_SIZE];
+unsigned long blk_shadow_free;
 
-static int recovery = 0;           /* "Recovery in progress" flag.  Protected
-                                    * by the blkif_io_lock */
+static int recovery = 0; /* Recovery in progress: protected by blkif_io_lock */
 
 static void kick_pending_request_queues(void);
 
 int __init xlblk_init(void);
 
-void blkif_completion( blkif_request_t *req );
+static void blkif_completion(struct blk_shadow *s);
 
-static inline int GET_ID_FROM_FREELIST( void )
+static inline int GET_ID_FROM_FREELIST(void)
 {
-    unsigned long free = rec_ring_free;
-
+    unsigned long free = blk_shadow_free;
     BUG_ON(free > BLK_RING_SIZE);
-
-    rec_ring_free = rec_ring[free].id;
-
-    rec_ring[free].id = 0x0fffffee; /* debug */
-
+    blk_shadow_free = blk_shadow[free].req.id;
+    blk_shadow[free].req.id = 0x0fffffee; /* debug */
     return free;
 }
 
-static inline void ADD_ID_TO_FREELIST( unsigned long id )
+static inline void ADD_ID_TO_FREELIST(unsigned long id)
 {
-    rec_ring[id].id = rec_ring_free;
-    rec_ring_free = id;
+    blk_shadow[id].req.id  = blk_shadow_free;
+    blk_shadow[id].request = 0;
+    blk_shadow_free = id;
 }
 
 
@@ -138,41 +139,31 @@
 #define DISABLE_SCATTERGATHER() (sg_operation = -1)
 #endif
 
-static inline void translate_req_to_pfn(blkif_request_t *xreq,
-                                        blkif_request_t *req)
+static inline void pickle_request(struct blk_shadow *s, blkif_request_t *r)
 {
+#ifndef CONFIG_XEN_BLKDEV_GRANT
     int i;
+#endif
 
-    xreq->operation     = req->operation;
-    xreq->nr_segments   = req->nr_segments;
-    xreq->device        = req->device;
-    /* preserve id */
-    xreq->sector_number = req->sector_number;
+    s->req = *r;
 
-    for ( i = 0; i < req->nr_segments; i++ )
-#ifdef CONFIG_XEN_BLKDEV_GRANT
-        xreq->frame_and_sects[i] = req->frame_and_sects[i];
-#else
-        xreq->frame_and_sects[i] = machine_to_phys(req->frame_and_sects[i]);
+#ifndef CONFIG_XEN_BLKDEV_GRANT
+    for ( i = 0; i < r->nr_segments; i++ )
+        s->req.frame_and_sects[i] = machine_to_phys(r->frame_and_sects[i]);
 #endif
 }
 
-static inline void translate_req_to_mfn(blkif_request_t *xreq,
-                                        blkif_request_t *req)
+static inline void unpickle_request(blkif_request_t *r, struct blk_shadow *s)
 {
+#ifndef CONFIG_XEN_BLKDEV_GRANT
     int i;
+#endif
 
-    xreq->operation     = req->operation;
-    xreq->nr_segments   = req->nr_segments;
-    xreq->device        = req->device;
-    xreq->id            = req->id;   /* copy id (unlike above) */
-    xreq->sector_number = req->sector_number;
+    *r = s->req;
 
-    for ( i = 0; i < req->nr_segments; i++ )
-#ifdef CONFIG_XEN_BLKDEV_GRANT
-        xreq->frame_and_sects[i] = req->frame_and_sects[i];
-#else
-        xreq->frame_and_sects[i] = phys_to_machine(req->frame_and_sects[i]);
+#ifndef CONFIG_XEN_BLKDEV_GRANT
+    for ( i = 0; i < s->req.nr_segments; i++ )
+        r->frame_and_sects[i] = phys_to_machine(s->req.frame_and_sects[i]);
 #endif
 }
 
@@ -185,8 +176,6 @@
 }
 
 
-
-
 /**************************  KERNEL VERSION 2.6  **************************/
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
@@ -208,7 +197,6 @@
 
 static void kick_pending_request_queues(void)
 {
-
     if ( (xlbd_blk_queue != NULL) &&
          test_bit(QUEUE_FLAG_STOPPED, &xlbd_blk_queue->queue_flags) )
     {
@@ -218,7 +206,6 @@
          */
         xlbd_blk_queue->request_fn(xlbd_blk_queue);
     }
-
 }
 
 
@@ -243,9 +230,8 @@
      * When usage drops to zero it may allow more VBD updates to occur.
      * Update of usage count is protected by a per-device semaphore.
      */
-    if (--di->mi->usage == 0) {
+    if ( --di->mi->usage == 0 )
         vbd_update();
-    }
 
     return 0;
 }
@@ -259,8 +245,8 @@
     DPRINTK_IOCTL("command: 0x%x, argument: 0x%lx, dev: 0x%04x\n",
                   command, (long)argument, inode->i_rdev); 
   
-    switch (command) {
-
+    switch ( command )
+    {
     case HDIO_GETGEO:
         /* return ENOSYS to use defaults */
         return -ENOSYS;
@@ -312,7 +298,7 @@
     /* Fill out a communications ring structure. */
     ring_req = RING_GET_REQUEST(&blk_ring, blk_ring.req_prod_pvt);
     id = GET_ID_FROM_FREELIST();
-    rec_ring[id].id = (unsigned long) req;
+    blk_shadow[id].request = (unsigned long)req;
 
     ring_req->id = id;
     ring_req->operation = rq_data_dir(req) ? BLKIF_OP_WRITE :
@@ -341,8 +327,12 @@
                         buffer_ma >> PAGE_SHIFT,
                         rq_data_dir(req) );
 
+            blk_shadow[id].frame[ring_req->nr_segments] =
+                buffer_ma >> PAGE_SHIFT;
+
             ring_req->frame_and_sects[ring_req->nr_segments++] =
                 (((u32) ref) << 16) | (fsect << 3) | lsect;
+
 #else
             ring_req->frame_and_sects[ring_req->nr_segments++] =
                 buffer_ma | (fsect << 3) | lsect;
@@ -353,7 +343,7 @@
     blk_ring.req_prod_pvt++;
     
     /* Keep a private copy so we can reissue requests when recovering. */
-    translate_req_to_pfn(&rec_ring[id], ring_req);
+    pickle_request(&blk_shadow[id], ring_req);
 
     return 0;
 }
@@ -372,8 +362,10 @@
 
     queued = 0;
 
-    while ((req = elv_next_request(rq)) != NULL) {
-        if (!blk_fs_request(req)) {
+    while ( (req = elv_next_request(rq)) != NULL )
+    {
+        if ( !blk_fs_request(req) )

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