From: Markus Armbruster <armbru@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Richard Henderson <rth@twiddle.net>,
qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>
Subject: [Qemu-devel] When to use qemu/typedefs.h (was: [PATCH 23/28] numa: Don't include hw/boards.h into sysemu/numa.h)
Date: Tue, 30 Jul 2019 13:01:12 +0200 [thread overview]
Message-ID: <87d0hreqh3.fsf_-_@dusky.pond.sub.org> (raw)
In-Reply-To: <20190729194414.GG4313@habkost.net> (Eduardo Habkost's message of "Mon, 29 Jul 2019 16:44:14 -0300")
Cc'ing a few more people who might be interested.
Eduardo Habkost <ehabkost@redhat.com> writes:
> On Fri, Jul 26, 2019 at 02:05:37PM +0200, Markus Armbruster wrote:
>> sysemu/numa.h includes hw/boards.h just for the CPUArchId typedef, at
>> the cost of pulling in more than two dozen extra headers indirectly.
>>
>> I could move the typedef from hw/boards.h to qemu/typedefs.h. But
>> it's used in just two headers: boards.h and numa.h.
>>
>> I could move it to another header both its users include.
>> exec/cpu-common.h seems to be the least bad fit.
>>
>> But I'm keeping this simple & stupid: declare the struct tag in
>> numa.h.
>>
>> Cc: Eduardo Habkost <ehabkost@redhat.com>
>> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>> exec.c | 1 +
>> hw/core/machine-qmp-cmds.c | 1 +
>> hw/core/machine.c | 1 +
>> hw/mem/pc-dimm.c | 1 +
>> include/hw/boards.h | 2 +-
>> include/sysemu/numa.h | 9 +++++++--
>> 6 files changed, 12 insertions(+), 3 deletions(-)
>>
>> diff --git a/exec.c b/exec.c
>> index 6d60fdfb1f..4d9e146c79 100644
>> --- a/exec.c
>> +++ b/exec.c
>> @@ -41,6 +41,7 @@
>> #if defined(CONFIG_USER_ONLY)
>> #include "qemu.h"
>> #else /* !CONFIG_USER_ONLY */
>> +#include "hw/boards.h"
>> #include "exec/memory.h"
>> #include "exec/ioport.h"
>> #include "sysemu/dma.h"
>> diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
>> index c83e8954e1..d8284671f0 100644
>> --- a/hw/core/machine-qmp-cmds.c
>> +++ b/hw/core/machine-qmp-cmds.c
>> @@ -9,6 +9,7 @@
>>
>> #include "qemu/osdep.h"
>> #include "cpu.h"
>> +#include "hw/boards.h"
>> #include "qapi/error.h"
>> #include "qapi/qapi-commands-machine.h"
>> #include "qapi/qmp/qerror.h"
>> diff --git a/hw/core/machine.c b/hw/core/machine.c
>> index 2c9c93983a..901f3fa905 100644
>> --- a/hw/core/machine.c
>> +++ b/hw/core/machine.c
>> @@ -23,6 +23,7 @@
>> #include "sysemu/numa.h"
>> #include "qemu/error-report.h"
>> #include "sysemu/qtest.h"
>> +#include "hw/boards.h"
>> #include "hw/pci/pci.h"
>> #include "hw/mem/nvdimm.h"
>>
>> diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
>> index 0c83dcd61e..fa90d4fc6c 100644
>> --- a/hw/mem/pc-dimm.c
>> +++ b/hw/mem/pc-dimm.c
>> @@ -19,6 +19,7 @@
>> */
>>
>> #include "qemu/osdep.h"
>> +#include "hw/boards.h"
>> #include "hw/mem/pc-dimm.h"
>> #include "hw/qdev-properties.h"
>> #include "migration/vmstate.h"
>> diff --git a/include/hw/boards.h b/include/hw/boards.h
>> index 67e551636a..739d109fe1 100644
>> --- a/include/hw/boards.h
>> +++ b/include/hw/boards.h
>> @@ -86,7 +86,7 @@ void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
>> * @props - CPU object properties, initialized by board
>> * #vcpus_count - number of threads provided by @cpu object
>> */
>> -typedef struct {
>> +typedef struct CPUArchId {
>> uint64_t arch_id;
>> int64_t vcpus_count;
>> CpuInstanceProperties props;
>> diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
>> index 01a263eba2..4c4c1dee9b 100644
>> --- a/include/sysemu/numa.h
>> +++ b/include/sysemu/numa.h
>> @@ -4,7 +4,10 @@
>> #include "qemu/bitmap.h"
>> #include "sysemu/sysemu.h"
>> #include "sysemu/hostmem.h"
>> -#include "hw/boards.h"
>> +#include "qapi/qapi-types-machine.h"
>
> This seems to be needed because of NodeInfo.
NumaOptions, actually.
>> +#include "exec/cpu-common.h"
>
> This seems to be needed because of ram_addr_t.
Correct.
> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
>
>
>> +
>> +struct CPUArchId;
>>
>
> I wonder if we should do the same for other struct types like
> NodeInfo.
NumaOptions, I think.
> Why is it bad to require the inclusion of hw/boards.h just
> because of CPUArchId, but acceptable to require the inclusion of
> qapi-types-machine.h just to be able to write "NodeInfo *nodes"
> instead of "struct NodeInfo *nodes" below?
hw/boards.h is worse. Both headers pull in qapi/qapi-builtin-types.h
and qapi/qapi-types-common.h, but hw/boards.h pulls in ~60 more.
That doesn't mean including qapi/qapi-types-common.h is good.
For better or worse[*], our coding style mandates typedefs.
We generally declare a typedef name in exactly one place. The obvious
place is together with the type it denotes.
Non-local users of the type then need to include the header that
declares the typedef name.
This can lead to inclusion cycles, in particular for complete struct and
union types that need more types for their members.
We move typedefs to qemu/typedefs.h to break such cycles.
We also do it to include less, for less frequent recompilation. As this
series demonstrates, we're not very good at that. When to put a typedef
in qemu/typedefs.h for this purpose is not obvious. If we simply put
all of them there, we'd recompile the world every time we add a typedef,
which is pretty much exactly what we're trying to avoid.
Some of qemu/typedefs.h's typedefs are used in dozens or even hundreds
of other headers. Quite a few only in one. The latter likely should
not be there.
We occasionally give up and use types directly rather than their typedef
names, flouting the coding style. This patch does. Trades messing with
qemu/typedefs.h for having to write 'struct' a few times.
Should we give up more? Or not at all?
Can we have some guidelines on proper use of qemu/typedefs.h?
>> extern int nb_numa_nodes; /* Number of NUMA nodes */
>> extern bool have_numa_distance;
>> @@ -32,5 +35,7 @@ void numa_legacy_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
>> int nb_nodes, ram_addr_t size);
>> void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
>> int nb_nodes, ram_addr_t size);
>> -void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev, Error **errp);
>> +void numa_cpu_pre_plug(const struct CPUArchId *slot, DeviceState *dev,
>> + Error **errp);
>> +
>> #endif
>> --
>> 2.21.0
>>
[*] Worse if you ask me.
next prev parent reply other threads:[~2019-07-30 11:02 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-26 12:05 [Qemu-devel] [PATCH 00/28] Tame a few "touch this, recompile the world" headers Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 01/28] include: Make headers more self-contained Markus Armbruster
2019-07-26 16:50 ` Alistair Francis
2019-07-26 12:05 ` [Qemu-devel] [PATCH 02/28] Include generated QAPI headers less Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 03/28] qapi: Split error.json off common.json Markus Armbruster
2019-07-26 13:53 ` Eric Blake
2019-07-26 14:34 ` Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 04/28] memory: Fix type of IOMMUMemoryRegionClass member @parent_class Markus Armbruster
2019-07-26 16:06 ` Philippe Mathieu-Daudé
2019-07-26 12:05 ` [Qemu-devel] [PATCH 05/28] queue: Drop superfluous #include qemu/atomic.h Markus Armbruster
2019-07-31 10:54 ` Thomas Huth
2019-07-26 12:05 ` [Qemu-devel] [PATCH 06/28] trace: Eliminate use of TARGET_FMT_plx Markus Armbruster
2019-07-26 16:04 ` Philippe Mathieu-Daudé
2019-07-26 12:05 ` [Qemu-devel] [PATCH 07/28] trace: Do not include qom/cpu.h into generated trace.h Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 08/28] Include sysemu/reset.h a lot less Markus Armbruster
2019-07-26 16:03 ` Philippe Mathieu-Daudé
2019-07-26 16:48 ` Alistair Francis
2019-07-26 12:05 ` [Qemu-devel] [PATCH 09/28] Include migration/qemu-file-types.h " Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 10/28] ide: Include hw/ide/internal a bit less outside hw/ide/ Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 11/28] typedefs: Separate incomplete types and function types Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 12/28] Include hw/irq.h a lot less Markus Armbruster
2019-07-26 16:52 ` Alistair Francis
2019-07-26 12:05 ` [Qemu-devel] [PATCH 13/28] Clean up inclusion of exec/cpu-common.h Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 14/28] migration: Move the VMStateDescription typedef to typedefs.h Markus Armbruster
2019-07-26 15:51 ` Philippe Mathieu-Daudé
2019-08-02 9:47 ` Paolo Bonzini
2019-07-26 12:05 ` [Qemu-devel] [PATCH 15/28] Include migration/vmstate.h less Markus Armbruster
2019-07-26 16:54 ` Alistair Francis
2019-07-26 12:05 ` [Qemu-devel] [PATCH 16/28] Include exec/memory.h slightly less Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 17/28] Include qom/object.h " Markus Armbruster
2019-07-26 15:53 ` Philippe Mathieu-Daudé
2019-07-26 12:05 ` [Qemu-devel] [PATCH 18/28] Include hw/hw.h exactly where needed Markus Armbruster
2019-07-26 22:14 ` Alistair Francis
2019-07-26 12:05 ` [Qemu-devel] [PATCH 19/28] Include qemu/queue.h slightly less Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 20/28] Include qemu/main-loop.h less Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 21/28] Include hw/qdev-properties.h less Markus Armbruster
2019-07-29 19:16 ` Eduardo Habkost
2019-07-30 6:33 ` Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 22/28] Include hw/boards.h a bit less Markus Armbruster
2019-07-26 20:29 ` Alistair Francis
2019-07-29 20:07 ` Eduardo Habkost
2019-07-30 11:03 ` Markus Armbruster
2019-07-29 20:17 ` Eduardo Habkost
2019-07-30 11:06 ` Markus Armbruster
2019-08-02 14:37 ` Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 23/28] numa: Don't include hw/boards.h into sysemu/numa.h Markus Armbruster
2019-07-29 19:44 ` Eduardo Habkost
2019-07-30 11:01 ` Markus Armbruster [this message]
2019-07-30 13:15 ` [Qemu-devel] When to use qemu/typedefs.h (was: [PATCH 23/28] numa: Don't include hw/boards.h into sysemu/numa.h) Eric Blake
2019-07-30 13:28 ` Paolo Bonzini
2019-07-30 21:07 ` [Qemu-devel] [RFC] HACKING: Document 'struct' keyword usage Eduardo Habkost
2019-07-30 21:32 ` Eric Blake
2019-07-31 8:35 ` Thomas Huth
2019-08-01 18:50 ` Eduardo Habkost
2019-08-01 19:23 ` Paolo Bonzini
2019-08-02 7:02 ` Thomas Huth
2019-08-01 17:21 ` Aleksandar Markovic
2019-07-31 6:37 ` [Qemu-devel] When to use qemu/typedefs.h Markus Armbruster
2019-07-31 6:43 ` Paolo Bonzini
2019-07-31 8:40 ` Thomas Huth
2019-07-31 10:45 ` Peter Maydell
2019-07-31 10:51 ` Daniel P. Berrangé
2019-07-30 20:55 ` [Qemu-devel] When to use qemu/typedefs.h (was: [PATCH 23/28] numa: Don't include hw/boards.h into sysemu/numa.h) Eduardo Habkost
2019-07-26 12:05 ` [Qemu-devel] [PATCH 24/28] Include sysemu/hostmem.h less Markus Armbruster
2019-07-26 15:57 ` Philippe Mathieu-Daudé
2019-07-29 19:47 ` Eduardo Habkost
2019-07-30 12:07 ` Igor Mammedov
2019-08-02 9:53 ` Paolo Bonzini
2019-08-02 13:20 ` Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 25/28] numa: Move remaining NUMA declarations from sysemu.h to numa.h Markus Armbruster
2019-07-26 15:57 ` Philippe Mathieu-Daudé
2019-07-29 19:48 ` Eduardo Habkost
2019-07-26 12:05 ` [Qemu-devel] [PATCH 26/28] Clean up inclusion of sysemu/sysemu.h Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 27/28] sysemu: Move the VMChangeStateEntry typedef to qemu/typedefs.h Markus Armbruster
2019-08-02 9:48 ` Paolo Bonzini
2019-08-02 13:16 ` Markus Armbruster
2019-08-02 13:21 ` Paolo Bonzini
2019-08-06 16:26 ` Markus Armbruster
2019-08-02 20:36 ` Markus Armbruster
2019-07-26 12:05 ` [Qemu-devel] [PATCH 28/28] Include sysemu/sysemu.h a lot less Markus Armbruster
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=87d0hreqh3.fsf_-_@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=ehabkost@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/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.