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

Re: [PATCH] mini-os: xenbus: support large messages



Juergen Gross, le mer. 15 sept. 2021 12:48:44 +0200, a ecrit:
> On 15.09.21 01:17, Samuel Thibault wrote:
> > > +        prod = xenstore_buf->rsp_prod;
> > > +        DEBUG("Rsp_cons %d, rsp_prod %d.\n", xenstore_buf->rsp_cons, 
> > > prod);
> > > +        size = min(len - off, prod - xenstore_buf->rsp_cons);
> > > +        memcpy_from_ring(xenstore_buf->rsp, buf + off,
> > > +                         MASK_XENSTORE_IDX(xenstore_buf->rsp_cons), 
> > > size);
> > > +        off += size;
> > > +        notify = (xenstore_buf->rsp_cons + XENSTORE_RING_SIZE ==
> > > +                  xenstore_buf->rsp_prod);
> > 
> > This looks odd to me?  We want to notify as soon as the ring is empty,
> > which can happen at any place in the ring right?
> 
> No, we want to notify if the ring was full and is about to gain some
> space again, as the other side was probably not able to put all data
> in and is now waiting for more space to become available.

Ok, that said, the producer may fill the ring between this test and
the rsp_cons update, and thus the producer will go sleep and here the
consumer will not notice it and thus never notify it.

So we really need to make the test after the rsp_cons update, like Linux
does:

> > Linux' code uses (intf->rsp_prod - cons >= XENSTORE_RING_SIZE), *after*
> > the rsp_cons increase.

Samuel



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.