]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/mini-os.git/commitdiff
minios: blkfront_aio_poll may reenter
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 26 Mar 2008 13:15:00 +0000 (13:15 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 26 Mar 2008 13:15:00 +0000 (13:15 +0000)
if the callback calls blkfront_sync for instance.
In such a case, we would see responses and hence release grants
several times. We need to be more synchronous and stop when we detect
that we have re-entered.
This fixes HVM restore with stubdomains.

Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
blkfront.c
minios.mk

index 3a6c22acebd7f42335a4c9695cbe34f86b4a4f89..b227f06247ae2a3d3c3af75fac9c19e77ddf5701 100644 (file)
@@ -319,6 +319,7 @@ int blkfront_aio_poll(struct blkfront_dev *dev)
 {
     RING_IDX rp, cons;
     struct blkif_response *rsp;
+    int more;
 
 moretodo:
 #ifdef HAVE_LIBC
@@ -334,6 +335,7 @@ moretodo:
     while ((cons != rp))
     {
        rsp = RING_GET_RESPONSE(&dev->ring, cons);
+       nr_consumed++;
 
         if (rsp->status != BLKIF_RSP_OKAY)
             printk("block error %d for op %d\n", rsp->status, rsp->operation);
@@ -343,29 +345,30 @@ moretodo:
         case BLKIF_OP_WRITE:
         {
             struct blkfront_aiocb *aiocbp = (void*) (uintptr_t) rsp->id;
+            int status = rsp->status;
             int j;
 
             for (j = 0; j < aiocbp->n; j++)
                 gnttab_end_access(aiocbp->gref[j]);
 
+            dev->ring.rsp_cons = ++cons;
             /* Nota: callback frees aiocbp itself */
-            aiocbp->aio_cb(aiocbp, rsp->status ? -EIO : 0);
+            aiocbp->aio_cb(aiocbp, status ? -EIO : 0);
+            if (dev->ring.rsp_cons != cons)
+                /* We reentered, we must not continue here */
+                goto out;
             break;
         }
-        case BLKIF_OP_WRITE_BARRIER:
-        case BLKIF_OP_FLUSH_DISKCACHE:
-            break;
         default:
             printk("unrecognized block operation %d response\n", rsp->operation);
+        case BLKIF_OP_WRITE_BARRIER:
+        case BLKIF_OP_FLUSH_DISKCACHE:
+            dev->ring.rsp_cons = ++cons;
             break;
         }
-
-       nr_consumed++;
-       ++cons;
     }
-    dev->ring.rsp_cons = cons;
 
-    int more;
+out:
     RING_FINAL_CHECK_FOR_RESPONSES(&dev->ring, more);
     if (more) goto moretodo;
 
index d881e3da4e6582f9169f3ca90e38b4f11e71b296..2282a187e20f99693a098acab9170fad6c2c3d99 100644 (file)
--- a/minios.mk
+++ b/minios.mk
@@ -16,10 +16,10 @@ DEF_LDFLAGS =
 
 ifeq ($(debug),y)
 DEF_CFLAGS += -g
-#DEF_CFLAGS += MM_DEBUG
-#DEF_CFLAGS += FS_DEBUG
-#DEF_CFLAGS += LIBC_DEBUG
-#DEF_CFLAGS += GNT_DEBUG
+#DEF_CFLAGS += -DMM_DEBUG
+#DEF_CFLAGS += -DFS_DEBUG
+#DEF_CFLAGS += -DLIBC_DEBUG
+DEF_CFLAGS += -DGNT_DEBUG
 else
 DEF_CFLAGS += -O3
 endif