qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 2/2] net: Track netdevs in NetClientState rather than Qemu


From: Markus Armbruster
Subject: Re: [PATCH v2 2/2] net: Track netdevs in NetClientState rather than QemuOpt
Date: Tue, 17 Mar 2020 21:35:56 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux)

Eric Blake <address@hidden> writes:

> As mentioned in the previous patch, our use of QemuOpt group "netdev"
> has two purposes: collect the CLI arguments, and serve as a witness
> for monitor hotplug actions.  As the latter didn't use anything but an
> id, it felt rather unclean to have to touch QemuOpts at all when going
> through QMP, so let's instead track things with a bool field in
> NetClientState.
>
> Suggested-by: Markus Armbruster <address@hidden>
> Signed-off-by: Eric Blake <address@hidden>
> ---
>  include/net/net.h |  1 +
>  monitor/misc.c    |  4 +---
>  net/net.c         | 37 +++++++++++--------------------------
>  3 files changed, 13 insertions(+), 29 deletions(-)
>
> diff --git a/include/net/net.h b/include/net/net.h
> index 96e6eae8176e..094e966af9ec 100644
> --- a/include/net/net.h
> +++ b/include/net/net.h
> @@ -98,6 +98,7 @@ struct NetClientState {
>      unsigned rxfilter_notify_enabled:1;
>      int vring_enable;
>      int vnet_hdr_len;
> +    bool is_netdev;
>      QTAILQ_HEAD(, NetFilterState) filters;
>  };
>
> diff --git a/monitor/misc.c b/monitor/misc.c
> index 41a86e7012a1..6c45fa490ff5 100644
> --- a/monitor/misc.c
> +++ b/monitor/misc.c
> @@ -2035,13 +2035,11 @@ void netdev_del_completion(ReadLineState *rs, int 
> nb_args, const char *str)
>      count = qemu_find_net_clients_except(NULL, ncs, NET_CLIENT_DRIVER_NIC,
>                                           MAX_QUEUE_NUM);
>      for (i = 0; i < MIN(count, MAX_QUEUE_NUM); i++) {
> -        QemuOpts *opts;
>          const char *name = ncs[i]->name;
>          if (strncmp(str, name, len)) {
>              continue;
>          }
> -        opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), name);
> -        if (opts) {
> +        if (ncs[i]->is_netdev) {
>              readline_add_completion(rs, name);
>          }
>      }
> diff --git a/net/net.c b/net/net.c
> index a2065aabede2..38778e831da2 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -1060,6 +1060,15 @@ static int net_client_init1(const void *object, bool 
> is_netdev, Error **errp)
>          }
>          return -1;
>      }
> +
> +    if (is_netdev) {
> +        NetClientState *nc;
> +
> +        nc = qemu_find_netdev(netdev->id);
> +        assert(nc);
> +        nc->is_netdev = true;
> +    }
> +
>      return 0;
>  }
>

Would be simpler if net_client_init_fun[]() returned the NetClientState.
But that's clearly more than we can get done today.

> @@ -1172,34 +1181,12 @@ void netdev_add(QemuOpts *opts, Error **errp)
>
>  void qmp_netdev_add(Netdev *netdev, Error **errp)
>  {
> -    Error *local_err = NULL;
> -    QemuOptsList *opts_list;
> -    QemuOpts *opts;
> -
> -    opts_list = qemu_find_opts_err("netdev", &local_err);
> -    if (local_err) {
> -        goto out;
> -    }
> -
> -    opts = qemu_opts_create(opts_list, netdev->id, 1, &local_err);
> -    if (local_err) {
> -        goto out;
> -    }
> -
> -    net_client_init1(netdev, true, &local_err);
> -    if (local_err) {
> -        qemu_opts_del(opts);
> -        goto out;
> -    }
> -
> -out:
> -    error_propagate(errp, local_err);
> +    net_client_init1(netdev, true, errp);
>  }

Nice!

>
>  void qmp_netdev_del(const char *id, Error **errp)
>  {
>      NetClientState *nc;
> -    QemuOpts *opts;
>
>      nc = qemu_find_netdev(id);
>      if (!nc) {
> @@ -1208,14 +1195,12 @@ void qmp_netdev_del(const char *id, Error **errp)
>          return;
>      }
>
> -    opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), id);
> -    if (!opts) {
> +    if (!nc->is_netdev) {
>          error_setg(errp, "Device '%s' is not a netdev", id);
>          return;
>      }
>
>      qemu_del_net_client(nc);
> -    qemu_opts_del(opts);
>  }
>
>  static void netfilter_print_info(Monitor *mon, NetFilterState *nf)

Reviewed-by: Markus Armbruster <address@hidden>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]