diff mbox series

[v22,16/20] tests/avocado: s390x cpu topology entitlement tests

Message ID 20230901155812.2696560-17-nsg@linux.ibm.com
State New
Headers show
Series s390x: CPU Topology | expand

Commit Message

Nina Schoetterl-Glausch Sept. 1, 2023, 3:58 p.m. UTC
From: Pierre Morel <pmorel@linux.ibm.com>

Test changes in the entitlement from both a guest and a host point of
view, depending on the polarization.

Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
Co-developed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
---
 tests/avocado/s390_topology.py | 55 ++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

Comments

Nina Schoetterl-Glausch Sept. 4, 2023, 7:51 p.m. UTC | #1
On Fri, 2023-09-01 at 17:58 +0200, Nina Schoetterl-Glausch wrote:
> From: Pierre Morel <pmorel@linux.ibm.com>
> 
> Test changes in the entitlement from both a guest and a host point of
> view, depending on the polarization.
> 
> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
> Co-developed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
> Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>

Reviewed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>

> ---
>  tests/avocado/s390_topology.py | 55 ++++++++++++++++++++++++++++++++++
>  1 file changed, 55 insertions(+)
> 
> diff --git a/tests/avocado/s390_topology.py b/tests/avocado/s390_topology.py
> index d7ee36cb89..733093723a 100644
> --- a/tests/avocado/s390_topology.py
> +++ b/tests/avocado/s390_topology.py
> @@ -243,3 +243,58 @@ def test_polarization(self):
>          res = self.vm.qmp('query-s390x-cpu-polarization')
>          self.assertEqual(res['return']['polarization'], 'horizontal')
>          self.check_topology(0, 0, 0, 0, 'medium', False)
> +
> +
> +    def check_polarization(self, polarization):
> +        """
> +        We need the polarization change to get stabilized in kernel
> +        before we check it through the sysfs.
> +        """

IMO this should be a comment, not a function doc.
#We need to wait for the change to have been propagated to the kernel

> +        exec_command_and_wait_for_pattern(self,
> +                """ sleep 1 ;
> +                    /bin/cat /sys/devices/system/cpu/cpu0/polarization """,
> +                polarization)

[...]
Thomas Huth Sept. 7, 2023, 9:05 a.m. UTC | #2
On 01/09/2023 17.58, Nina Schoetterl-Glausch wrote:
> From: Pierre Morel <pmorel@linux.ibm.com>
> 
> Test changes in the entitlement from both a guest and a host point of
> view, depending on the polarization.
> 
> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
> Co-developed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
> Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
> ---
>   tests/avocado/s390_topology.py | 55 ++++++++++++++++++++++++++++++++++
>   1 file changed, 55 insertions(+)
> 
> diff --git a/tests/avocado/s390_topology.py b/tests/avocado/s390_topology.py
> index d7ee36cb89..733093723a 100644
> --- a/tests/avocado/s390_topology.py
> +++ b/tests/avocado/s390_topology.py
> @@ -243,3 +243,58 @@ def test_polarization(self):
>           res = self.vm.qmp('query-s390x-cpu-polarization')
>           self.assertEqual(res['return']['polarization'], 'horizontal')
>           self.check_topology(0, 0, 0, 0, 'medium', False)
> +
> +
> +    def check_polarization(self, polarization):
> +        """
> +        We need the polarization change to get stabilized in kernel
> +        before we check it through the sysfs.
> +        """
> +        exec_command_and_wait_for_pattern(self,
> +                """ sleep 1 ;
> +                    /bin/cat /sys/devices/system/cpu/cpu0/polarization """,
> +                polarization)

Using "sleep" in a function that is called multiple times will blow up the 
testing time quite a bit ... could this be done in a different way instead, 
e.g. by polling the sysfs file for the right value, or maybe there is 
something in the "dmesg" output that could be used as a reference?

  Thomas
