From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47242) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aLRtq-0001x1-Gy for qemu-devel@nongnu.org; Tue, 19 Jan 2016 03:44:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aLRtn-0003RO-9F for qemu-devel@nongnu.org; Tue, 19 Jan 2016 03:44:26 -0500 Received: from szxga02-in.huawei.com ([119.145.14.65]:1769) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aLRtm-0003Qn-MR for qemu-devel@nongnu.org; Tue, 19 Jan 2016 03:44:23 -0500 References: <1451372975-5048-1-git-send-email-zhang.zhanghailiang@huawei.com> <1451372975-5048-37-git-send-email-zhang.zhanghailiang@huawei.com> <569DAEEE.8030909@redhat.com> From: Hailiang Zhang Message-ID: <569DF754.3000909@huawei.com> Date: Tue, 19 Jan 2016 16:44:04 +0800 MIME-Version: 1.0 In-Reply-To: <569DAEEE.8030909@redhat.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH COLO-Frame v13 36/39] filter-buffer: Introduce a helper function to enable/disable default filter List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jason Wang , qemu-devel@nongnu.org Cc: xiecl.fnst@cn.fujitsu.com, zhangchen.fnst@cn.fujitsu.com, lizhijian@cn.fujitsu.com, quintela@redhat.com, yunhong.jiang@intel.com, eddie.dong@intel.com, peter.huangpeng@huawei.com, dgilbert@redhat.com, arei.gonglei@huawei.com, stefanha@redhat.com, amit.shah@redhat.com, hongyang.yang@easystack.cn On 2016/1/19 11:35, Jason Wang wrote: > > > On 12/29/2015 03:09 PM, zhanghailiang wrote: >> The default buffer filter doesn't buffer packets in default, >> but we need to buffer packets for COLO or Micro-checkpoint, >> Here we add a helper function to enable/disable filter's buffer >> capability. >> >> Signed-off-by: zhanghailiang >> Cc: Jason Wang >> Cc: Yang Hongyang >> --- >> v12: >> - Rename the heler function to qemu_set_default_filters_status() >> v11: >> - New patch >> --- >> include/net/filter.h | 1 + >> include/net/net.h | 4 ++++ >> net/filter-buffer.c | 19 +++++++++++++++++++ >> net/net.c | 29 +++++++++++++++++++++++++++++ >> 4 files changed, 53 insertions(+) >> >> diff --git a/include/net/filter.h b/include/net/filter.h >> index 40aa38c..08aa604 100644 >> --- a/include/net/filter.h >> +++ b/include/net/filter.h >> @@ -84,4 +84,5 @@ static inline bool qemu_need_skip_netfilter(NetFilterState *nf) >> void netdev_add_default_filter_buffer(const char *netdev_id, >> NetFilterDirection direction, >> Error **errp); >> +void qemu_set_default_filters_status(bool enable); >> #endif /* QEMU_NET_FILTER_H */ >> diff --git a/include/net/net.h b/include/net/net.h >> index 7af3e15..5c65c45 100644 >> --- a/include/net/net.h >> +++ b/include/net/net.h >> @@ -125,6 +125,10 @@ NetClientState *qemu_find_vlan_client_by_name(Monitor *mon, int vlan_id, >> const char *client_str); >> typedef void (*qemu_nic_foreach)(NICState *nic, void *opaque); >> void qemu_foreach_nic(qemu_nic_foreach func, void *opaque); >> +typedef void (*qemu_netfilter_foreach)(NetFilterState *nf, void *opaque, >> + Error **errp); >> +void qemu_foreach_netfilter(qemu_netfilter_foreach func, void *opaque, >> + Error **errp); >> int qemu_can_send_packet(NetClientState *nc); >> ssize_t qemu_sendv_packet(NetClientState *nc, const struct iovec *iov, >> int iovcnt); >> diff --git a/net/filter-buffer.c b/net/filter-buffer.c >> index 8abac94..90a50cc 100644 >> --- a/net/filter-buffer.c >> +++ b/net/filter-buffer.c >> @@ -169,6 +169,25 @@ out: >> error_propagate(errp, local_err); >> } >> >> +static void set_default_filter_status(NetFilterState *nf, >> + void *opaque, >> + Error **errp) >> +{ >> + if (!strcmp(object_get_typename(OBJECT(nf)), TYPE_FILTER_BUFFER)) { >> + bool *status = opaque; >> + >> + if (nf->is_default) { >> + nf->enabled = *status; >> + } >> + } >> +} >> + >> +void qemu_set_default_filters_status(bool enable) >> +{ >> + qemu_foreach_netfilter(set_default_filter_status, >> + &enable, NULL); >> +} > > The name of the function sounds a generic helper but it in fact pass a > type specific function. Consider enable is a generic property of > netfilter, we want a more generic code here. > Got it, i will fix it. >> + >> /* >> * This will be used by COLO or MC FT, for which they will need >> * to buffer the packets of VM's net devices, Here we add a default >> diff --git a/net/net.c b/net/net.c >> index fd53cfc..30946c5 100644 >> --- a/net/net.c >> +++ b/net/net.c >> @@ -259,6 +259,35 @@ static char *assign_name(NetClientState *nc1, const char *model) >> return g_strdup_printf("%s.%d", model, id); >> } >> >> +void qemu_foreach_netfilter(qemu_netfilter_foreach func, void *opaque, >> + Error **errp) >> +{ >> + NetClientState *nc; >> + NetFilterState *nf; >> + >> + QTAILQ_FOREACH(nc, &net_clients, next) { >> + if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) { >> + continue; >> + } >> + /* FIXME: Not support multiqueue */ >> + if (nc->queue_index > 1) { >> + error_setg(errp, "%s: multiqueue is not supported", __func__); >> + return; >> + } > > Do we really need this? Looks like netfilter_complete() has already > checked this. > Yes, this is useless, i will remove it. >> + QTAILQ_FOREACH(nf, &nc->filters, next) { >> + if (func) { >> + Error *local_err = NULL; >> + >> + func(nf, opaque, &local_err); >> + if (local_err) { >> + error_propagate(errp, local_err); >> + return; >> + } >> + } >> + } >> + } >> +} > > Need a separate patch for this helper. > OK, i will split it in next version, thanks. >> + >> static void qemu_net_client_destructor(NetClientState *nc) >> { >> g_free(nc); > > > . >