qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] net/hub: remove can_receive handler


From: Fedorov Sergey
Subject: Re: [Qemu-devel] [PATCH] net/hub: remove can_receive handler
Date: Mon, 22 Apr 2013 16:26:16 +0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130329 Thunderbird/17.0.5

On 04/22/2013 03:47 PM, Stefan Hajnoczi wrote:
On Thu, Apr 18, 2013 at 03:31:55PM +0400, Sergey Fedorov wrote:
Network hub should always receive incoming packets. Then forward them to
the appropriate port queue and let the qemu_send_packet() do the right
things. If the destination queue cannot receive the packet it will be
appended to the queue. When the receiver call
qemu_flush_queued_packets() later the queue will be really flushed and
no packets will be stalled in the sender network queue.

Signed-off-by: Sergey Fedorov <address@hidden>
---
  net/hub.c |   20 --------------------
  1 file changed, 20 deletions(-)
What is the point of this change?  There is no semantic difference for
well-behaved net clients.

Does it fix a bug, if so, please include details?

Stefan



Yes, this fixes a bug. There were packet stalls when using user-mode networking with USB network device. slirp_output() calls qemu_send_packet() which eventually calls qemu_net_queue_send(). qemu_net_queue_send() calls qemu_can_send_packet(), which calls can_receive() callback of network hub. Then net_hub_port_can_receive() also calls qemu_can_send_packet() for each port except packet source port.

Sometimes USB network device is not able to receive packet and qemu_can_send_packet() returns false. In my case there is no more ports and net_hub_port_can_receive() returns false. So qemu_net_queue_send() call qemu_net_queue_append() instead of qemu_net_queue_deliver(). qemu_net_queue_append() appends the packet to the receiving port of the network hub which is not flushed when USB netork device calls qemu_flush_queued_packets(). It is flushed only when slirp resend the packet by timeout.

Actually there is no need in net_hub_port_can_receive() as the network hub can always receive packets and pass it to its port network clients with qemu_send_packet(). And if the destination port network client cannot receive the packet it will be queued in the *destination* port network client queue. Queued packets from that queue will be delivered as soon as the network client call qemu_flush_queued_packets().

--
Best regards,
Sergey Fedorov, Junior Software Engineer,
Samsung R&D Institute Rus.
E-mail: address@hidden




reply via email to

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