On Tue, 05/19 15:48, Stefan Hajnoczi wrote:
> On Tue, May 19, 2015 at 10:51:00AM +0000, Fam Zheng wrote:
> > This callback is called by main loop before polling s->fd, if it returns
> > false, the fd will not be polled in this iteration.
> > 
> > This is redundant with checks inside read callback. After this patch,
> > the data will be copied from s->fd to s->msgvec when it arrives. If the
> > device can't receive, it will be queued to incoming_queue, and when the
> > device status changes, this queue will be flushed.
> 
> This doesn't work because s->msgvec can fill up when
> qemu_can_send_packet() returns false.  At that point we burn 100% CPU
> because the file descriptor is still being monitored.

If qemu_can_send_packet returns false, we do stop monitoring the fd. In
net_l2tpv3_process_queue:

    size = qemu_send_packet_async(
            &s->nc,
            vec->iov_base,
            data_size,
            l2tpv3_send_completed
        );
    if (size == 0) {
        l2tpv3_read_poll(s, false);
    }

The packet is queued and size is 0, so the read poll will be disabled until
it's flushed.

What am I missing?

Fam

Reply via email to