From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Zhao Liu <zhao1.liu@intel.com>
Cc: "Daniel P . Berrangé" <berrange@redhat.com>,
"Igor Mammedov" <imammedo@redhat.com>,
"Eduardo Habkost" <eduardo@habkost.net>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Michael S . Tsirkin" <mst@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Sergio Lopez" <slp@redhat.com>,
"Jason Wang" <jasowang@redhat.com>,
"Stefano Stabellini" <sstabellini@kernel.org>,
"Anthony PERARD" <anthony@xenproject.org>,
"Paul Durrant" <paul@xen.org>,
"Edgar E . Iglesias" <edgar.iglesias@gmail.com>,
"Eric Blake" <eblake@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Peter Maydell" <peter.maydell@linaro.org>,
qemu-devel@nongnu.org, kvm@vger.kernel.org, qemu-arm@nongnu.org,
"Zhenyu Wang" <zhenyu.z.wang@intel.com>,
"Dapeng Mi" <dapeng1.mi@linux.intel.com>,
"Yongwei Ma" <yongwei.ma@intel.com>
Subject: Re: [RFC v2 01/12] qdev: Allow qdev_device_add() to add specific category device
Date: Tue, 8 Oct 2024 10:14:25 +0100 [thread overview]
Message-ID: <20241008101425.00003b90@Huawei.com> (raw)
In-Reply-To: <20240919061128.769139-2-zhao1.liu@intel.com>
On Thu, 19 Sep 2024 14:11:17 +0800
Zhao Liu <zhao1.liu@intel.com> wrote:
> Topology devices need to be created and realized before board
> initialization.
>
> Allow qdev_device_add() to specify category to help create topology
> devices early.
>
> Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
It's not immediately obvious what the category parameter is.
Can you use DeviceCategory rather than long?
> ---
> hw/net/virtio-net.c | 2 +-
> hw/usb/xen-usb.c | 3 ++-
> include/monitor/qdev.h | 4 ++--
> system/qdev-monitor.c | 12 ++++++++----
> system/vl.c | 4 ++--
> 5 files changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index fb84d142ee29..0d92e09e9076 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -935,7 +935,7 @@ static void failover_add_primary(VirtIONet *n, Error **errp)
> return;
> }
>
> - dev = qdev_device_add_from_qdict(n->primary_opts,
> + dev = qdev_device_add_from_qdict(n->primary_opts, NULL,
> n->primary_opts_from_json,
> &err);
> if (err) {
> diff --git a/hw/usb/xen-usb.c b/hw/usb/xen-usb.c
> index 13901625c0c8..e4168b1fec7e 100644
> --- a/hw/usb/xen-usb.c
> +++ b/hw/usb/xen-usb.c
> @@ -766,7 +766,8 @@ static void usbback_portid_add(struct usbback_info *usbif, unsigned port,
> qdict_put_str(qdict, "hostport", portname);
> opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict,
> &error_abort);
> - usbif->ports[port - 1].dev = USB_DEVICE(qdev_device_add(opts, &local_err));
> + usbif->ports[port - 1].dev = USB_DEVICE(
> + qdev_device_add(opts, NULL, &local_err));
> if (!usbif->ports[port - 1].dev) {
> qobject_unref(qdict);
> xen_pv_printf(&usbif->xendev, 0,
> diff --git a/include/monitor/qdev.h b/include/monitor/qdev.h
> index 1d57bf657794..f5fd6e6c1ffc 100644
> --- a/include/monitor/qdev.h
> +++ b/include/monitor/qdev.h
> @@ -8,8 +8,8 @@ void hmp_info_qdm(Monitor *mon, const QDict *qdict);
> void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp);
>
> int qdev_device_help(QemuOpts *opts);
> -DeviceState *qdev_device_add(QemuOpts *opts, Error **errp);
> -DeviceState *qdev_device_add_from_qdict(const QDict *opts,
> +DeviceState *qdev_device_add(QemuOpts *opts, long *category, Error **errp);
> +DeviceState *qdev_device_add_from_qdict(const QDict *opts, long *category,
> bool from_json, Error **errp);
>
> /**
> diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
> index 457dfd05115e..fe120353fedc 100644
> --- a/system/qdev-monitor.c
> +++ b/system/qdev-monitor.c
> @@ -632,7 +632,7 @@ const char *qdev_set_id(DeviceState *dev, char *id, Error **errp)
> return prop->name;
> }
>
> -DeviceState *qdev_device_add_from_qdict(const QDict *opts,
> +DeviceState *qdev_device_add_from_qdict(const QDict *opts, long *category,
> bool from_json, Error **errp)
> {
> ERRP_GUARD();
> @@ -655,6 +655,10 @@ DeviceState *qdev_device_add_from_qdict(const QDict *opts,
> return NULL;
> }
>
> + if (category && !test_bit(*category, dc->categories)) {
> + return NULL;
> + }
> +
> /* find bus */
> path = qdict_get_try_str(opts, "bus");
> if (path != NULL) {
> @@ -767,12 +771,12 @@ err_del_dev:
> }
>
> /* Takes ownership of @opts on success */
> -DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
> +DeviceState *qdev_device_add(QemuOpts *opts, long *category, Error **errp)
> {
> QDict *qdict = qemu_opts_to_qdict(opts, NULL);
> DeviceState *ret;
>
> - ret = qdev_device_add_from_qdict(qdict, false, errp);
> + ret = qdev_device_add_from_qdict(qdict, category, false, errp);
> if (ret) {
> qemu_opts_del(opts);
> }
> @@ -897,7 +901,7 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
> qemu_opts_del(opts);
> return;
> }
> - dev = qdev_device_add(opts, errp);
> + dev = qdev_device_add(opts, NULL, errp);
> if (!dev) {
> /*
> * Drain all pending RCU callbacks. This is done because
> diff --git a/system/vl.c b/system/vl.c
> index 193e7049ccbe..c40364e2f091 100644
> --- a/system/vl.c
> +++ b/system/vl.c
> @@ -1212,7 +1212,7 @@ static int device_init_func(void *opaque, QemuOpts *opts, Error **errp)
> {
> DeviceState *dev;
>
> - dev = qdev_device_add(opts, errp);
> + dev = qdev_device_add(opts, NULL, errp);
> if (!dev && *errp) {
> error_report_err(*errp);
> return -1;
> @@ -2665,7 +2665,7 @@ static void qemu_create_cli_devices(void)
> * from the start, so call qdev_device_add_from_qdict() directly for
> * now.
> */
> - dev = qdev_device_add_from_qdict(opt->opts, true, &error_fatal);
> + dev = qdev_device_add_from_qdict(opt->opts, NULL, true, &error_fatal);
> object_unref(OBJECT(dev));
> loc_pop(&opt->loc);
> }
WARNING: multiple messages have this Message-ID (diff)
From: Jonathan Cameron via <qemu-devel@nongnu.org>
To: Zhao Liu <zhao1.liu@intel.com>
Cc: "Daniel P . Berrangé" <berrange@redhat.com>,
"Igor Mammedov" <imammedo@redhat.com>,
"Eduardo Habkost" <eduardo@habkost.net>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Michael S . Tsirkin" <mst@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Sergio Lopez" <slp@redhat.com>,
"Jason Wang" <jasowang@redhat.com>,
"Stefano Stabellini" <sstabellini@kernel.org>,
"Anthony PERARD" <anthony@xenproject.org>,
"Paul Durrant" <paul@xen.org>,
"Edgar E . Iglesias" <edgar.iglesias@gmail.com>,
"Eric Blake" <eblake@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Peter Maydell" <peter.maydell@linaro.org>,
qemu-devel@nongnu.org, kvm@vger.kernel.org, qemu-arm@nongnu.org,
"Zhenyu Wang" <zhenyu.z.wang@intel.com>,
"Dapeng Mi" <dapeng1.mi@linux.intel.com>,
"Yongwei Ma" <yongwei.ma@intel.com>
Subject: Re: [RFC v2 01/12] qdev: Allow qdev_device_add() to add specific category device
Date: Tue, 8 Oct 2024 10:14:25 +0100 [thread overview]
Message-ID: <20241008101425.00003b90@Huawei.com> (raw)
In-Reply-To: <20240919061128.769139-2-zhao1.liu@intel.com>
On Thu, 19 Sep 2024 14:11:17 +0800
Zhao Liu <zhao1.liu@intel.com> wrote:
> Topology devices need to be created and realized before board
> initialization.
>
> Allow qdev_device_add() to specify category to help create topology
> devices early.
>
> Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
It's not immediately obvious what the category parameter is.
Can you use DeviceCategory rather than long?
> ---
> hw/net/virtio-net.c | 2 +-
> hw/usb/xen-usb.c | 3 ++-
> include/monitor/qdev.h | 4 ++--
> system/qdev-monitor.c | 12 ++++++++----
> system/vl.c | 4 ++--
> 5 files changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index fb84d142ee29..0d92e09e9076 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -935,7 +935,7 @@ static void failover_add_primary(VirtIONet *n, Error **errp)
> return;
> }
>
> - dev = qdev_device_add_from_qdict(n->primary_opts,
> + dev = qdev_device_add_from_qdict(n->primary_opts, NULL,
> n->primary_opts_from_json,
> &err);
> if (err) {
> diff --git a/hw/usb/xen-usb.c b/hw/usb/xen-usb.c
> index 13901625c0c8..e4168b1fec7e 100644
> --- a/hw/usb/xen-usb.c
> +++ b/hw/usb/xen-usb.c
> @@ -766,7 +766,8 @@ static void usbback_portid_add(struct usbback_info *usbif, unsigned port,
> qdict_put_str(qdict, "hostport", portname);
> opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict,
> &error_abort);
> - usbif->ports[port - 1].dev = USB_DEVICE(qdev_device_add(opts, &local_err));
> + usbif->ports[port - 1].dev = USB_DEVICE(
> + qdev_device_add(opts, NULL, &local_err));
> if (!usbif->ports[port - 1].dev) {
> qobject_unref(qdict);
> xen_pv_printf(&usbif->xendev, 0,
> diff --git a/include/monitor/qdev.h b/include/monitor/qdev.h
> index 1d57bf657794..f5fd6e6c1ffc 100644
> --- a/include/monitor/qdev.h
> +++ b/include/monitor/qdev.h
> @@ -8,8 +8,8 @@ void hmp_info_qdm(Monitor *mon, const QDict *qdict);
> void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp);
>
> int qdev_device_help(QemuOpts *opts);
> -DeviceState *qdev_device_add(QemuOpts *opts, Error **errp);
> -DeviceState *qdev_device_add_from_qdict(const QDict *opts,
> +DeviceState *qdev_device_add(QemuOpts *opts, long *category, Error **errp);
> +DeviceState *qdev_device_add_from_qdict(const QDict *opts, long *category,
> bool from_json, Error **errp);
>
> /**
> diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
> index 457dfd05115e..fe120353fedc 100644
> --- a/system/qdev-monitor.c
> +++ b/system/qdev-monitor.c
> @@ -632,7 +632,7 @@ const char *qdev_set_id(DeviceState *dev, char *id, Error **errp)
> return prop->name;
> }
>
> -DeviceState *qdev_device_add_from_qdict(const QDict *opts,
> +DeviceState *qdev_device_add_from_qdict(const QDict *opts, long *category,
> bool from_json, Error **errp)
> {
> ERRP_GUARD();
> @@ -655,6 +655,10 @@ DeviceState *qdev_device_add_from_qdict(const QDict *opts,
> return NULL;
> }
>
> + if (category && !test_bit(*category, dc->categories)) {
> + return NULL;
> + }
> +
> /* find bus */
> path = qdict_get_try_str(opts, "bus");
> if (path != NULL) {
> @@ -767,12 +771,12 @@ err_del_dev:
> }
>
> /* Takes ownership of @opts on success */
> -DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
> +DeviceState *qdev_device_add(QemuOpts *opts, long *category, Error **errp)
> {
> QDict *qdict = qemu_opts_to_qdict(opts, NULL);
> DeviceState *ret;
>
> - ret = qdev_device_add_from_qdict(qdict, false, errp);
> + ret = qdev_device_add_from_qdict(qdict, category, false, errp);
> if (ret) {
> qemu_opts_del(opts);
> }
> @@ -897,7 +901,7 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
> qemu_opts_del(opts);
> return;
> }
> - dev = qdev_device_add(opts, errp);
> + dev = qdev_device_add(opts, NULL, errp);
> if (!dev) {
> /*
> * Drain all pending RCU callbacks. This is done because
> diff --git a/system/vl.c b/system/vl.c
> index 193e7049ccbe..c40364e2f091 100644
> --- a/system/vl.c
> +++ b/system/vl.c
> @@ -1212,7 +1212,7 @@ static int device_init_func(void *opaque, QemuOpts *opts, Error **errp)
> {
> DeviceState *dev;
>
> - dev = qdev_device_add(opts, errp);
> + dev = qdev_device_add(opts, NULL, errp);
> if (!dev && *errp) {
> error_report_err(*errp);
> return -1;
> @@ -2665,7 +2665,7 @@ static void qemu_create_cli_devices(void)
> * from the start, so call qdev_device_add_from_qdict() directly for
> * now.
> */
> - dev = qdev_device_add_from_qdict(opt->opts, true, &error_fatal);
> + dev = qdev_device_add_from_qdict(opt->opts, NULL, true, &error_fatal);
> object_unref(OBJECT(dev));
> loc_pop(&opt->loc);
> }
next prev parent reply other threads:[~2024-10-08 9:14 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-19 6:11 [RFC v2 00/12] Introduce Hybrid CPU Topology via Custom Topology Tree Zhao Liu
2024-09-19 6:11 ` [RFC v2 01/12] qdev: Allow qdev_device_add() to add specific category device Zhao Liu
2024-10-08 9:14 ` Jonathan Cameron [this message]
2024-10-08 9:14 ` Jonathan Cameron via
2024-10-09 6:09 ` Zhao Liu
2024-09-19 6:11 ` [RFC v2 02/12] qdev: Introduce new device category to cover basic topology device Zhao Liu
2024-09-19 6:11 ` [RFC v2 03/12] system/vl: Create CPU topology devices from CLI early Zhao Liu
2024-10-08 9:50 ` Jonathan Cameron
2024-10-08 9:50 ` Jonathan Cameron via
2024-10-09 6:31 ` Zhao Liu
2024-10-08 9:55 ` Jonathan Cameron
2024-10-08 9:55 ` Jonathan Cameron via
2024-10-09 6:11 ` Zhao Liu
2024-09-19 6:11 ` [RFC v2 04/12] hw/core/machine: Split machine initialization around qemu_add_cli_devices_early() Zhao Liu
2024-09-19 6:11 ` [RFC v2 05/12] hw/core/machine: Introduce custom CPU topology with max limitations Zhao Liu
2024-10-08 10:16 ` Jonathan Cameron
2024-10-08 10:16 ` Jonathan Cameron via
2024-10-09 6:46 ` Zhao Liu
2024-09-19 6:11 ` [RFC v2 06/12] hw/cpu: Constrain CPU topology tree with max_limit Zhao Liu
2024-09-19 6:11 ` [RFC v2 07/12] hw/core: Re-implement topology helpers to honor max limitations Zhao Liu
2024-09-19 6:11 ` [RFC v2 08/12] hw/i386: Use get_max_topo_by_level() to get topology information Zhao Liu
2024-09-19 6:11 ` [RFC v2 09/12] i386: Introduce x86 CPU core abstractions Zhao Liu
2024-09-19 6:11 ` [RFC v2 10/12] i386/cpu: Support Intel hybrid CPUID Zhao Liu
2024-09-19 6:11 ` [RFC v2 11/12] i386/machine: Split machine initialization after CPU creation into post_init() Zhao Liu
2024-09-19 6:11 ` [RFC v2 12/12] i386: Support custom topology for microvm, pc-i440fx and pc-q35 Zhao Liu
2024-10-08 10:30 ` [RFC v2 00/12] Introduce Hybrid CPU Topology via Custom Topology Tree Jonathan Cameron
2024-10-08 10:30 ` Jonathan Cameron via
2024-10-09 6:01 ` Zhao Liu
2024-10-09 6:51 ` Zhao Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241008101425.00003b90@Huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=alex.bennee@linaro.org \
--cc=anthony@xenproject.org \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dapeng1.mi@linux.intel.com \
--cc=eblake@redhat.com \
--cc=edgar.iglesias@gmail.com \
--cc=eduardo@habkost.net \
--cc=imammedo@redhat.com \
--cc=jasowang@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=paul@xen.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=slp@redhat.com \
--cc=sstabellini@kernel.org \
--cc=wangyanan55@huawei.com \
--cc=yongwei.ma@intel.com \
--cc=zhao1.liu@intel.com \
--cc=zhenyu.z.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.