2020-06-08 12:23:48

by Prarit Bhargava

[permalink] [raw]
Subject: [PATCH v2] x86/split_lock: Sanitize userspace and guest error output

There are two problems with kernel messages in fatal mode that
were found during testing of guests and userspace programs.

The first is that no kernel message is output when the split lock detector
is triggered with a userspace program. As a result the userspace process
dies from receiving SIGBUS with no indication to the user of what caused
the process to die.

The second problem is that only the first triggering guest causes a kernel
message to be output because the message is output with pr_warn_once().
This also results in a loss of information to the user.

While fixing these I noticed that the same message was being output
three times so I'm cleaning that up too.

Fix fatal mode output, and use consistent messages for fatal and
warn modes for both userspace and guests.

Signed-off-by: Prarit Bhargava <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: [email protected]
Cc: "H. Peter Anvin" <[email protected]>
Cc: Tony Luck <[email protected]>
Cc: "Peter Zijlstra (Intel)" <[email protected]>
Cc: Sean Christopherson <[email protected]>
Cc: Rahul Tanwar <[email protected]>
Cc: Xiaoyao Li <[email protected]>
Cc: Ricardo Neri <[email protected]>
Cc: Dave Hansen <[email protected]>
---
v2: Do not output a message if CPL 3 Alignment Check is turned on (xiaoyao.li)

arch/x86/kernel/cpu/intel.c | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 166d7c355896..e02ec81fe1eb 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -1074,10 +1074,17 @@ static void split_lock_init(void)
split_lock_verify_msr(sld_state != sld_off);
}

-static void split_lock_warn(unsigned long ip)
+static bool split_lock_warn(unsigned long ip, int fatal_no_warn)
{
- pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
- current->comm, current->pid, ip);
+ if (fatal_no_warn)
+ return false;
+
+ pr_warn_ratelimited("#AC: %s/%d %ssplit_lock trap at address: 0x%lx\n",
+ current->comm, current->pid,
+ sld_state == sld_fatal ? "fatal " : "", ip);
+
+ if (sld_state == sld_fatal)
+ return false;

/*
* Disable the split lock detection for this task so it can make
@@ -1086,18 +1093,13 @@ static void split_lock_warn(unsigned long ip)
*/
sld_update_msr(false);
set_tsk_thread_flag(current, TIF_SLD);
+ return true;
}

bool handle_guest_split_lock(unsigned long ip)
{
- if (sld_state == sld_warn) {
- split_lock_warn(ip);
+ if (split_lock_warn(ip, 0))
return true;
- }
-
- pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n",
- current->comm, current->pid,
- sld_state == sld_fatal ? "fatal" : "bogus", ip);

current->thread.error_code = 0;
current->thread.trap_nr = X86_TRAP_AC;
@@ -1108,10 +1110,7 @@ EXPORT_SYMBOL_GPL(handle_guest_split_lock);

bool handle_user_split_lock(struct pt_regs *regs, long error_code)
{
- if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal)
- return false;
- split_lock_warn(regs->ip);
- return true;
+ return split_lock_warn(regs->ip, regs->flags & X86_EFLAGS_AC);
}

/*
--
2.21.3


2020-06-08 17:20:12

by Sean Christopherson

[permalink] [raw]
Subject: Re: [PATCH v2] x86/split_lock: Sanitize userspace and guest error output

On Mon, Jun 08, 2020 at 08:21:14AM -0400, Prarit Bhargava wrote:
> diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
> index 166d7c355896..e02ec81fe1eb 100644
> --- a/arch/x86/kernel/cpu/intel.c
> +++ b/arch/x86/kernel/cpu/intel.c
> @@ -1074,10 +1074,17 @@ static void split_lock_init(void)
> split_lock_verify_msr(sld_state != sld_off);
> }
>
> -static void split_lock_warn(unsigned long ip)
> +static bool split_lock_warn(unsigned long ip, int fatal_no_warn)
> {
> - pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
> - current->comm, current->pid, ip);
> + if (fatal_no_warn)
> + return false;

This misses the point Xiaoyao was making. If EFLAGS.AC=1 then the #AC is a
legacy alignment check fault and should not be treated as a split-lock #AC.
The basic premise of the patch makes sense, but the end result is confusing
because incorporating "fatal" and the EFLAGS.AC state into split_lock_warn()
bastardizes both the "split_lock" and "warn" aspects of the function.

E.g. something like this yields the same net effect, it's just organized
differently. If so desired, the "bogus" message could be dropped via
Xiaoyao's prep patch[*] so that this change would only affect the sld_fatal
messages.

[*] https://lkml.kernel.org/r/[email protected]


diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 23fd5f319908..1aad0b8e394c 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -1071,11 +1071,14 @@ static void split_lock_init(void)
split_lock_verify_msr(sld_state != sld_off);
}

-static void split_lock_warn(unsigned long ip)
+static bool handle_split_lock(unsigned long ip)
{
pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
current->comm, current->pid, ip);

+ if (sld_state != sld_warn)
+ return false;
+
/*
* Disable the split lock detection for this task so it can make
* progress and set TIF_SLD so the detection is re-enabled via
@@ -1083,18 +1086,13 @@ static void split_lock_warn(unsigned long ip)
*/
sld_update_msr(false);
set_tsk_thread_flag(current, TIF_SLD);
+ return true;
}

bool handle_guest_split_lock(unsigned long ip)
{
- if (sld_state == sld_warn) {
- split_lock_warn(ip);
+ if (handle_split_lock(ip))
return true;
- }
-
- pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n",
- current->comm, current->pid,
- sld_state == sld_fatal ? "fatal" : "bogus", ip);

current->thread.error_code = 0;
current->thread.trap_nr = X86_TRAP_AC;
@@ -1105,10 +1103,10 @@ EXPORT_SYMBOL_GPL(handle_guest_split_lock);

bool handle_user_split_lock(struct pt_regs *regs, long error_code)
{
- if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal)
+ if (regs->flags & X86_EFLAGS_AC)
return false;
- split_lock_warn(regs->ip);
- return true;
+
+ return handle_split_lock(regs->ip);
}

