Re: Sort unit addresses by number

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



On Wed, Aug 12, 2015 at 12:00:04PM +1000, Anton Blanchard wrote:
> The sort option in dtc treats unit addresses as strings. This causes
> cpu nodes to end up out of order:
> 
> # dtc -s -I fs -O dts /proc/proc/device-tree | grep PowerPC,POWER7
> 
> 		PowerPC,POWER7@30 {
> 		PowerPC,POWER7@68 {
> 		PowerPC,POWER7@70 {
> 		PowerPC,POWER7@828 {
> 		PowerPC,POWER7@860 {
> 		PowerPC,POWER7@868 {
> 		PowerPC,POWER7@8a0 {
> 		PowerPC,POWER7@8b0 {
> 		PowerPC,POWER7@8f0 {
> 		PowerPC,POWER7@a0 {
> 		PowerPC,POWER7@a8 {
> 		PowerPC,POWER7@e0 {
> 
> If we use this device tree for a kexec boot we end up with a confusing
> layout of logical CPUs:
> 
> node 0 cpus: 0-23 72-95
> node 0 size: 32633 MB
> 
> node 1 cpus: 24-71
> node 1 size: 32631 MB
> 
> The reason for this is that we allocate logical CPU ids as we walk
> through the device tree.
> 
> In cmp_subnode, if both nodes have a hex unit address and the
> basenames match, then compare by number.
> 
> This fixes the issue:
> 
> # dtc -s -I fs -O dts /proc/proc/device-tree | grep PowerPC,POWER7
> 		PowerPC,POWER7@30 {
> 		PowerPC,POWER7@68 {
> 		PowerPC,POWER7@70 {
> 		PowerPC,POWER7@a0 {
> 		PowerPC,POWER7@a8 {
> 		PowerPC,POWER7@e0 {
> 		PowerPC,POWER7@828 {
> 		PowerPC,POWER7@860 {
> 		PowerPC,POWER7@868 {
> 		PowerPC,POWER7@8a0 {
> 		PowerPC,POWER7@8b0 {
> 		PowerPC,POWER7@8f0 {
> 
> And the CPU layout is as expected:
> 
> node 0 cpus: 0-47
> node 0 size: 32633 MB
> 
> node 1 cpus: 48-95
> node 1 size: 32631 MB
> 
> Signed-off-by: Anton Blanchard <anton@xxxxxxxxx>

So.. I agree the current ordering is rather nasty, but changing it
like this is problematic.

The idea of dtc -s is that it will produce the output in a "canonical"
form so that tools like dtdiff can examine without having to care
about order changes.  So, first problem is that changing the -s
behaviour means that the "canonical" form from an old dtc won't be the
same as from a new dtc which kind of defeats the purpose.

Again, in principle, ordering by unit address makes more sense than
ordering by the whole unit name, but it adds further complications.
We could just strcmp() the unit address, but that would lead to the
same ordering oddities you've seen.  We can order assuming it's hex,
but then we'll get strange behaviour on pci or other buses that can
have funny characters in their unit addresses.

So, yeah..

At the very least I'd like to see a change like this activated by a
new option.  Longer term I'm not sure how to proceed sensibly with
improving the ordering.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: pgpIlJef3dSKd.pgp
Description: PGP signature


[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux