Re: [kvm-unit-tests PATCH v2 3/3] s390x: smp: add tests for calls in wait state

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

 



Quoting Janosch Frank (2022-07-22 10:30:46)
> On 7/22/22 09:20, Nico Boehr wrote:
> > Under PV, SIGP ecall requires some special handling by the hypervisor
> > when the receiving CPU is in enabled wait. Hence, we should have
> > coverage for the various SIGP call orders when the receiving CPU is in
> > enabled wait.
> 
> When the SIGP interpretation facility is in use a SIGP external call to 
> a waiting CPU will result in an exit of the calling cpu. For non-pv 
> guests it's a code 56 (partial execution) exit otherwise its a code 108 
> (secure instruction notification) exit. Those exits are handled 
> differently from a normal SIGP instruction intercept that happens 
> without interpretation and hence need to be tested.

Changed.

> > 
> > The ecall test currently fails under PV due to a KVM bug under
> > investigation.
> 
> That shouldn't be true anymore

Yeah, it's not yet in mainline, but is soon gonna be. I will remove this.

> > 
> > Signed-off-by: Nico Boehr <nrb@xxxxxxxxxxxxx>
> > ---
> >   s390x/smp.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >   1 file changed, 75 insertions(+)
> > 
> > diff --git a/s390x/smp.c b/s390x/smp.c
> > index 683b0e618a48..eed7aa3564de 100644
> > --- a/s390x/smp.c
> > +++ b/s390x/smp.c
> > @@ -347,6 +347,80 @@ static void test_calls(void)
> >       }
> >   }
> >   
> > +static void call_in_wait_ext_int_fixup(struct stack_frame_int *stack)
> > +{
> > +     /* leave wait after returning */
> 
> Clear wait bit so we don't immediately wait again after the fixup

Changed.

> 
> > +     lowcore.ext_old_psw.mask &= ~PSW_MASK_WAIT;
> > +
> > +     stack->crs[0] &= ~current_sigp_call_case->cr0_bit;
> 
> You need a mask but have a bit, no?
> 
> ~BIT(current_sigp_call_case->cr0_bit)

Oopsie, thanks, good find.

This reminds me the ctl_clear_bit() I added in call_in_wait_received() is completely useless, since I handle it here. So, I will remove it there as well.

[...]
> > +static void test_calls_in_wait(void)
> > +{
> > +     int i;
> > +     struct psw psw;
> > +
> > +     report_prefix_push("psw wait");
> > +     for (i = 0; i < ARRAY_SIZE(cases_sigp_call); i++) {
> > +             current_sigp_call_case = &cases_sigp_call[i];
> > +
> > +             report_prefix_push(current_sigp_call_case->name);
> > +             if (!current_sigp_call_case->supports_pv && uv_os_is_guest()) {
> > +                     report_skip("Not supported under PV");
> > +                     report_prefix_pop();
> > +                     continue;
> > +             }
> > +
> /* Let the secondary CPU setup the external mask and the external 
> interrupt cleanup function */

Changed.




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux