[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add def
From: |
Wen Congyang |
Subject: |
Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev |
Date: |
Thu, 3 Dec 2015 14:25:53 +0800 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 |
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=hn0,queues=1,vhost=on: Vhost is not supported
Thanks
Wen Congyang
>
>> Thanks
>> Wen Congyang
>>
>>>
>>> Signed-off-by: zhanghailiang <address@hidden>
>>> Cc: Jason Wang <address@hidden>
>>> Cc: Yang Hongyang <address@hidden>
>>> ---
>>> 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 = 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 = FILTER_BUFFER(nf);
>>> + char *path = 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 = qemu_new_net_queue(qemu_netfilter_pass_to_next,
>>> nf);
>>> + s->is_default = !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 = NULL;
>>> + QDict *qdict;
>>> + void *dummy = NULL;
>>> + const char *id = "nop";
>>> + char *queue = g_strdup(NetFilterDirection_lookup[direction]);
>>> + NetClientState *nc = qemu_find_netdev(netdev_id);
>>> + Error *err = NULL;
>>> +
>>> + /* FIXME: Not support multiple queues */
>>> + if (!nc || nc->queue_index > 1) {
>>> + return;
>>> + }
>>> + qov = qmp_output_visitor_new();
>>> + ov = 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 = qmp_output_get_qobject(qov);
>>> + g_assert(obj != NULL);
>>> + qdict = qobject_to_qdict(obj);
>>> + qmp_output_visitor_cleanup(qov);
>>> +
>>> + qiv = qmp_input_visitor_new(obj);
>>> + iv = 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 = object;
>>> +
>>> + netdev_add_default_filter_buffer(netdev->id,
>>> + NET_FILTER_DIRECTION_RX,
>>> + errp);
>>> + }
>>> return 0;
>>> }
>>>
>>>
>>
>>
>>
>>
>> .
>>
>
>
>
>
> .
>
- Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev, Hailiang Zhang, 2015/12/01
- Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev, Wen Congyang, 2015/12/02
- Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev, Hailiang Zhang, 2015/12/02
- Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev,
Wen Congyang <=
- Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev, Hailiang Zhang, 2015/12/03
- Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev, Yang Hongyang, 2015/12/03
- Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev, Hailiang Zhang, 2015/12/03
- Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev, Hailiang Zhang, 2015/12/07
- Re: [Qemu-devel] [PATCH COLO-Frame v11 34/39] net/filter-buffer: Add default filter-buffer for each netdev, Yang Hongyang, 2015/12/07