From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45442) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aPx2L-00024w-2j for qemu-devel@nongnu.org; Sun, 31 Jan 2016 13:47:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aPx2H-0006H1-Qe for qemu-devel@nongnu.org; Sun, 31 Jan 2016 13:47:49 -0500 Received: from mx1.redhat.com ([209.132.183.28]:37350) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aPx2H-0006GS-KP for qemu-devel@nongnu.org; Sun, 31 Jan 2016 13:47:45 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 2882FE1B62 for ; Sun, 31 Jan 2016 18:47:45 +0000 (UTC) Date: Sun, 31 Jan 2016 20:47:40 +0200 From: "Michael S. Tsirkin" Message-ID: <20160131204728-mutt-send-email-mst@redhat.com> References: <1454264009-24094-1-git-send-email-wexu@redhat.com> <1454264009-24094-3-git-send-email-wexu@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1454264009-24094-3-git-send-email-wexu@redhat.com> Subject: Re: [Qemu-devel] [RFC Patch v2 02/10] virtio-net rsc: Initilize & Cleanup List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: wexu@redhat.com Cc: Wei Xu , victork@redhat.com, jasowang@redhat.com, yvugenfi@redhat.com, qemu-devel@nongnu.org, marcel@redhat.com, dfleytma@redhat.com On Mon, Feb 01, 2016 at 02:13:21AM +0800, wexu@redhat.com wrote: > From: Wei Xu > > The chain list is initialized when the device is getting realized, > and the entry of the chain will be inserted dynamically according > to protocol type of the network traffic. > > All the buffered packets and chain will be destroyed when the > device is going to be unrealized. > > Signed-off-by: Wei Xu What happens during migration? > --- > hw/net/virtio-net.c | 22 ++++++++++++++++++++++ > include/hw/virtio/virtio-net.h | 1 + > 2 files changed, 23 insertions(+) > > diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c > index a877614..4e9458e 100644 > --- a/hw/net/virtio-net.c > +++ b/hw/net/virtio-net.c > @@ -1603,6 +1603,26 @@ static int virtio_net_load_device(VirtIODevice *vdev, QEMUFile *f, > return 0; > } > > + > +static void virtio_net_rsc_cleanup(VirtIONet *n) > +{ > + NetRscChain *chain, *rn_chain; > + NetRscSeg *seg, *rn_seg; > + > + QTAILQ_FOREACH_SAFE(chain, &n->rsc_chains, next, rn_chain) { > + QTAILQ_FOREACH_SAFE(seg, &chain->buffers, next, rn_seg) { > + QTAILQ_REMOVE(&chain->buffers, seg, next); > + g_free(seg->buf); > + g_free(seg); > + > + timer_del(chain->drain_timer); > + timer_free(chain->drain_timer); > + QTAILQ_REMOVE(&n->rsc_chains, chain, next); > + g_free(chain); > + } > + } > +} > + > static NetClientInfo net_virtio_info = { > .type = NET_CLIENT_OPTIONS_KIND_NIC, > .size = sizeof(NICState), > @@ -1732,6 +1752,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) > nc = qemu_get_queue(n->nic); > nc->rxfilter_notify_enabled = 1; > > + QTAILQ_INIT(&n->rsc_chains); > n->qdev = dev; > register_savevm(dev, "virtio-net", -1, VIRTIO_NET_VM_VERSION, > virtio_net_save, virtio_net_load, n); > @@ -1766,6 +1787,7 @@ static void virtio_net_device_unrealize(DeviceState *dev, Error **errp) > g_free(n->vqs); > qemu_del_nic(n->nic); > virtio_cleanup(vdev); > + virtio_net_rsc_cleanup(n); > } > > static void virtio_net_instance_init(Object *obj) > diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h > index f3cc25f..6ce8b93 100644 > --- a/include/hw/virtio/virtio-net.h > +++ b/include/hw/virtio/virtio-net.h > @@ -59,6 +59,7 @@ typedef struct VirtIONet { > VirtIONetQueue *vqs; > VirtQueue *ctrl_vq; > NICState *nic; > + QTAILQ_HEAD(, NetRscChain) rsc_chains; > uint32_t tx_timeout; > int32_t tx_burst; > uint32_t has_vnet_hdr; > -- > 2.4.0