RE: [PATCH 2/4] x86/bus_lock: Handle warn and fatal in #DB for bus lock

2020-11-10 Thread Yu, Fenghua
Hi, Peter,

> On Sun, Nov 08, 2020 at 04:29:16AM +, Fenghua Yu wrote:
> > split_lock_detect=
> > #AC for split lock  #DB for bus lock
> >
> > off Do nothing  Do nothing
> >
> > warnKernel OOPs Warn once per task and
> > Warn once per task and  and continues to run.
> > disable future checking When both features are
> > supported, warn in #DB
> >
> > fatal   Kernel OOPs Send SIGBUS to user
> > Send SIGBUS to user
> > When both features are
> > supported, fatal in #AC.
> 
> > +void handle_bus_lock(struct pt_regs *regs) {
> > +   if (!bld)
> > +   return;
> > +
> > +   pr_warn_ratelimited("#DB: %s/%d took a bus_lock trap at address:
> 0x%lx\n",
> > +   current->comm, current->pid, regs->ip); }
> 
> So the Changelog above, and the state_show() below, seem to suggest there
> should be SIGBUS code in #DB, but I'm having trouble spotting it.

You are right. The SIGBUS is missing here. Somehow my tests didn't capture the 
issue.

I will add:
+   force_sig_fault(SIGBUS, BUS_ADRALN, NULL);
to send SIGBUS in fatal case for #DB bus lock.

Thank you very much for your review!

-Fenghua



Re: [PATCH 2/4] x86/bus_lock: Handle warn and fatal in #DB for bus lock

2020-11-09 Thread Peter Zijlstra
On Sun, Nov 08, 2020 at 04:29:16AM +, Fenghua Yu wrote:
> split_lock_detect=
>   #AC for split lock  #DB for bus lock
> 
> off   Do nothing  Do nothing
> 
> warn  Kernel OOPs Warn once per task and
>   Warn once per task and  and continues to run.
>   disable future checking When both features are
>   supported, warn in #DB
> 
> fatal Kernel OOPs Send SIGBUS to user
>   Send SIGBUS to user
>   When both features are
>   supported, fatal in #AC.

> +void handle_bus_lock(struct pt_regs *regs)
> +{
> + if (!bld)
> + return;
> +
> + pr_warn_ratelimited("#DB: %s/%d took a bus_lock trap at address: 
> 0x%lx\n",
> + current->comm, current->pid, regs->ip);
> +}

So the Changelog above, and the state_show() below, seem to suggest
there should be SIGBUS code in #DB, but I'm having trouble spotting it.

> +static void sld_state_show(void)
> +{
> + if (!bld && !sld)
> + return;
> +
> + switch (sld_state) {
> + case sld_off:
> + pr_info("disabled\n");
> + break;
> +
> + case sld_warn:
> + if (bld)
> + pr_info("#DB: warning about user-space bus_locks\n");
> + else
> + pr_info("#AC: crashing the kernel about kernel 
> split_locks and warning about user-space split_locks\n");
> + break;
> +
> + case sld_fatal:
> + if (sld)
> + pr_info("#AC: crashing the kernel on kernel split_locks 
> and sending SIGBUS on user-space split_locks\n");
> + else
> + pr_info("#DB: sending SIGBUS on user-space 
> bus_locks\n");
> + break;
> + }
> +}