From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49387) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XJB5s-0003wC-TY for qemu-devel@nongnu.org; Sun, 17 Aug 2014 20:46:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XJB5o-0000cg-2e for qemu-devel@nongnu.org; Sun, 17 Aug 2014 20:46:40 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:16976) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XJB5n-0000bh-8z for qemu-devel@nongnu.org; Sun, 17 Aug 2014 20:46:35 -0400 Message-ID: <53F14CC1.5080608@huawei.com> Date: Mon, 18 Aug 2014 08:45:53 +0800 From: zhanghailiang MIME-Version: 1.0 References: <1407996838-10212-1-git-send-email-zhang.zhanghailiang@huawei.com> <1407996838-10212-3-git-send-email-zhang.zhanghailiang@huawei.com> <20140814100515.GC30944@redhat.com> In-Reply-To: <20140814100515.GC30944@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 2/3] net: Flush queues when runstate changes back to running List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Michael S. Tsirkin" Cc: peter.maydell@linaro.org, aliguori@amazon.com, luonengjun@huawei.com, peter.huangpeng@huawei.com, qemu-devel@nongnu.org, stefanha@redhat.com, akong@redhat.com On 2014/8/14 18:05, Michael S. Tsirkin wrote: > On Thu, Aug 14, 2014 at 02:13:57PM +0800, zhanghailiang wrote: >> When the runstate changes back to running, we definitely need to flush >> queues to get packets flowing again. >> >> Here we implement this in the net layer: >> (1) add a member 'VMChangeStateEntry *vmstate' to struct NICState, >> Which will listen for VM runstate changes. >> (2) Register a handler function for VMstate change. >> When vm changes back to running, we flush all queues in the callback function. > > OK but smash this together with patch 1, otherwise > after patch 1 things are broken, which breaks > git bisect. > Hmm, i will put them together into one patch. Thanks for your reviewing. >> Signed-off-by: zhanghailiang >> --- >> include/net/net.h | 1 + >> net/net.c | 26 ++++++++++++++++++++++++++ >> 2 files changed, 27 insertions(+) >> >> diff --git a/include/net/net.h b/include/net/net.h >> index 312f728..a294277 100644 >> --- a/include/net/net.h >> +++ b/include/net/net.h >> @@ -97,6 +97,7 @@ typedef struct NICState { >> NICConf *conf; >> void *opaque; >> bool peer_deleted; >> + VMChangeStateEntry *vmstate; >> } NICState; >> >> NetClientState *qemu_find_netdev(const char *id); >> diff --git a/net/net.c b/net/net.c >> index 5bb2821..506e58f 100644 >> --- a/net/net.c >> +++ b/net/net.c >> @@ -242,6 +242,29 @@ NetClientState *qemu_new_net_client(NetClientInfo *info, >> return nc; >> } >> >> +static void nic_vmstate_change_handler(void *opaque, >> + int running, >> + RunState state) >> +{ >> + NICState *nic = opaque; >> + NetClientState *nc; >> + int i, queues; >> + >> + if (!running) { >> + return; >> + } >> + >> + queues = MAX(1, nic->conf->peers.queues); >> + for (i = 0; i< queues; i++) { >> + nc =&nic->ncs[i]; >> + if (nc->receive_disabled >> + || (nc->info->can_receive&& !nc->info->can_receive(nc))) { >> + continue; >> + } >> + qemu_flush_queued_packets(nc); >> + } >> +} >> + >> NICState *qemu_new_nic(NetClientInfo *info, >> NICConf *conf, >> const char *model, >> @@ -259,6 +282,8 @@ NICState *qemu_new_nic(NetClientInfo *info, >> nic->ncs = (void *)nic + info->size; >> nic->conf = conf; >> nic->opaque = opaque; >> + nic->vmstate = qemu_add_vm_change_state_handler(nic_vmstate_change_handler, >> + nic); >> >> for (i = 0; i< queues; i++) { >> qemu_net_client_setup(&nic->ncs[i], info, peers[i], model, name, >> @@ -379,6 +404,7 @@ void qemu_del_nic(NICState *nic) >> qemu_free_net_client(nc); >> } >> >> + qemu_del_vm_change_state_handler(nic->vmstate); >> g_free(nic); >> } >> >> -- >> 1.7.12.4 >> > > . >