From: Kai <kai.kang@windriver.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
"Daniel P. Berrange" <berrange@redhat.com>,
Eduardo Habkost <eduardo@habkost.net>,
mst@redhat.com
Subject: Re: [PATCH] qdev: not add devices to bus in reverse order
Date: Mon, 22 Jan 2024 09:59:06 +0800 [thread overview]
Message-ID: <d9f93bd0-7cf5-4d3b-82b5-349a10ed6862@windriver.com> (raw)
In-Reply-To: <20240118130730.02ff9194@imammedo.users.ipa.redhat.com>
On 1/18/24 20:07, Igor Mammedov wrote:
> On Thu, 18 Jan 2024 14:48:50 +0800
> Kai <kai.kang@windriver.com> wrote:
>
>> 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.
Hi Peter & Igor,
Thanks for your reply.
> this problem description should be in commit message.
Will do next time.
> As for fixing it I'd wouldn't touch bus order as Peter already noted
> it has high chances to break behavior elsewhere.
>
> current state of COM naming:
> 1: QEMU 6.1 all machine types: COM1 { uid: 1, irq: 4}, COM2 { uid: 2, irq: 3}
> 2: QEMU 6.2+ all machine types: COM1 { uid: 2, irq: 4}, COM1 { uid: 1, irq: 3}
> all of above in default case where user doesn't supply 'index' explicitly.
>
> With 'index' provided explicitly old case #1 might break due to
> hardcoded resource values in former build_com_device_aml().
> #2 (current code) doesn't have issues with resource values
> when explicit 'index' is used (which can be a possible workaround)
How to assign explicit 'index' in the command line? I don't figure it
out the option for it.
>
> So we essentially have changed enumeration for 6.1 and older
> machine types in incompatible way with QEMU-6.2+ builds.
> (and that in it's turn breaks exiting VM config when it
> is started on QEMU-6.2+)
>
> Kai,
> Does above sum-up the issue you are encountering?
Yes, it does.
Thanks,
Kai
>
>> 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
next prev parent reply other threads:[~2024-01-22 2:00 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-09 9:20 [PATCH] qdev: not add devices to bus in reverse order Kai Kang
2024-01-17 17:31 ` Peter Maydell
2024-01-18 6:48 ` Kai
2024-01-18 10:05 ` Peter Maydell
2024-01-18 12:07 ` Igor Mammedov
2024-01-22 1:59 ` Kai [this message]
2024-01-24 16:11 ` Igor Mammedov
-- strict thread matches above, loose matches on Subject: below --
2024-01-09 9:52 kai.kang
2024-01-17 4:23 ` Kai
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=d9f93bd0-7cf5-4d3b-82b5-349a10ed6862@windriver.com \
--to=kai.kang@windriver.com \
--cc=berrange@redhat.com \
--cc=eduardo@habkost.net \
--cc=imammedo@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).