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