From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37114) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4OCz-0003eA-AQ for qemu-devel@nongnu.org; Thu, 03 Dec 2015 02:21:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a4OCv-00089T-MH for qemu-devel@nongnu.org; Thu, 03 Dec 2015 02:21:41 -0500 Received: from mr213138.mail.yeah.net ([223.252.213.138]:52590) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4OCu-00088x-Mb for qemu-devel@nongnu.org; Thu, 03 Dec 2015 02:21:37 -0500 References: <1448357149-17572-1-git-send-email-zhang.zhanghailiang@huawei.com> <1448357149-17572-35-git-send-email-zhang.zhanghailiang@huawei.com> <565F9836.7070106@cn.fujitsu.com> <565FBCBD.2040101@huawei.com> <565FE071.9090102@cn.fujitsu.com> <565FE5CE.2000008@huawei.com> From: Yang Hongyang Message-ID: <565FED77.4000803@easystack.cn> Date: Thu, 3 Dec 2015 15:21:27 +0800 MIME-Version: 1.0 In-Reply-To: <565FE5CE.2000008@huawei.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Hailiang Zhang , Wen Congyang , qemu-devel@nongnu.org Cc: lizhijian@cn.fujitsu.com, quintela@redhat.com, Jason Wang , 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 On 2015=E5=B9=B412=E6=9C=8803=E6=97=A5 14:48, Hailiang Zhang wrote: > On 2015/12/3 14:25, Wen Congyang wrote: >> On 12/03/2015 11:53 AM, Hailiang Zhang wrote: >>> On 2015/12/3 9:17, Wen Congyang wrote: >>>> On 11/24/2015 05:25 PM, zhanghailiang wrote: >>>>> We add each netdev a default filter-buffer, which will be used for >>>>> COLO >>>>> or Micro-checkpoint to buffer VM's packets. The name of default >>>>> filter-buffer >>>>> is 'nop'. >>>>> For the default filter-buffer, it will not buffer any packets in >>>>> default. >>>>> So it has no side effect for the netdev. >>>> >>>> No, filter-buffer doesn't support vhost, so if you add default >>>> filter-buffer >>>> for each netdev, you can't use vhost. >>>> >>> >>> Have you tested it ? Did the default filter-buffer break vhost ? >>> It's not supposed to break vhost, I will look into it. Thanks. >> >> Yes, I have tested it. When I want to start a normal vm with vhost, I = get >> the following error messages: >> >> qemu-system-x86_64: -netdev tap,id=3Dhn0,queues=3D1,vhost=3Don: Vhost = is not >> supported >> > > Hmm, that is reported by filter in nextfilter_complete(), i will > investigate it. > We hope the default buffer filter has no side effect on netdev. I think you'd better add an option to netdev to turn on/off default filter, that will solve the problem. > > Thanks, > Hailiang > >>> >>>> Thanks >>>> Wen Congyang >>>> >>>>> >>>>> Signed-off-by: zhanghailiang >>>>> Cc: Jason Wang >>>>> Cc: Yang Hongyang >>>>> --- >>>>> v11: >>>>> - New patch >>>>> --- >>>>> include/net/filter.h | 3 +++ >>>>> net/filter-buffer.c | 74 >>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++ >>>>> net/net.c | 8 ++++++ >>>>> 3 files changed, 85 insertions(+) >>>>> >>>>> diff --git a/include/net/filter.h b/include/net/filter.h >>>>> index 2deda36..01a7e90 100644 >>>>> --- a/include/net/filter.h >>>>> +++ b/include/net/filter.h >>>>> @@ -74,4 +74,7 @@ ssize_t >>>>> qemu_netfilter_pass_to_next(NetClientState *sender, >>>>> int iovcnt, >>>>> void *opaque); >>>>> >>>>> +void netdev_add_default_filter_buffer(const char *netdev_id, >>>>> + NetFilterDirection direction= , >>>>> + Error **errp); >>>>> #endif /* QEMU_NET_FILTER_H */ >>>>> diff --git a/net/filter-buffer.c b/net/filter-buffer.c >>>>> index 57be149..195af68 100644 >>>>> --- a/net/filter-buffer.c >>>>> +++ b/net/filter-buffer.c >>>>> @@ -14,6 +14,12 @@ >>>>> #include "qapi/qmp/qerror.h" >>>>> #include "qapi-visit.h" >>>>> #include "qom/object.h" >>>>> +#include "net/net.h" >>>>> +#include "qapi/qmp/qdict.h" >>>>> +#include "qapi/qmp-output-visitor.h" >>>>> +#include "qapi/qmp-input-visitor.h" >>>>> +#include "monitor/monitor.h" >>>>> +#include "qmp-commands.h" >>>>> >>>>> #define TYPE_FILTER_BUFFER "filter-buffer" >>>>> >>>>> @@ -26,6 +32,8 @@ typedef struct FilterBufferState { >>>>> NetQueue *incoming_queue; >>>>> uint32_t interval; >>>>> QEMUTimer release_timer; >>>>> + bool is_default; >>>>> + bool enable_buffer; >>>>> } FilterBufferState; >>>>> >>>>> static void filter_buffer_flush(NetFilterState *nf) >>>>> @@ -65,6 +73,10 @@ static ssize_t >>>>> filter_buffer_receive_iov(NetFilterState *nf, >>>>> { >>>>> FilterBufferState *s =3D FILTER_BUFFER(nf); >>>>> >>>>> + /* Don't buffer any packets if the filter is not enabled */ >>>>> + if (!s->enable_buffer) { >>>>> + return 0; >>>>> + } >>>>> /* >>>>> * We return size when buffer a packet, the sender will take >>>>> it as >>>>> * a already sent packet, so sent_cb should not be called >>>>> later. >>>>> @@ -102,6 +114,7 @@ static void >>>>> filter_buffer_cleanup(NetFilterState *nf) >>>>> static void filter_buffer_setup(NetFilterState *nf, Error **errp= ) >>>>> { >>>>> FilterBufferState *s =3D FILTER_BUFFER(nf); >>>>> + char *path =3D object_get_canonical_path_component(OBJECT(nf))= ; >>>>> >>>>> /* >>>>> * We may want to accept zero interval when VM FT solutions >>>>> like MC >>>>> @@ -114,6 +127,7 @@ static void filter_buffer_setup(NetFilterState >>>>> *nf, Error **errp) >>>>> } >>>>> >>>>> s->incoming_queue =3D >>>>> qemu_new_net_queue(qemu_netfilter_pass_to_next, nf); >>>>> + s->is_default =3D !strcmp(path, "nop"); >>>>> if (s->interval) { >>>>> timer_init_us(&s->release_timer, QEMU_CLOCK_VIRTUAL, >>>>> filter_buffer_release_timer, nf); >>>>> @@ -163,6 +177,66 @@ out: >>>>> error_propagate(errp, local_err); >>>>> } >>>>> >>>>> +/* >>>>> +* 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 >>>>> +* buffer filter for each netdev. The name of default buffer filter= is >>>>> +* 'nop' >>>>> +*/ >>>>> +void netdev_add_default_filter_buffer(const char *netdev_id, >>>>> + NetFilterDirection direction= , >>>>> + Error **errp) >>>>> +{ >>>>> + QmpOutputVisitor *qov; >>>>> + QmpInputVisitor *qiv; >>>>> + Visitor *ov, *iv; >>>>> + QObject *obj =3D NULL; >>>>> + QDict *qdict; >>>>> + void *dummy =3D NULL; >>>>> + const char *id =3D "nop"; >>>>> + char *queue =3D g_strdup(NetFilterDirection_lookup[direction])= ; >>>>> + NetClientState *nc =3D qemu_find_netdev(netdev_id); >>>>> + Error *err =3D NULL; >>>>> + >>>>> + /* FIXME: Not support multiple queues */ >>>>> + if (!nc || nc->queue_index > 1) { >>>>> + return; >>>>> + } >>>>> + qov =3D qmp_output_visitor_new(); >>>>> + ov =3D qmp_output_get_visitor(qov); >>>>> + visit_start_struct(ov, &dummy, NULL, NULL, 0, &err); >>>>> + if (err) { >>>>> + goto out; >>>>> + } >>>>> + visit_type_str(ov, &nc->name, "netdev", &err); >>>>> + if (err) { >>>>> + goto out; >>>>> + } >>>>> + visit_type_str(ov, &queue, "queue", &err); >>>>> + if (err) { >>>>> + goto out; >>>>> + } >>>>> + visit_end_struct(ov, &err); >>>>> + if (err) { >>>>> + goto out; >>>>> + } >>>>> + obj =3D qmp_output_get_qobject(qov); >>>>> + g_assert(obj !=3D NULL); >>>>> + qdict =3D qobject_to_qdict(obj); >>>>> + qmp_output_visitor_cleanup(qov); >>>>> + >>>>> + qiv =3D qmp_input_visitor_new(obj); >>>>> + iv =3D qmp_input_get_visitor(qiv); >>>>> + object_add(TYPE_FILTER_BUFFER, id, qdict, iv, &err); >>>>> + qmp_input_visitor_cleanup(qiv); >>>>> + qobject_decref(obj); >>>>> +out: >>>>> + g_free(queue); >>>>> + if (err) { >>>>> + error_propagate(errp, err); >>>>> + } >>>>> +} >>>>> + >>>>> static void filter_buffer_init(Object *obj) >>>>> { >>>>> object_property_add(obj, "interval", "int", >>>>> diff --git a/net/net.c b/net/net.c >>>>> index ade6051..b36d49f 100644 >>>>> --- a/net/net.c >>>>> +++ b/net/net.c >>>>> @@ -1028,6 +1028,14 @@ static int net_client_init1(const void >>>>> *object, int is_netdev, Error **errp) >>>>> } >>>>> return -1; >>>>> } >>>>> + >>>>> + if (is_netdev) { >>>>> + const Netdev *netdev =3D object; >>>>> + >>>>> + netdev_add_default_filter_buffer(netdev->id, >>>>> + NET_FILTER_DIRECTION_RX, >>>>> + errp); >>>>> + } >>>>> return 0; >>>>> } >>>>> >>>>> >>>> >>>> >>>> >>>> >>>> . >>>> >>> >>> >>> >>> >>> . >>> >> >> >> >> >> . >> > > > --=20 Thanks, Yang