Nina Schoetterl-Glausch Sept. 8, 2023, 6:30 p.m. UTC | #3
On Thu, 2023-09-07 at 11:05 +0200, Thomas Huth wrote:
> On 01/09/2023 17.58, Nina Schoetterl-Glausch wrote:
> > From: Pierre Morel <pmorel@linux.ibm.com>
> > 
> > Test changes in the entitlement from both a guest and a host point of
> > view, depending on the polarization.
> > 
> > Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
> > Co-developed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
> > Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
> > ---
> >   tests/avocado/s390_topology.py | 55 ++++++++++++++++++++++++++++++++++
> >   1 file changed, 55 insertions(+)
> > 
> > diff --git a/tests/avocado/s390_topology.py b/tests/avocado/s390_topology.py
> > index d7ee36cb89..733093723a 100644
> > --- a/tests/avocado/s390_topology.py
> > +++ b/tests/avocado/s390_topology.py
> > @@ -243,3 +243,58 @@ def test_polarization(self):
> >           res = self.vm.qmp('query-s390x-cpu-polarization')
> >           self.assertEqual(res['return']['polarization'], 'horizontal')
> >           self.check_topology(0, 0, 0, 0, 'medium', False)
> > +
> > +
> > +    def check_polarization(self, polarization):
> > +        """
> > +        We need the polarization change to get stabilized in kernel
> > +        before we check it through the sysfs.
> > +        """
> > +        exec_command_and_wait_for_pattern(self,
> > +                """ sleep 1 ;
> > +                    /bin/cat /sys/devices/system/cpu/cpu0/polarization """,
> > +                polarization)
> 
> Using "sleep" in a function that is called multiple times will blow up the 
> testing time quite a bit ... could this be done in a different way instead, 
> e.g. by polling the sysfs file for the right value, or maybe there is 
> something in the "dmesg" output that could be used as a reference?

Nothing in dmesg.
This works:

def check_polarization(self, polarization):
    #We need to wait for the change to have been propagated to the kernel
    exec_command_and_wait_for_pattern(self,
        "\n".join([
            "timeout 1 sh -c 'while true",
            'do',
            '    syspath="/sys/devices/system/cpu/cpu0/polarization"',
            '    polarization="$(cat "$syspath")" || exit',
           f'    if [ "$polarization" = "{polarization}" ]; then',
            '        exit 0',
            '    fi',
            '    sleep 0.01',
            #searched for strings mustn't show up in command, '' to obfuscate
            "done' && echo succ''ess || echo fail''ure",
        ]),
        "success", "failure")

> 
>   Thomas
> 
>
diff mbox series

Patch

diff --git a/tests/avocado/s390_topology.py b/tests/avocado/s390_topology.py
index d7ee36cb89..733093723a 100644
--- a/tests/avocado/s390_topology.py
+++ b/tests/avocado/s390_topology.py
@@ -243,3 +243,58 @@  def test_polarization(self):
         res = self.vm.qmp('query-s390x-cpu-polarization')
         self.assertEqual(res['return']['polarization'], 'horizontal')
         self.check_topology(0, 0, 0, 0, 'medium', False)
+
+
+    def check_polarization(self, polarization):
+        """
+        We need the polarization change to get stabilized in kernel
+        before we check it through the sysfs.
+        """
+        exec_command_and_wait_for_pattern(self,
+                """ sleep 1 ;
+                    /bin/cat /sys/devices/system/cpu/cpu0/polarization """,
+                polarization)
+
+
+    def test_entitlement(self):
+        """
+        This test verifies that QEMU modifies the entitlement
+        after a guest request and that the guest sees the change.
+
+        :avocado: tags=arch:s390x
+        :avocado: tags=machine:s390-ccw-virtio
+        """
+        self.kernel_init()
+        self.vm.launch()
+        self.wait_until_booted()
+
+        self.system_init()
+
+        self.check_polarization('horizontal')
+        self.check_topology(0, 0, 0, 0, 'medium', False)
+
+        self.guest_set_dispatching('1')
+        self.check_polarization('vertical:medium')
+        self.check_topology(0, 0, 0, 0, 'medium', False)
+
+        res = self.vm.qmp('set-cpu-topology',
+                          {'core-id': 0, 'entitlement': 'low'})
+        self.assertEqual(res['return'], {})
+        self.check_polarization('vertical:low')
+        self.check_topology(0, 0, 0, 0, 'low', False)
+
+        res = self.vm.qmp('set-cpu-topology',
+                          {'core-id': 0, 'entitlement': 'medium'})
+        self.assertEqual(res['return'], {})
+        self.check_polarization('vertical:medium')
+        self.check_topology(0, 0, 0, 0, 'medium', False)
+
+        res = self.vm.qmp('set-cpu-topology',
+                          {'core-id': 0, 'entitlement': 'high'})
+        self.assertEqual(res['return'], {})
+        self.check_polarization('vertical:high')
+        self.check_topology(0, 0, 0, 0, 'high', False)
+
+        self.guest_set_dispatching('0');
+        self.check_polarization("horizontal")
+        self.check_topology(0, 0, 0, 0, 'high', False)