From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38422) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aQApL-0001Cq-Py for qemu-devel@nongnu.org; Mon, 01 Feb 2016 04:31:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aQApI-0007O5-JJ for qemu-devel@nongnu.org; Mon, 01 Feb 2016 04:31:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36767) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aQApI-0007Ny-BV for qemu-devel@nongnu.org; Mon, 01 Feb 2016 04:31:16 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id EDA56E1B77 for ; Mon, 1 Feb 2016 09:31:15 +0000 (UTC) References: <1454264009-24094-1-git-send-email-wexu@redhat.com> <1454264009-24094-6-git-send-email-wexu@redhat.com> <56AEFB1D.70903@redhat.com> <56AF19BD.2030706@redhat.com> From: Jason Wang Message-ID: <56AF25D9.5020707@redhat.com> Date: Mon, 1 Feb 2016 17:31:05 +0800 MIME-Version: 1.0 In-Reply-To: <56AF19BD.2030706@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC Patch v2 05/10] virtio-net rsc: Create timer to drain the packets from the cache pool List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Wei Xu , qemu-devel@nongnu.org On 02/01/2016 04:39 PM, Wei Xu wrote: > On 02/01/2016 02:28 PM, Jason Wang wrote: >> >> On 02/01/2016 02:13 AM, wexu@redhat.com wrote: >>> From: Wei Xu >>> >>> The timer will only be triggered if the packets pool is not empty, >>> and it'll drain off all the cached packets, this is to reduce the >>> delay to upper layer protocol stack. >>> >>> Signed-off-by: Wei Xu >>> --- >>> hw/net/virtio-net.c | 38 ++++++++++++++++++++++++++++++++++++++ >>> 1 file changed, 38 insertions(+) >>> >>> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c >>> index 4f77fbe..93df0d5 100644 >>> --- a/hw/net/virtio-net.c >>> +++ b/hw/net/virtio-net.c >>> @@ -48,12 +48,17 @@ >>> #define MAX_VIRTIO_IP_PAYLOAD (65535 + IP_OFFSET) >>> +/* Purge coalesced packets timer interval */ >>> +#define RSC_TIMER_INTERVAL 500000 >> Any hints for choosing this as default value? Do we need a property for >> user to change this? > This is still under estimation, 300ms -500ms is a good value to adapt > the test, this should be configurable. >>> + >>> /* Global statistics */ >>> static uint32_t rsc_chain_no_mem; >>> /* Switcher to enable/disable rsc */ >>> static bool virtio_net_rsc_bypass; >>> +static uint32_t rsc_timeout = RSC_TIMER_INTERVAL; >>> + >>> /* Coalesce callback for ipv4/6 */ >>> typedef int32_t (VirtioNetCoalesce) (NetRscChain *chain, NetRscSeg >>> *seg, >>> const uint8_t *buf, size_t >>> size); >>> @@ -1625,6 +1630,35 @@ static int >>> virtio_net_load_device(VirtIODevice *vdev, QEMUFile *f, >>> return 0; >>> } >>> +static void virtio_net_rsc_purge(void *opq) >>> +{ >>> + int ret = 0; >>> + NetRscChain *chain = (NetRscChain *)opq; >>> + NetRscSeg *seg, *rn; >>> + >>> + QTAILQ_FOREACH_SAFE(seg, &chain->buffers, next, rn) { >>> + if (!qemu_can_send_packet(seg->nc)) { >>> + /* Should quit or continue? not sure if one or some >>> + * of the queues fail would happen, try continue here */ >> This looks wrong, qemu_can_send_packet() is used for nc's peer not nc >> itself. > OK. >> >>> + continue; >>> + } >>> + >>> + ret = virtio_net_do_receive(seg->nc, seg->buf, seg->size); >>> + QTAILQ_REMOVE(&chain->buffers, seg, next); >>> + g_free(seg->buf); >>> + g_free(seg); >>> + >>> + if (ret == 0) { >>> + /* Try next queue */ >> Try next seg? > Yes, it's seg. >> >>> + continue; >>> + } >> Why need above? > yes, it's optional, my maybe can help if there are extra codes after > this, will remove this. >> >>> + } >>> + >>> + if (!QTAILQ_EMPTY(&chain->buffers)) { >>> + timer_mod(chain->drain_timer, >>> + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + >>> rsc_timeout); >> Need stop/start the timer during vm stop/start to save cpu. > Thanks, do you know where should i add the code? You may want to look at the vmstate change handler in virtio-net.c.