qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] qdev: not add devices to bus in reverse order


From: Kai
Subject: Re: [PATCH] qdev: not add devices to bus in reverse order
Date: Thu, 18 Jan 2024 14:48:50 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2

On 1/18/24 01:31, Peter Maydell wrote:
(cc'd the people listed for this file in MAINTAINERS)

On Tue, 9 Jan 2024 at 13:53, Kai Kang <kai.kang@windriver.com> wrote:
When this section of source codes were added via commit:

* 02e2da45c4 Add common BusState

it added devices to bus with LIST_INSERT_HEAD() which operated on the
single direction list. It didn't have something like LIST_INSERT_TAIL()
at that time and kept that way when turned to QTAILQ.

Then it causes the fist device in qemu command line inserted at the end
of the bus child link list. And when realize them, the first device will
be the last one to be realized.

Replace QTAILQ_INSERT_HEAD_RCU() with QTAILQ_INSERT_TAIL_RCU() to make
sure that devices are added to bus with the sequence in the command
line.
What are the problems being caused by the the list items being added
in reverse order? Your commit message doesn't say what specific
bug or problem it's trying to fix.

The problem I met was just as I asked for for help in the maillist on Dec 18, 2023.

The indexes of serial isa devices changes with the commit dcdbfaafe90a since qemu 6.2.0.
Before the commit, it creates devices literally with "1" & "2":

@@ -1252,8 +1222,6 @@ static void build_isa_devices_aml(Aml *table)
         aml_append(scope, build_fdc_device_aml(fdc));
     }
     aml_append(scope, build_lpt_device_aml());
-    build_com_device_aml(scope, 1);
-    build_com_device_aml(scope, 2);

After apply the commit, it uses the 'aml builder' way and the devices are handled in reverse way. Then the indexes are reversed. It affects guest os such as freebsd. When run `pstat -t` on freebsd
with qemu, the sequence of the output is not right.

root@freebsd:~ # pstat -t
      LINE   INQ  CAN  LIN  LOW  OUTQ  USE  LOW   COL  SESS  PGID STATE
     ttyu2     0    0    0    0     0    0    0     0     0     0 IC
     ttyu3     0    0    0    0     0    0    0     0     0     0 IC
     ttyu1     0    0    0    0     0    0    0     0     0     0 IC
     ttyu0  1920    0    0  192  1984    0  199     0   664   668 ICOi

It is expected with ascend order which keeps the same behavior with older version qemu.


Regards,
Kai


In general this kind of patch is something I'm very cautious about,
because it seems very likely that various bits of the code where
order does matter will currently be expecting (and working around)
the reverse-order behaviour, because that's what has been done by
bus_add_child() for the last 20-plus years. (As one concrete example,
see the big comment at the top of create_virtio_devices() in
hw/arm/virt.c. There are probably others where we didn't comment
on the ordering but just assume it.)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 43d863b0c5..5e2ff43715 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -89,7 +89,7 @@ static void bus_add_child(BusState *bus, DeviceState *child)
      kid->child = child;
      object_ref(OBJECT(kid->child));

-    QTAILQ_INSERT_HEAD_RCU(&bus->children, kid, sibling);
+    QTAILQ_INSERT_TAIL_RCU(&bus->children, kid, sibling);

      /* This transfers ownership of kid->child to the property.  */
      snprintf(name, sizeof(name), "child[%d]", kid->index);
thanks
-- PMM


--
Kai Kang
Wind River Linux




reply via email to

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