On 15.09.21 13:20, Samuel Thibault wrote:
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.
Oh, you are right, of course. How could I overlook this? Thanks, Juergen
OpenPGP_0xB0DE9DD628BF132F.asc
Description: OpenPGP public key
OpenPGP_signature
Description: OpenPGP digital signature