On Thu, 30 Mar 2017 08:18:34 -0500 Eric Blake <ebl...@redhat.com> wrote:
> On 03/30/2017 03:26 AM, Greg Kurz wrote: > > If a client tries to flush the same outstanding request several times, only > > the first flush completes. Subsequent ones keep waiting for the request > > completion in v9fs_flush() and, therefore, leak a PDU. This will cause QEMU > > to hang when draining active PDUs the next time the device is reset. > > Since this fixes a hang, is it 2.9 material? > Yes, definitely, I just forgot to add the for-2.9 tag :) > > > > Let have each flush request wake up the next one if any. The last waiter > > frees the cancelled PDU. > > > > Signed-off-by: Greg Kurz <gr...@kaod.org> > > --- > > hw/9pfs/9p.c | 6 ++++-- > > 1 file changed, 4 insertions(+), 2 deletions(-) > > > > Reviewed-by: Eric Blake <ebl...@redhat.com> > > > diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c > > index 48babce836b6..ef47a0a5ad6f 100644 > > --- a/hw/9pfs/9p.c > > +++ b/hw/9pfs/9p.c > > @@ -2387,8 +2387,10 @@ static void coroutine_fn v9fs_flush(void *opaque) > > * Wait for pdu to complete. > > */ > > qemu_co_queue_wait(&cancel_pdu->complete, NULL); > > - cancel_pdu->cancelled = 0; > > - pdu_free(cancel_pdu); > > + if (!qemu_co_queue_next(&cancel_pdu->complete)) { > > + cancel_pdu->cancelled = 0; > > + pdu_free(cancel_pdu); > > + } > > } > > pdu_complete(pdu, 7); > > } > > > > > > >
pgpYnfPA6mbg3.pgp
Description: OpenPGP digital signature