Jason Wang
2022-Dec-22 08:43 UTC
[RFC PATCH 4/4] virtio-net: sleep instead of busy waiting for cvq command
Hi Alvaro: On Thu, Dec 22, 2022 at 2:44 PM Alvaro Karsz <alvaro.karsz at solid-run.com> wrote:> > Hi Jason, > > Adding timeout to the cvq is a great idea IMO. > > > - /* Spin for a response, the kick causes an ioport write, trapping > > - * into the hypervisor, so the request should be handled immediately. > > - */ > > - while (!virtqueue_get_buf(vi->cvq, &tmp) && > > - !virtqueue_is_broken(vi->cvq)) > > - cpu_relax(); > > + virtqueue_wait_for_used(vi->cvq, &tmp); > > Do you think that we should continue like nothing happened in case of a timeout?We could, but we should not depend on a device to do this since it's not reliable. More below.> Shouldn't we reset the device?We can't depend on device, there's probably another loop in reset(): E.g in vp_reset() we had: while (vp_modern_get_status(mdev)) msleep(1);> What happens if a device completes the control command after timeout?Maybe we could have a BAD_RING() here in this case (and more check in vq->broken in this case). Thanks> > Thanks > > Alvaro >
Alvaro Karsz
2022-Dec-22 15:54 UTC
[RFC PATCH 4/4] virtio-net: sleep instead of busy waiting for cvq command
My point is that the device may complete the control command after the timeout, so, if I'm not mistaken, next time we send a control command and call virtqueue_wait_for_used we'll get the previous response.