/*


> +
> + pr_warn_ratelimited("#AC: %s/%d %ssplit_lock trap at address: 0x%lx\n",
> + current->comm, current->pid,
> + sld_state == sld_fatal ? "fatal " : "", ip);
> +
> + if (sld_state == sld_fatal)
> + return false;
>
> /*
> * Disable the split lock detection for this task so it can make
> @@ -1086,18 +1093,13 @@ static void split_lock_warn(unsigned long ip)
> */
> sld_update_msr(false);
> set_tsk_thread_flag(current, TIF_SLD);
> + return true;
> }
>
> bool handle_guest_split_lock(unsigned long ip)
> {
> - if (sld_state == sld_warn) {
> - split_lock_warn(ip);
> + if (split_lock_warn(ip, 0))
> return true;
> - }
> -
> - pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n",
> - current->comm, current->pid,
> - sld_state == sld_fatal ? "fatal" : "bogus", ip);
>
> current->thread.error_code = 0;
> current->thread.trap_nr = X86_TRAP_AC;
> @@ -1108,10 +1110,7 @@ EXPORT_SYMBOL_GPL(handle_guest_split_lock);
>
> bool handle_user_split_lock(struct pt_regs *regs, long error_code)
> {
> - if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal)
> - return false;
> - split_lock_warn(regs->ip);
> - return true;
> + return split_lock_warn(regs->ip, regs->flags & X86_EFLAGS_AC);
> }
>
> /*
> --
> 2.21.3
>

2020-06-11 17:58:29

by Prarit Bhargava

[permalink] [raw]
Subject: Re: [PATCH v2] x86/split_lock: Sanitize userspace and guest error output



On 6/8/20 1:15 PM, Sean Christopherson wrote:
> On Mon, Jun 08, 2020 at 08:21:14AM -0400, Prarit Bhargava wrote:
>> diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
>> index 166d7c355896..e02ec81fe1eb 100644
>> --- a/arch/x86/kernel/cpu/intel.c
>> +++ b/arch/x86/kernel/cpu/intel.c
>> @@ -1074,10 +1074,17 @@ static void split_lock_init(void)
>> split_lock_verify_msr(sld_state != sld_off);
>> }
>>
>> -static void split_lock_warn(unsigned long ip)
>> +static bool split_lock_warn(unsigned long ip, int fatal_no_warn)
>> {
>> - pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
>> - current->comm, current->pid, ip);
>> + if (fatal_no_warn)
>> + return false;
>
> This misses the point Xiaoyao was making. If EFLAGS.AC=1 then the #AC is a
> legacy alignment check fault and should not be treated as a split-lock #AC.
> The basic premise of the patch makes sense, but the end result is confusing
> because incorporating "fatal" and the EFLAGS.AC state into split_lock_warn()
> bastardizes both the "split_lock" and "warn" aspects of the function.
>
> E.g. something like this yields the same net effect, it's just organized
> differently. If so desired, the "bogus" message could be dropped via
> Xiaoyao's prep patch[*] so that this change would only affect the sld_fatal
> messages.
>
> [*] https://lkml.kernel.org/r/[email protected]
>


Sean, I'll just go with your patch below. It's good enough. I'll add a
Signed-off-by from you as well.

P.

>
> diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
> index 23fd5f319908..1aad0b8e394c 100644
> --- a/arch/x86/kernel/cpu/intel.c
> +++ b/arch/x86/kernel/cpu/intel.c
> @@ -1071,11 +1071,14 @@ static void split_lock_init(void)
> split_lock_verify_msr(sld_state != sld_off);
> }
>
> -static void split_lock_warn(unsigned long ip)
> +static bool handle_split_lock(unsigned long ip)
> {
> pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
> current->comm, current->pid, ip);
>
> + if (sld_state != sld_warn)
> + return false;
> +
> /*
> * Disable the split lock detection for this task so it can make
> * progress and set TIF_SLD so the detection is re-enabled via
> @@ -1083,18 +1086,13 @@ static void split_lock_warn(unsigned long ip)
> */
> sld_update_msr(false);
> set_tsk_thread_flag(current, TIF_SLD);
> + return true;
> }
>
> bool handle_guest_split_lock(unsigned long ip)
> {
> - if (sld_state == sld_warn) {
> - split_lock_warn(ip);
> + if (handle_split_lock(ip))
> return true;
> - }
> -
> - pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n",
> - current->comm, current->pid,
> - sld_state == sld_fatal ? "fatal" : "bogus", ip);
>
> current->thread.error_code = 0;
> current->thread.trap_nr = X86_TRAP_AC;
> @@ -1105,10 +1103,10 @@ EXPORT_SYMBOL_GPL(handle_guest_split_lock);
>
> bool handle_user_split_lock(struct pt_regs *regs, long error_code)
> {
> - if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal)
> + if (regs->flags & X86_EFLAGS_AC)
> return false;
> - split_lock_warn(regs->ip);
> - return true;
> +
> + return handle_split_lock(regs->ip);
> }
>
> /*
>
>
>> +
>> + pr_warn_ratelimited("#AC: %s/%d %ssplit_lock trap at address: 0x%lx\n",
>> + current->comm, current->pid,
>> + sld_state == sld_fatal ? "fatal " : "", ip);
>> +
>> + if (sld_state == sld_fatal)
>> + return false;
>>
>> /*
>> * Disable the split lock detection for this task so it can make
>> @@ -1086,18 +1093,13 @@ static void split_lock_warn(unsigned long ip)
>> */
>> sld_update_msr(false);
>> set_tsk_thread_flag(current, TIF_SLD);
>> + return true;
>> }
>>
>> bool handle_guest_split_lock(unsigned long ip)
>> {
>> - if (sld_state == sld_warn) {
>> - split_lock_warn(ip);
>> + if (split_lock_warn(ip, 0))
>> return true;
>> - }
>> -
>> - pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n",
>> - current->comm, current->pid,
>> - sld_state == sld_fatal ? "fatal" : "bogus", ip);
>>
>> current->thread.error_code = 0;
>> current->thread.trap_nr = X86_TRAP_AC;
>> @@ -1108,10 +1110,7 @@ EXPORT_SYMBOL_GPL(handle_guest_split_lock);
>>
>> bool handle_user_split_lock(struct pt_regs *regs, long error_code)
>> {
>> - if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal)
>> - return false;
>> - split_lock_warn(regs->ip);
>> - return true;
>> + return split_lock_warn(regs->ip, regs->flags & X86_EFLAGS_AC);
>> }
>>
>> /*
>> --
>> 2.21.3
>>
>

2020-06-11 18:09:35

by Sean Christopherson

[permalink] [raw]
Subject: Re: [PATCH v2] x86/split_lock: Sanitize userspace and guest error output

On Thu, Jun 11, 2020 at 01:37:19PM -0400, Prarit Bhargava wrote:
>
>
> On 6/8/20 1:15 PM, Sean Christopherson wrote:
> > On Mon, Jun 08, 2020 at 08:21:14AM -0400, Prarit Bhargava wrote:
> >> diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
> >> index 166d7c355896..e02ec81fe1eb 100644
> >> --- a/arch/x86/kernel/cpu/intel.c
> >> +++ b/arch/x86/kernel/cpu/intel.c
> >> @@ -1074,10 +1074,17 @@ static void split_lock_init(void)
> >> split_lock_verify_msr(sld_state != sld_off);
> >> }
> >>
> >> -static void split_lock_warn(unsigned long ip)
> >> +static bool split_lock_warn(unsigned long ip, int fatal_no_warn)
> >> {
> >> - pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
> >> - current->comm, current->pid, ip);
> >> + if (fatal_no_warn)
> >> + return false;
> >
> > This misses the point Xiaoyao was making. If EFLAGS.AC=1 then the #AC is a
> > legacy alignment check fault and should not be treated as a split-lock #AC.
> > The basic premise of the patch makes sense, but the end result is confusing
> > because incorporating "fatal" and the EFLAGS.AC state into split_lock_warn()
> > bastardizes both the "split_lock" and "warn" aspects of the function.
> >
> > E.g. something like this yields the same net effect, it's just organized
> > differently. If so desired, the "bogus" message could be dropped via
> > Xiaoyao's prep patch[*] so that this change would only affect the sld_fatal
> > messages.
> >
> > [*] https://lkml.kernel.org/r/[email protected]
> >
> >
>
> Sean, I will just take your patch to make things easy. I will add you as a
> Signed-off-by.
>
> /me is testing the patch right now

Sure, here's an official SOB if it happens to work.

Signed-off-by: Sean Christopherson <[email protected]>

> > diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
> > index 23fd5f319908..1aad0b8e394c 100644
> > --- a/arch/x86/kernel/cpu/intel.c
> > +++ b/arch/x86/kernel/cpu/intel.c
> > @@ -1071,11 +1071,14 @@ static void split_lock_init(void)
> > split_lock_verify_msr(sld_state != sld_off);
> > }
> >
> > -static void split_lock_warn(unsigned long ip)
> > +static bool handle_split_lock(unsigned long ip)
> > {
> > pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
> > current->comm, current->pid, ip);
> >
> > + if (sld_state != sld_warn)
> > + return false;
> > +
> > /*
> > * Disable the split lock detection for this task so it can make
> > * progress and set TIF_SLD so the detection is re-enabled via
> > @@ -1083,18 +1086,13 @@ static void split_lock_warn(unsigned long ip)
> > */
> > sld_update_msr(false);
> > set_tsk_thread_flag(current, TIF_SLD);
> > + return true;
> > }
> >
> > bool handle_guest_split_lock(unsigned long ip)
> > {
> > - if (sld_state == sld_warn) {
> > - split_lock_warn(ip);
> > + if (handle_split_lock(ip))
> > return true;
> > - }
> > -
> > - pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n",
> > - current->comm, current->pid,
> > - sld_state == sld_fatal ? "fatal" : "bogus", ip);
> >
> > current->thread.error_code = 0;
> > current->thread.trap_nr = X86_TRAP_AC;
> > @@ -1105,10 +1103,10 @@ EXPORT_SYMBOL_GPL(handle_guest_split_lock);
> >
> > bool handle_user_split_lock(struct pt_regs *regs, long error_code)
> > {
> > - if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal)
> > + if (regs->flags & X86_EFLAGS_AC)
> > return false;
> > - split_lock_warn(regs->ip);
> > - return true;
> > +
> > + return handle_split_lock(regs->ip);
> > }
> >
> > /*
> >
> >
> >> +
> >> + pr_warn_ratelimited("#AC: %s/%d %ssplit_lock trap at address: 0x%lx\n",
> >> + current->comm, current->pid,
> >> + sld_state == sld_fatal ? "fatal " : "", ip);
> >> +
> >> + if (sld_state == sld_fatal)
> >> + return false;
> >>
> >> /*
> >> * Disable the split lock detection for this task so it can make
> >> @@ -1086,18 +1093,13 @@ static void split_lock_warn(unsigned long ip)
> >> */
> >> sld_update_msr(false);
> >> set_tsk_thread_flag(current, TIF_SLD);
> >> + return true;
> >> }
> >>
> >> bool handle_guest_split_lock(unsigned long ip)
> >> {
> >> - if (sld_state == sld_warn) {
> >> - split_lock_warn(ip);
> >> + if (split_lock_warn(ip, 0))
> >> return true;
> >> - }
> >> -
> >> - pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n",
> >> - current->comm, current->pid,
> >> - sld_state == sld_fatal ? "fatal" : "bogus", ip);
> >>
> >> current->thread.error_code = 0;
> >> current->thread.trap_nr = X86_TRAP_AC;
> >> @@ -1108,10 +1110,7 @@ EXPORT_SYMBOL_GPL(handle_guest_split_lock);
> >>
> >> bool handle_user_split_lock(struct pt_regs *regs, long error_code)
> >> {
> >> - if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal)
> >> - return false;
> >> - split_lock_warn(regs->ip);
> >> - return true;
> >> + return split_lock_warn(regs->ip, regs->flags & X86_EFLAGS_AC);
> >> }
> >>
> >> /*
> >> --
> >> 2.21.3
> >>
> >
>

2020-06-11 20:10:26

by Prarit Bhargava

[permalink] [raw]
Subject: Re: [PATCH v2] x86/split_lock: Sanitize userspace and guest error output



On 6/8/20 1:15 PM, Sean Christopherson wrote:
> On Mon, Jun 08, 2020 at 08:21:14AM -0400, Prarit Bhargava wrote:
>> diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
>> index 166d7c355896..e02ec81fe1eb 100644
>> --- a/arch/x86/kernel/cpu/intel.c
>> +++ b/arch/x86/kernel/cpu/intel.c
>> @@ -1074,10 +1074,17 @@ static void split_lock_init(void)
>> split_lock_verify_msr(sld_state != sld_off);
>> }
>>
>> -static void split_lock_warn(unsigned long ip)
>> +static bool split_lock_warn(unsigned long ip, int fatal_no_warn)
>> {
>> - pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
>> - current->comm, current->pid, ip);
>> + if (fatal_no_warn)
>> + return false;
>
> This misses the point Xiaoyao was making. If EFLAGS.AC=1 then the #AC is a
> legacy alignment check fault and should not be treated as a split-lock #AC.
> The basic premise of the patch makes sense, but the end result is confusing
> because incorporating "fatal" and the EFLAGS.AC state into split_lock_warn()
> bastardizes both the "split_lock" and "warn" aspects of the function.
>
> E.g. something like this yields the same net effect, it's just organized
> differently. If so desired, the "bogus" message could be dropped via
> Xiaoyao's prep patch[*] so that this change would only affect the sld_fatal
> messages.
>
> [*] https://lkml.kernel.org/r/[email protected]
>
>

Sean, I will just take your patch to make things easy. I will add you as a
Signed-off-by.

/me is testing the patch right now

P.

> diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
> index 23fd5f319908..1aad0b8e394c 100644
> --- a/arch/x86/kernel/cpu/intel.c
> +++ b/arch/x86/kernel/cpu/intel.c
> @@ -1071,11 +1071,14 @@ static void split_lock_init(void)
> split_lock_verify_msr(sld_state != sld_off);
> }
>
> -static void split_lock_warn(unsigned long ip)
> +static bool handle_split_lock(unsigned long ip)
> {
> pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
> current->comm, current->pid, ip);
>
> + if (sld_state != sld_warn)
> + return false;
> +
> /*
> * Disable the split lock detection for this task so it can make
> * progress and set TIF_SLD so the detection is re-enabled via
> @@ -1083,18 +1086,13 @@ static void split_lock_warn(unsigned long ip)
> */
> sld_update_msr(false);
> set_tsk_thread_flag(current, TIF_SLD);
> + return true;
> }
>
> bool handle_guest_split_lock(unsigned long ip)
> {
> - if (sld_state == sld_warn) {
> - split_lock_warn(ip);
> + if (handle_split_lock(ip))
> return true;
> - }
> -
> - pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n",
> - current->comm, current->pid,
> - sld_state == sld_fatal ? "fatal" : "bogus", ip);
>
> current->thread.error_code = 0;
> current->thread.trap_nr = X86_TRAP_AC;
> @@ -1105,10 +1103,10 @@ EXPORT_SYMBOL_GPL(handle_guest_split_lock);
>
> bool handle_user_split_lock(struct pt_regs *regs, long error_code)
> {
> - if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal)
> + if (regs->flags & X86_EFLAGS_AC)
> return false;
> - split_lock_warn(regs->ip);
> - return true;
> +
> + return handle_split_lock(regs->ip);
> }
>
> /*
>
>
>> +
>> + pr_warn_ratelimited("#AC: %s/%d %ssplit_lock trap at address: 0x%lx\n",
>> + current->comm, current->pid,
>> + sld_state == sld_fatal ? "fatal " : "", ip);
>> +
>> + if (sld_state == sld_fatal)
>> + return false;
>>
>> /*
>> * Disable the split lock detection for this task so it can make
>> @@ -1086,18 +1093,13 @@ static void split_lock_warn(unsigned long ip)
>> */
>> sld_update_msr(false);
>> set_tsk_thread_flag(current, TIF_SLD);
>> + return true;
>> }
>>
>> bool handle_guest_split_lock(unsigned long ip)
>> {
>> - if (sld_state == sld_warn) {
>> - split_lock_warn(ip);
>> + if (split_lock_warn(ip, 0))
>> return true;
>> - }
>> -
>> - pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n",
>> - current->comm, current->pid,
>> - sld_state == sld_fatal ? "fatal" : "bogus", ip);
>>
>> current->thread.error_code = 0;
>> current->thread.trap_nr = X86_TRAP_AC;
>> @@ -1108,10 +1110,7 @@ EXPORT_SYMBOL_GPL(handle_guest_split_lock);
>>
>> bool handle_user_split_lock(struct pt_regs *regs, long error_code)
>> {
>> - if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal)
>> - return false;
>> - split_lock_warn(regs->ip);
>> - return true;
>> + return split_lock_warn(regs->ip, regs->flags & X86_EFLAGS_AC);
>> }
>>
>> /*
>> --
>> 2.21.3
>>
>