diff mbox series

[v2,15/16] tests: bios-tables-test: Add test for smbios type4 thread count2

Message ID 20230928125943.1816922-16-zhao1.liu@linux.intel.com
State New
Headers show
Series tests: Add CPU topology related smbios test cases | expand

Commit Message

Zhao Liu Sept. 28, 2023, 12:59 p.m. UTC
From: Zhao Liu <zhao1.liu@intel.com>

This tests the commit 7298fd7de5551 ("hw/smbios: Fix thread count in
type4").

In smbios_build_type_4_table() (hw/smbios/smbios.c), if the number of
threads in the socket is more than 255, then smbios type4 table encodes
threads per socket into the thread count2 field.

So for the topology in this case, there're the following considerations:
1. threads per socket should be more than 255 to ensure we could cover
   the thread count2 field.
2. The original bug was that threads per socket was miscalculated, so
   now we should configure as many topology levels as possible (mutiple
   sockets & dies, no module since x86 hasn't supported it) to cover
   more general topology scenarios, to ensure that the threads per
   socket encoded in the thread count2 field is correct.
3. For the more general topology, we should also add "cpus" (presented
   threads for machine) and "maxcpus" (total threads for machine) to
   make sure that configuring unpluged CPUs in smp (cpus < maxcpus)
   does not affect the correctness of threads per socket for thread
   count2 field.

Based on these considerations, select the topology as the follow:

-smp cpus=210,maxcpus=520,sockets=2,dies=2,cores=65,threads=2

The expected thread count2 = threads per socket = threads (2)
* cores (65) * dies (2) = 260.

Suggested-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
---
Changes since v1:
 * Dropped the extra variable: uint64_t thread_count2_addr. (Igor)
 * Added description of the consideration for topology selection of this
   case in commit message. (Igor)
---
 tests/qtest/bios-tables-test.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

Comments

Michael S. Tsirkin Oct. 22, 2023, 9:17 a.m. UTC | #1
On Thu, Sep 28, 2023 at 08:59:42PM +0800, Zhao Liu wrote:
> From: Zhao Liu <zhao1.liu@intel.com>
> 
> This tests the commit 7298fd7de5551 ("hw/smbios: Fix thread count in
> type4").
> 
> In smbios_build_type_4_table() (hw/smbios/smbios.c), if the number of
> threads in the socket is more than 255, then smbios type4 table encodes
> threads per socket into the thread count2 field.
> 
> So for the topology in this case, there're the following considerations:
> 1. threads per socket should be more than 255 to ensure we could cover
>    the thread count2 field.
> 2. The original bug was that threads per socket was miscalculated, so
>    now we should configure as many topology levels as possible (mutiple
>    sockets & dies, no module since x86 hasn't supported it) to cover
>    more general topology scenarios, to ensure that the threads per
>    socket encoded in the thread count2 field is correct.
> 3. For the more general topology, we should also add "cpus" (presented
>    threads for machine) and "maxcpus" (total threads for machine) to
>    make sure that configuring unpluged CPUs in smp (cpus < maxcpus)
>    does not affect the correctness of threads per socket for thread
>    count2 field.
> 
> Based on these considerations, select the topology as the follow:
> 
> -smp cpus=210,maxcpus=520,sockets=2,dies=2,cores=65,threads=2
> 
> The expected thread count2 = threads per socket = threads (2)
> * cores (65) * dies (2) = 260.
> 
> Suggested-by: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Zhao Liu <zhao1.liu@intel.com>

There's a problem here: not all hosts support such high
number of vCPUs.
Number of hotpluggable cpus requested (520) exceeds the maximum cpus
supported by KVM (288)
socket_accept failed: Resource temporarily unavailable
**

Dropped for now pls come up with a solution.


> ---
> Changes since v1:
>  * Dropped the extra variable: uint64_t thread_count2_addr. (Igor)
>  * Added description of the consideration for topology selection of this
>    case in commit message. (Igor)
> ---
>  tests/qtest/bios-tables-test.c | 31 +++++++++++++++++++++++++++++++
>  1 file changed, 31 insertions(+)
> 
> diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
> index f8e3e349e09f..58119d8979c6 100644
> --- a/tests/qtest/bios-tables-test.c
> +++ b/tests/qtest/bios-tables-test.c
> @@ -96,6 +96,7 @@ typedef struct {
>      uint8_t smbios_core_count;
>      uint16_t smbios_core_count2;
>      uint8_t smbios_thread_count;
> +    uint16_t smbios_thread_count2;
>      uint8_t *required_struct_types;
>      int required_struct_types_len;
>      int type4_count;
> @@ -644,6 +645,7 @@ static void smbios_cpu_test(test_data *data, uint32_t addr,
>      uint8_t thread_count, expected_thread_count = data->smbios_thread_count;
>      uint16_t speed, expected_speed[2];
>      uint16_t core_count2, expected_core_count2 = data->smbios_core_count2;
> +    uint16_t thread_count2, expected_thread_count2 = data->smbios_thread_count2;
>      int offset[2];
>      int i;
>  
> @@ -680,6 +682,15 @@ static void smbios_cpu_test(test_data *data, uint32_t addr,
>          if (expected_core_count == 0xFF && expected_core_count2) {
>              g_assert_cmpuint(core_count2, ==, expected_core_count2);
>          }
> +
> +        thread_count2 = qtest_readw(data->qts,
> +                            addr + offsetof(struct smbios_type_4,
> +                            thread_count2));
> +
> +        /* Thread Count has reached its limit, checking Thread Count 2 */
> +        if (expected_thread_count == 0xFF && expected_thread_count2) {
> +            g_assert_cmpuint(thread_count2, ==, expected_thread_count2);
> +        }
>      }
>  }
>  
> @@ -1050,6 +1061,7 @@ static void test_acpi_q35_tcg_thread_count(void)
>          .required_struct_types = base_required_struct_types,
>          .required_struct_types_len = ARRAY_SIZE(base_required_struct_types),
>          .smbios_thread_count = 27,
> +        .smbios_thread_count2 = 27,
>      };
>  
>      test_acpi_one("-machine smbios-entry-point-type=64 "
> @@ -1058,6 +1070,23 @@ static void test_acpi_q35_tcg_thread_count(void)
>      free_test_data(&data);
>  }
>  
> +static void test_acpi_q35_tcg_thread_count2(void)
> +{
> +    test_data data = {
> +        .machine = MACHINE_Q35,
> +        .variant = ".thread-count2",
> +        .required_struct_types = base_required_struct_types,
> +        .required_struct_types_len = ARRAY_SIZE(base_required_struct_types),
> +        .smbios_thread_count = 0xFF,
> +        .smbios_thread_count2 = 260,
> +    };
> +
> +    test_acpi_one("-machine smbios-entry-point-type=64 "
> +                  "-smp cpus=210,maxcpus=520,sockets=2,dies=2,cores=65,threads=2",
> +                  &data);
> +    free_test_data(&data);
> +}
> +
>  static void test_acpi_q35_tcg_bridge(void)
>  {
>      test_data data = {};
> @@ -2216,6 +2245,8 @@ int main(int argc, char *argv[])
>                                 test_acpi_q35_tcg_core_count2);
>                  qtest_add_func("acpi/q35/thread-count",
>                                 test_acpi_q35_tcg_thread_count);
> +                qtest_add_func("acpi/q35/thread-count2",
> +                               test_acpi_q35_tcg_thread_count2);
>              }
>              if (qtest_has_device("virtio-iommu-pci")) {
>                  qtest_add_func("acpi/q35/viot", test_acpi_q35_viot);
> -- 
> 2.34.1
Zhao Liu Oct. 23, 2023, 2:36 a.m. UTC | #2
Hi Michael,

On Sun, Oct 22, 2023 at 05:17:29AM -0400, Michael S. Tsirkin wrote:
> Date: Sun, 22 Oct 2023 05:17:29 -0400
> From: "Michael S. Tsirkin" <mst@redhat.com>
> Subject: Re: [PATCH v2 15/16] tests: bios-tables-test: Add test for smbios
>  type4 thread count2
> 
> On Thu, Sep 28, 2023 at 08:59:42PM +0800, Zhao Liu wrote:
> > From: Zhao Liu <zhao1.liu@intel.com>
> > 
> > This tests the commit 7298fd7de5551 ("hw/smbios: Fix thread count in
> > type4").
> > 
> > In smbios_build_type_4_table() (hw/smbios/smbios.c), if the number of
> > threads in the socket is more than 255, then smbios type4 table encodes
> > threads per socket into the thread count2 field.
> > 
> > So for the topology in this case, there're the following considerations:
> > 1. threads per socket should be more than 255 to ensure we could cover
> >    the thread count2 field.
> > 2. The original bug was that threads per socket was miscalculated, so
> >    now we should configure as many topology levels as possible (mutiple
> >    sockets & dies, no module since x86 hasn't supported it) to cover
> >    more general topology scenarios, to ensure that the threads per
> >    socket encoded in the thread count2 field is correct.
> > 3. For the more general topology, we should also add "cpus" (presented
> >    threads for machine) and "maxcpus" (total threads for machine) to
> >    make sure that configuring unpluged CPUs in smp (cpus < maxcpus)
> >    does not affect the correctness of threads per socket for thread
> >    count2 field.
> > 
> > Based on these considerations, select the topology as the follow:
> > 
> > -smp cpus=210,maxcpus=520,sockets=2,dies=2,cores=65,threads=2
> > 
> > The expected thread count2 = threads per socket = threads (2)
> > * cores (65) * dies (2) = 260.
> > 
> > Suggested-by: Igor Mammedov <imammedo@redhat.com>
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> 
> There's a problem here: not all hosts support such high
> number of vCPUs.
> Number of hotpluggable cpus requested (520) exceeds the maximum cpus
> supported by KVM (288)
> socket_accept failed: Resource temporarily unavailable
> **
> 
> Dropped for now pls come up with a solution.

I'll drop multiple sockets/dies for this case.
The previsou thread count test has already covered the complex topology
level case so that for thread count2 we can not configure so many
sockets/dies, just check that there are more than 255 threads in a
socket.

I'll refresh a new version.

Regards,
Zhao

> 
> 
> > ---
> > Changes since v1:
> >  * Dropped the extra variable: uint64_t thread_count2_addr. (Igor)
> >  * Added description of the consideration for topology selection of this
> >    case in commit message. (Igor)
> > ---
> >  tests/qtest/bios-tables-test.c | 31 +++++++++++++++++++++++++++++++
> >  1 file changed, 31 insertions(+)
> > 
> > diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
> > index f8e3e349e09f..58119d8979c6 100644
> > --- a/tests/qtest/bios-tables-test.c
> > +++ b/tests/qtest/bios-tables-test.c
> > @@ -96,6 +96,7 @@ typedef struct {
> >      uint8_t smbios_core_count;
> >      uint16_t smbios_core_count2;
> >      uint8_t smbios_thread_count;
> > +    uint16_t smbios_thread_count2;
> >      uint8_t *required_struct_types;
> >      int required_struct_types_len;
> >      int type4_count;
> > @@ -644,6 +645,7 @@ static void smbios_cpu_test(test_data *data, uint32_t addr,
> >      uint8_t thread_count, expected_thread_count = data->smbios_thread_count;
> >      uint16_t speed, expected_speed[2];
> >      uint16_t core_count2, expected_core_count2 = data->smbios_core_count2;
> > +    uint16_t thread_count2, expected_thread_count2 = data->smbios_thread_count2;
> >      int offset[2];
> >      int i;
> >  
> > @@ -680,6 +682,15 @@ static void smbios_cpu_test(test_data *data, uint32_t addr,
> >          if (expected_core_count == 0xFF && expected_core_count2) {
> >              g_assert_cmpuint(core_count2, ==, expected_core_count2);
> >          }
> > +
> > +        thread_count2 = qtest_readw(data->qts,
> > +                            addr + offsetof(struct smbios_type_4,
> > +                            thread_count2));
> > +
> > +        /* Thread Count has reached its limit, checking Thread Count 2 */
> > +        if (expected_thread_count == 0xFF && expected_thread_count2) {
> > +            g_assert_cmpuint(thread_count2, ==, expected_thread_count2);
> > +        }
> >      }
> >  }
> >  
> > @@ -1050,6 +1061,7 @@ static void test_acpi_q35_tcg_thread_count(void)
> >          .required_struct_types = base_required_struct_types,
> >          .required_struct_types_len = ARRAY_SIZE(base_required_struct_types),
> >          .smbios_thread_count = 27,
> > +        .smbios_thread_count2 = 27,
> >      };
> >  
> >      test_acpi_one("-machine smbios-entry-point-type=64 "
> > @@ -1058,6 +1070,23 @@ static void test_acpi_q35_tcg_thread_count(void)
> >      free_test_data(&data);
> >  }
> >  
> > +static void test_acpi_q35_tcg_thread_count2(void)
> > +{
> > +    test_data data = {
> > +        .machine = MACHINE_Q35,
> > +        .variant = ".thread-count2",
> > +        .required_struct_types = base_required_struct_types,
> > +        .required_struct_types_len = ARRAY_SIZE(base_required_struct_types),
> > +        .smbios_thread_count = 0xFF,
> > +        .smbios_thread_count2 = 260,
> > +    };
> > +
> > +    test_acpi_one("-machine smbios-entry-point-type=64 "
> > +                  "-smp cpus=210,maxcpus=520,sockets=2,dies=2,cores=65,threads=2",
> > +                  &data);
> > +    free_test_data(&data);
> > +}
> > +
> >  static void test_acpi_q35_tcg_bridge(void)
> >  {
> >      test_data data = {};
> > @@ -2216,6 +2245,8 @@ int main(int argc, char *argv[])
> >                                 test_acpi_q35_tcg_core_count2);
> >                  qtest_add_func("acpi/q35/thread-count",
> >                                 test_acpi_q35_tcg_thread_count);
> > +                qtest_add_func("acpi/q35/thread-count2",
> > +                               test_acpi_q35_tcg_thread_count2);
> >              }
> >              if (qtest_has_device("virtio-iommu-pci")) {
> >                  qtest_add_func("acpi/q35/viot", test_acpi_q35_viot);
> > -- 
> > 2.34.1
>
diff mbox series

Patch

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index f8e3e349e09f..58119d8979c6 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -96,6 +96,7 @@  typedef struct {
     uint8_t smbios_core_count;
     uint16_t smbios_core_count2;
     uint8_t smbios_thread_count;
+    uint16_t smbios_thread_count2;
     uint8_t *required_struct_types;
     int required_struct_types_len;
     int type4_count;
@@ -644,6 +645,7 @@  static void smbios_cpu_test(test_data *data, uint32_t addr,
     uint8_t thread_count, expected_thread_count = data->smbios_thread_count;
     uint16_t speed, expected_speed[2];
     uint16_t core_count2, expected_core_count2 = data->smbios_core_count2;
+    uint16_t thread_count2, expected_thread_count2 = data->smbios_thread_count2;
     int offset[2];
     int i;
 
@@ -680,6 +682,15 @@  static void smbios_cpu_test(test_data *data, uint32_t addr,
         if (expected_core_count == 0xFF && expected_core_count2) {
             g_assert_cmpuint(core_count2, ==, expected_core_count2);
         }
+
+        thread_count2 = qtest_readw(data->qts,
+                            addr + offsetof(struct smbios_type_4,
+                            thread_count2));
+
+        /* Thread Count has reached its limit, checking Thread Count 2 */
+        if (expected_thread_count == 0xFF && expected_thread_count2) {
+            g_assert_cmpuint(thread_count2, ==, expected_thread_count2);
+        }
     }
 }
 
@@ -1050,6 +1061,7 @@  static void test_acpi_q35_tcg_thread_count(void)
         .required_struct_types = base_required_struct_types,
         .required_struct_types_len = ARRAY_SIZE(base_required_struct_types),
         .smbios_thread_count = 27,
+        .smbios_thread_count2 = 27,
     };
 
     test_acpi_one("-machine smbios-entry-point-type=64 "
@@ -1058,6 +1070,23 @@  static void test_acpi_q35_tcg_thread_count(void)
     free_test_data(&data);
 }
 
+static void test_acpi_q35_tcg_thread_count2(void)
+{
+    test_data data = {
+        .machine = MACHINE_Q35,
+        .variant = ".thread-count2",
+        .required_struct_types = base_required_struct_types,
+        .required_struct_types_len = ARRAY_SIZE(base_required_struct_types),
+        .smbios_thread_count = 0xFF,
+        .smbios_thread_count2 = 260,
+    };
+
+    test_acpi_one("-machine smbios-entry-point-type=64 "
+                  "-smp cpus=210,maxcpus=520,sockets=2,dies=2,cores=65,threads=2",
+                  &data);
+    free_test_data(&data);
+}
+
 static void test_acpi_q35_tcg_bridge(void)
 {
     test_data data = {};
@@ -2216,6 +2245,8 @@  int main(int argc, char *argv[])
                                test_acpi_q35_tcg_core_count2);
                 qtest_add_func("acpi/q35/thread-count",
                                test_acpi_q35_tcg_thread_count);
+                qtest_add_func("acpi/q35/thread-count2",
+                               test_acpi_q35_tcg_thread_count2);
             }
             if (qtest_has_device("virtio-iommu-pci")) {
                 qtest_add_func("acpi/q35/viot", test_acpi_q35_viot);