qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] tap networking - how?


From: Max Filippov
Subject: Re: [Qemu-devel] tap networking - how?
Date: Thu, 13 Feb 2014 12:40:55 +0400

Hi,

On Thu, Feb 13, 2014 at 11:34 AM, Alexey Kardashevskiy <address@hidden> wrote:
> Hi!
>
> I am debugging spapr-vlan and hit the following issue.
>
> When I run QEMU as below, the kernel's DHCP client does not continue till I
> hit any key in console. If I replace spapr-vlan with
> e1000/rtl8139/virtio-net, everything is just fine. If I use "user" network
> - everything is fine too. So the problem is with combination of spapr-vlan
> + tap.
>
> The issue looks like - the guest kernel boots and then prints:
> Sending DHCP requests ..
> and it keeps printing dots till I press key or timeout expires. tcpdump
> (running on the tap interface) shows one DHCP request and one DHCP response.
>
> What normally happens is that QEMU calls os_host_main_loop_wait() which
> calls qemu_poll_ns() and it is sitting there till eventfd signals.
> This eventfd is registered via qemu_init_main_loop() -> aio_context_new()
> -> aio_set_event_notifier() but I cannot find where it gets passed to the
> kernel (otherwise why would we need eventfd?).  When eventfd signals, QEMU
> calls qemu_iohandler_poll() which checks if TAP device has something to
> read and eventually calls tap_send().
>
> However in my bad example QEMU does not exit qemu_poll_ns() on eventfd,
> only on stdin event.
>
> I can see AIO eventfd created and event_notifier_test_and_clear() is called
> on it before the kernel starts using spapr-vlan.
>
> So. h_send_logical_lan() is called to sent a DHCP request packet. Now I
> expect eventfd to signal but this does not happen. Have I missed some reset
> or notification request or "bottom half" (virtio-net uses them but
> e1000/rtl8139 do not)?

Sounds pretty much like the problem I had recently with opencores
10/100 MAC: https://lists.gnu.org/archive/html/qemu-devel/2014-02/msg00073.html

Does the following help?:

diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
index 1bd6f50..2436b5e 100644
--- a/hw/net/spapr_llan.c
+++ b/hw/net/spapr_llan.c
@@ -404,6 +404,7 @@ static target_ulong
h_add_logical_lan_buffer(PowerPCCPU *cpu,
     vio_stq(sdev, dev->buf_list + dev->add_buf_ptr, buf);

     dev->rx_bufs++;
+    qemu_flush_queued_packets(qemu_get_queue(dev->nic));

     DPRINTF("h_add_logical_lan_buffer():  Added buf  ptr=%d  rx_bufs=%d"
             " bd=0x%016llx\n", dev->add_buf_ptr, dev->rx_bufs,


-- 
Thanks.
-- Max



reply via email to

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