RE: [PATCH 2/4] x86/bus_lock: Handle warn and fatal in #DB for bus lock
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
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; > + } > +}