On Tue, May 2, 2023 at 11:30 AM Aaron Mason <simplersolut...@gmail.com> wrote: > > On Tue, May 2, 2023 at 9:29 AM Aaron Mason <simplersolut...@gmail.com> wrote: > > [REDACTED] > > > > > > The actual problem is here. One request times out, but the driver does > > > not tell qemu that it should abort the request. The queue entry then > > > gets reused and the two responses from qemu overwrite each other. You > > > could try if increasing the timeout here to e.g. 10000 helps: > > > > > > if (ISSET(xs->flags, SCSI_POLL)) { > > > DPRINTF("vioscsi_scsi_cmd: polling...\n"); > > > int timeout = 1000; > > > do { > > > virtio_poll_intr(vsc); > > > if (vr->vr_xs != xs) > > > break; > > > delay(1000); > > > } while (--timeout > 0); > > > if (vr->vr_xs == xs) { > > > // TODO(matthew): Abort the request. > > > xs->error = XS_TIMEOUT; > > > xs->resid = xs->datalen; > > > DPRINTF("vioscsi_scsi_cmd: polling timeout\n"); > > > scsi_done(xs); > > > } > > > > > > Unfortunately, it order to properly abort the request, quite a bit of > > > infrastructure related to the control queue is still missing in the > > > driver. > > > > I'll give it a go and report back, thanks! > > > > No dice, it only takes longer to generate a page fault. > > -- > Aaron Mason - Programmer, open source addict > I've taken my software vows - for beta or for worse
Increasing it to 40000 has the same effect, only longer. -- Aaron Mason - Programmer, open source addict I've taken my software vows - for beta or for worse