qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 3/3] net: virtio-net discards TX data after link


From: Yuri Benditovich
Subject: Re: [Qemu-devel] [PATCH 3/3] net: virtio-net discards TX data after link down
Date: Tue, 8 Nov 2016 10:26:43 +0200

On Tue, Nov 8, 2016 at 8:48 AM, Jason Wang <address@hidden> wrote:

>
>
> On 2016年11月07日 16:20, address@hidden wrote:
>
>> From: Yuri Benditovich <address@hidden>
>>
>> https://bugzilla.redhat.com/show_bug.cgi?id=1295637
>> Upon set_link monitor command or upon netdev deletion
>> virtio-net sends link down indication to the guest
>> and stops vhost if one is used.
>> Guest driver can still submit data for TX until it
>> recognizes link loss. If these packets not returned by
>> the host, the Windows guest will never be able to finish
>> disable/removal/shutdown.
>> Now each packet sent by guest after NIC indicated link
>> down will be completed immediately.
>>
>> Signed-off-by: Yuri Benditovich <address@hidden>
>> ---
>>   hw/net/virtio-net.c | 15 +++++++++++++++
>>   1 file changed, 15 insertions(+)
>>
>> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
>> index 06bfe4b..6158de0 100644
>> --- a/hw/net/virtio-net.c
>> +++ b/hw/net/virtio-net.c
>> @@ -1200,6 +1200,16 @@ static ssize_t virtio_net_receive(NetClientState
>> *nc, const uint8_t *buf, size_t
>>       return size;
>>   }
>>   +static void virtio_net_drop_tx_queue_data(VirtIODevice *vdev,
>> VirtQueue *vq)
>> +{
>> +    VirtQueueElement *elem;
>> +    while ((elem = virtqueue_pop(vq, sizeof(VirtQueueElement)))) {
>> +        virtqueue_push(vq, elem, 0);
>> +        virtio_notify(vdev, vq);
>> +        g_free(elem);
>> +    }
>> +}
>> +
>>   static int32_t virtio_net_flush_tx(VirtIONetQueue *q);
>>     static void virtio_net_tx_complete(NetClientState *nc, ssize_t len)
>> @@ -1345,6 +1355,11 @@ static void virtio_net_handle_tx_bh(VirtIODevice
>> *vdev, VirtQueue *vq)
>>       VirtIONet *n = VIRTIO_NET(vdev);
>>       VirtIONetQueue *q = &n->vqs[vq2q(virtio_get_queue_index(vq))];
>>   +    if (unlikely((n->status & VIRTIO_NET_S_LINK_UP) == 0)) {
>> +        virtio_net_drop_tx_queue_data(vdev, vq);
>> +        return;
>> +    }
>> +
>>       if (unlikely(q->tx_waiting)) {
>>           return;
>>       }
>>
>
> This doesn't work for tx timer, you may want to do the modification on
> virtio_net_flush_tx().
>
> What's more, when link_down is true, qemu_send_packet_async() will return
> size of iov, can we do some check there?
>
> Thanks
>

I will prepare v2 with support for timer configuration. But in case of
vhost virtio_net_flush_tx() never called and without vhost I did not
succeed to reproduce the problem.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]