* [PATCH] minios: blkfront_aio_poll may reenter
@ 2008-03-26 12:10 Samuel Thibault
2008-04-05 12:31 ` Samuel Thibault
0 siblings, 1 reply; 3+ messages in thread
From: Samuel Thibault @ 2008-03-26 12:10 UTC (permalink / raw)
To: xen-devel
minios: blkfront_aio_poll may reenter
if the callback calls blkfront_sync for instance.
In such a case, we would see responses and hence release grants several
times. We huts 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>
diff -r 91c4e704169d extras/mini-os/blkfront.c
--- a/extras/mini-os/blkfront.c Wed Mar 26 11:28:47 2008 +0000
+++ b/extras/mini-os/blkfront.c Wed Mar 26 12:07:07 2008 +0000
@@ -319,6 +319,7 @@ int blkfront_aio_poll(struct blkfront_de
{
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;
}
+ default:
+ printk("unrecognized block operation %d response\n", rsp->operation);
case BLKIF_OP_WRITE_BARRIER:
case BLKIF_OP_FLUSH_DISKCACHE:
- break;
- default:
- printk("unrecognized block operation %d response\n", rsp->operation);
+ 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;
diff -r 91c4e704169d extras/mini-os/minios.mk
--- a/extras/mini-os/minios.mk Wed Mar 26 11:28:47 2008 +0000
+++ b/extras/mini-os/minios.mk Wed Mar 26 12:07:07 2008 +0000
@@ -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
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] minios: blkfront_aio_poll may reenter
2008-03-26 12:10 [PATCH] minios: blkfront_aio_poll may reenter Samuel Thibault
@ 2008-04-05 12:31 ` Samuel Thibault
2008-04-05 12:40 ` Samuel Thibault
0 siblings, 1 reply; 3+ messages in thread
From: Samuel Thibault @ 2008-04-05 12:31 UTC (permalink / raw)
To: xen-devel
Hello,
That patch didn't get apply, is there any problem with it?
Samuel
minios: blkfront_aio_poll may reenter
if the callback calls blkfront_sync for instance.
In such a case, we would see responses and hence release grants several
times. We thus 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>
diff -r 91c4e704169d extras/mini-os/blkfront.c
--- a/extras/mini-os/blkfront.c Wed Mar 26 11:28:47 2008 +0000
+++ b/extras/mini-os/blkfront.c Wed Mar 26 12:07:07 2008 +0000
@@ -319,6 +319,7 @@ int blkfront_aio_poll(struct blkfront_de
{
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;
}
+ default:
+ printk("unrecognized block operation %d response\n", rsp->operation);
case BLKIF_OP_WRITE_BARRIER:
case BLKIF_OP_FLUSH_DISKCACHE:
- break;
- default:
- printk("unrecognized block operation %d response\n", rsp->operation);
+ 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;
diff -r 91c4e704169d extras/mini-os/minios.mk
--- a/extras/mini-os/minios.mk Wed Mar 26 11:28:47 2008 +0000
+++ b/extras/mini-os/minios.mk Wed Mar 26 12:07:07 2008 +0000
@@ -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
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-04-05 12:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-26 12:10 [PATCH] minios: blkfront_aio_poll may reenter Samuel Thibault
2008-04-05 12:31 ` Samuel Thibault
2008-04-05 12:40 ` Samuel Thibault
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.