Messages in this thread |  | | Date | Mon, 3 Feb 2020 16:04:49 -0800 | From | Sean Christopherson <> | Subject | Re: [PATCH v17] x86/split_lock: Enable split lock detection by kernel |
| |
On Sun, Jan 26, 2020 at 12:05:35PM -0800, Luck, Tony wrote:
...
> +bool handle_user_split_lock(struct pt_regs *regs, long error_code)
No reason to take the error code unless there's a plan to use it.
> +{ > + if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal) > + return false;
Any objection to moving the EFLAGS.AC up to do_alignment_check()? And take "unsigned long rip" instead of @regs?
That would allow KVM to reuse handle_user_split_lock() for guest faults without any changes (other than exporting).
E.g. do_alignment_check() becomes:
if (!(regs->flags & X86_EFLAGS_AC) && handle_user_split_lock(regs->ip)) return;
> + > + pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n", > + current->comm, current->pid, regs->ip); > + > + /* > + * Disable the split lock detection for this task so it can make > + * progress and set TIF_SLD so the detection is re-enabled via > + * switch_to_sld() when the task is scheduled out. > + */ > + __sld_msr_set(false); > + set_tsk_thread_flag(current, TIF_SLD); > + return true; > +}
...
> +dotraplinkage void do_alignment_check(struct pt_regs *regs, long error_code) > +{ > + char *str = "alignment check"; > + > + RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); > + > + if (notify_die(DIE_TRAP, str, regs, error_code, X86_TRAP_AC, SIGBUS) == NOTIFY_STOP) > + return; > + > + if (!user_mode(regs)) > + die("Split lock detected\n", regs, error_code); > + > + local_irq_enable(); > + > + if (handle_user_split_lock(regs, error_code)) > + return; > + > + do_trap(X86_TRAP_AC, SIGBUS, "alignment check", regs, > + error_code, BUS_ADRALN, NULL); > +} > + > #ifdef CONFIG_VMAP_STACK > __visible void __noreturn handle_stack_overflow(const char *message, > struct pt_regs *regs, > -- > 2.21.1 >
|  |