]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lscpu: Skip aarch64 decode path for rest of the architectures
authorPratik R. Sampat <pratikrajesh.sampat@amd.com>
Mon, 22 Jul 2024 16:00:46 +0000 (16:00 +0000)
committerKarel Zak <kzak@redhat.com>
Mon, 6 Jan 2025 14:51:15 +0000 (15:51 +0100)
lscpu behaves differently when run sudo vs non-sudo on AMD architectures.

On sudo runs, it adds a BIOS model name and BIOS CPU family which it
does not add for the latter. However since this parsing from the DMI is
primarily catered to aarch64, for AMD platform the BIOS model name is
printed out as follows "AMD XXX Processor *Unknown* CPU @ X.XGHz" due
to the part number is not populated on the platform.

The issue boils down to an unconditional call to arm_decode() which
attempts to read the DMI path and populate the processor information
such as processor version and part number which is set to Unknown on AMD
CPUs.

81d6de9 (lscpu: remove the old code) changed the DMI path from
/sys/firmware/dmi/entries/4-0/raw (non-existent) to
/sys/firmware/dmi/tables/dmi (existent) which has brought this latent
issue to light as DMI was starting to be parsed incorrectly.

Therefore, do not perform aarch64 parsing for other architectures.

Before
------
$ lscpu
Vendor ID:                AuthenticAMD
  Model name:             AMD EPYC XXXX X-Core Processor
    CPU family:           26

$ sudo lscpu
Vendor ID:                AuthenticAMD
  BIOS Vendor ID:         Advanced Micro Devices, Inc.
  Model name:             AMD EPYC XXXX X-Core Processor
    BIOS Model name:      AMD EPYC XXXX X-Core Processor Unknown CPU @ X.XGHz
    BIOS CPU family:      107
    CPU family:           26

After
-----
$ lscpu
Vendor ID:                AuthenticAMD
  Model name:             AMD EPYC XXXX X-Core Processor
    CPU family:           26

$ sudo lscpu
Vendor ID:                AuthenticAMD
  Model name:             AMD EPYC XXXX X-Core Processor
    CPU family:           26

Fixes: 81d6de9 ("lscpu: remove the old code")
Co-developed-by: Karel Zak <kzak@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
Signed-off-by: Pratik R. Sampat <pratikrajesh.sampat@amd.com>
(cherry picked from commit 50a3efab6d126b28fcdcc28f1a0cd5cd596ae357)

sys-utils/lscpu-arm.c
sys-utils/lscpu.c
sys-utils/lscpu.h

index 997ae88ff1e7c16fc9244b7cb35ba9fc0b224919..96f6b33c9245951d027c61bbe82dd4c8c3b7daff 100644 (file)
@@ -333,14 +333,49 @@ static int parse_id(const char *str)
 
 #define parse_model_id(_cxt)           (parse_id((_cxt)->model))
 
+static inline int get_implementer_id(struct lscpu_cputype *ct)
+{
+       if (ct->vendor_id)
+               return ct->vendor_id;
+       return parse_id(ct->vendor);
+}
+
 static inline int parse_implementer_id(struct lscpu_cputype *ct)
 {
+       int id;
+
        if (ct->vendor_id)
                return ct->vendor_id;
-       ct->vendor_id = parse_id(ct->vendor);
+       id = get_implementer_id(ct);
+       if (id <= 0)
+               return id;
+
+       ct->vendor_id = id;
        return ct->vendor_id;
 }
 
+int is_arm(struct lscpu_cxt *cxt)
+{
+       size_t i;
+
+       if (is_live(cxt))
+               return strcmp(cxt->arch->name, "aarch64") == 0;
+
+       /* dump; assume ARM if vendor ID is known */
+       for (i = 0; i < cxt->ncputypes; i++) {
+
+               int j, id = get_implementer_id(cxt->cputypes[i]);
+               if (id <= 0)
+                       continue;
+               for (j = 0; hw_implementer[j].id != -1; j++) {
+                       if (hw_implementer[j].id == id)
+                               return 1;
+               }
+       }
+
+       return 0;
+}
+
 /*
  * Use model and vendor IDs to decode to human readable names.
  */
index c073fc0dc45484ccfe6db38400a97486c86e8f3d..60a0912370a88b9f4e410f85b9ad76c166be3d26 100644 (file)
@@ -1365,7 +1365,8 @@ int main(int argc, char *argv[])
        lscpu_read_numas(cxt);
        lscpu_read_topology(cxt);
 
-       lscpu_decode_arm(cxt);
+       if (is_arm(cxt))
+               lscpu_decode_arm(cxt);
 
        cxt->virt = lscpu_read_virtualization(cxt);
 
index 2c6a1d1c4f0d288b40c5629a083b28b4d4de1c7e..09ebe14da32d2b723ad231eb83b54e6f895b90d0 100644 (file)
@@ -271,6 +271,8 @@ struct lscpu_cxt {
                ((_cxt) && (_cpu) && (_cxt)->present && \
                 CPU_ISSET_S((_cpu)->logical_id, (_cxt)->setsize, (_cxt)->present))
 
+int is_arm(struct lscpu_cxt *cxt);
+
 struct lscpu_cputype *lscpu_new_cputype(void);
 void lscpu_ref_cputype(struct lscpu_cputype *ct);
 void lscpu_unref_cputype(struct lscpu_cputype *ct);