qemu-arm
[Top][All Lists]
Advanced

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

Re: [RFC PATCH-for-9.0 01/11] qom: Introduce the TypeInfo::can_register(


From: Philippe Mathieu-Daudé
Subject: Re: [RFC PATCH-for-9.0 01/11] qom: Introduce the TypeInfo::can_register() handler
Date: Thu, 23 Nov 2023 18:30:56 +0100
User-agent: Mozilla Thunderbird

On 23/11/23 17:24, Thomas Huth wrote:
On 23/11/2023 17.03, Philippe Mathieu-Daudé wrote:
On 23/11/23 16:09, Thomas Huth wrote:
On 22/11/2023 19.30, Philippe Mathieu-Daudé wrote:
Add a helper to decide at runtime whether a type can
be registered to the QOM framework or not.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
  include/qom/object.h | 4 ++++
  qom/object.c         | 3 +++
  2 files changed, 7 insertions(+)

diff --git a/include/qom/object.h b/include/qom/object.h
index afccd24ca7..0d42fe17de 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -372,6 +372,8 @@ struct Object
   * struct TypeInfo:
   * @name: The name of the type.
   * @parent: The name of the parent type.
+ * @can_register: This optional function is called before a type is registered.
+ *   If it exists and returns false, the type is not registered.

The second sentence is quite hard to parse, since it is not quite clear what "it" refers to (type or function) and what "registered" means in this context (you don't mention type_register() here).

Maybe rather something like:

If set, type_register() uses this function to decide whether the type can be registered or not.

?

   * @instance_size: The size of the object (derivative of #Object).  If    *   @instance_size is 0, then the size of the object will be the size of the
   *   parent object.
@@ -414,6 +416,8 @@ struct TypeInfo
      const char *name;
      const char *parent;
+    bool (*can_register)(void);
+
      size_t instance_size;
      size_t instance_align;
      void (*instance_init)(Object *obj);
diff --git a/qom/object.c b/qom/object.c
index 95c0dc8285..f09b6b5a92 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -150,6 +150,9 @@ static TypeImpl *type_register_internal(const TypeInfo *info)
  TypeImpl *type_register(const TypeInfo *info)
  {
      assert(info->parent);
+    if (info->can_register && !info->can_register()) {
+        return NULL;
+    }

I have to say that I don't like it too much, since you're trying to fix a problem here in common code that clearly belongs to the code in hw/arm/ instead.

What about dropping it, and changing your last patch to replace the DEFINE_TYPES(raspi_machine_types) in hw/arm/raspi.c with your own implementation of type_register_static_array() that checks the condition there?

This isn't ARM specific, it happens I started to unify ARM/aarch64
binaries.

Types can be registered depending on build-time (config/host specific)
definitions and runtime ones. How can we check for runtime if not via
this simple helper?

Still ARM, but as example what I have then is (module meson):
...
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index 1e9c6c85ae..c3b7e5666c 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -744,7 +744,8 @@ static void aarch64_max_initfn(Object *obj)
  static const ARMCPUInfo aarch64_cpus[] = {
      { .name = "cortex-a57",         .initfn = aarch64_a57_initfn },
      { .name = "cortex-a53",         .initfn = aarch64_a53_initfn },
-    { .name = "max",                .initfn = aarch64_max_initfn },
+    { .name = "max",                .initfn = aarch64_max_initfn,
+                                    .can_register = target_aarch64_available },
  #if defined(CONFIG_KVM) || defined(CONFIG_HVF)
      { .name = "host",               .initfn = aarch64_host_initfn },
  #endif

Picking this one as an example, I think I'd rather modify the for-loop in
aarch64_cpu_register_types() to check for the availability there... sounds much easier to understand for me than having a callback function.

OK.

Anyway, that's just my personal taste - if others agree with your solution instead, I won't insist on my idea.

This is a RFC so let's discuss :) I think there is a need to filter
QOM types at runtime (at least in "Single Binary" or "Heterogeneous
machines"), but I might be wrong.
Maybe we can filter that elsewhere (here seemed the simplest / more
natural place). I'll keep looking.

Regards,

Phil.



reply via email to

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