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

Reply via email to