[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH COLO-Frame v13 36/39] filter-buffer: Introduce a
From: |
Jason Wang |
Subject: |
Re: [Qemu-devel] [PATCH COLO-Frame v13 36/39] filter-buffer: Introduce a helper function to enable/disable default filter |
Date: |
Tue, 19 Jan 2016 11:35:10 +0800 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 |
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 <address@hidden>
> Cc: Jason Wang <address@hidden>
> Cc: Yang Hongyang <address@hidden>
> ---
> 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.
> +
> /*
> * 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.
> + 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.
> +
> static void qemu_net_client_destructor(NetClientState *nc)
> {
> g_free(nc);
- Re: [Qemu-devel] [PATCH COLO-Frame v13 36/39] filter-buffer: Introduce a helper function to enable/disable default filter,
Jason Wang <=