Samuel Thibault
2008-Mar-26 12:10 UTC
[Xen-devel] [PATCH] minios: blkfront_aio_poll may reenter
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 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Samuel Thibault
2008-Apr-05 12:31 UTC
[Xen-devel] Re: [PATCH] minios: blkfront_aio_poll may reenter
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 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Samuel Thibault
2008-Apr-05 12:40 UTC
[Xen-devel] Re: [PATCH] minios: blkfront_aio_poll may reenter
Samuel Thibault, le Sat 05 Apr 2008 14:31:08 +0200, a écrit :> That patch didn''t get apply, is there any problem with it?Oops sorry, discard that, I was looking at a non-updated repository. Samuel _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel