Am Donnerstag, 10. Januar 2008 schrieb Christian Borntraeger:
> Am Dienstag, 18. Dezember 2007 schrieb Rusty Russell:
> > To me this points to doing interrupt suppression a different way. If we
> > have a ->disable_cb() virtio function, and call it before we call
> > netif_rx_schedule, does that fix it?
>
> The fix looks good and I agree with it.
>
> There is one problem that I try to find for some days, but the following
> BUG_ON triggers:
>
> static void vring_disable_cb(struct virtqueue *_vq)
> {
> struct vring_virtqueue *vq = to_vvq(_vq);
>
> START_USE(vq);
> ----> BUG_ON(vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT);
> vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
> END_USE(vq);
> }
Ok, I found it:
static int virtnet_open(struct net_device *dev)
{
struct virtnet_info *vi = netdev_priv(dev);
try_fill_recv(vi);
/* If we didn't even get one input buffer, we're useless. */
if (vi->num == 0)
return -ENOMEM;
---> int for new packet
static void skb_recv_done(struct
virtqueue *rvq)
{
struct virtnet_info *vi =
rvq->vdev->priv;
/* Suppress further interrupts.
*/
rvq->vq_ops->disable_cb(rvq);
netif_rx_schedule(vi->dev,
&vi->napi);
}
- poll is not yet possible, no softirq
- return from interrupt
napi_enable(&vi->napi);
vi->rvq->vq_ops->disable_cb(vi->rvq);
---> BUG: its already disabled
Christian
_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/virtualization