Messages in this thread Patch in this message | | | Date | Tue, 9 Aug 2022 11:38:03 -0700 | From | Ira Weiny <> | Subject | Re: [RFC PATCH 2/5] entry: Add calls for save/restore auxiliary pt_regs |
| |
On Tue, Aug 09, 2022 at 02:05:15PM +0200, Borislav Petkov wrote: > On Fri, Aug 05, 2022 at 10:30:06AM -0700, ira.weiny@intel.com wrote: > > From: Ira Weiny <ira.weiny@intel.com> > > > > Some architectures have auxiliary pt_regs space available to store > > information on the stack during exceptions. This information is easier > > to obtain and store within C code rather than in arch specific assembly. > > There are others?
Other archs? not now.
> > Because I would've done this whole thing in arch/x86/ only...
Thomas did a lot of work to make the entry code generic. So I was keeping that work consistent. This also helps to ensure I did not miss any places.
> > > diff --git a/kernel/entry/common.c b/kernel/entry/common.c > > index 8c0f334c4b75..a70a0f314aee 100644 > > --- a/kernel/entry/common.c > > +++ b/kernel/entry/common.c > > @@ -317,7 +317,7 @@ noinstr irqentry_state_t irqentry_enter(struct pt_regs *regs) > > > > if (user_mode(regs)) { > > irqentry_enter_from_user_mode(regs); > > - return ret; > > + goto aux_save; > > Why do you have to goto and do the instrumentation sandwitch around it > at the goto label? > > Why not simply do > > if (user_mode(regs)) { > irqentry_enter_from_user_mode(regs); > arch_save_aux_pt_regs(regs); > return ret;
I don't believe this is correct because instrumentation is not enabled here. See below.[1]
There are 3 exit paths from irqentry_enter(). All must call arch_save_aux_pt_regs(). I felt the maintenance of the code would be easier if I did not scatter those calls through the function and simply exited 1 place.[1]
FWICT calling instrumentation_{begin,end}() is a noop in production code. So there is no real cost to calling instrumentation_begin() -> end -> begin -> end. And the goto seemed low enough overhead. Given the current discussion I admit I may have made the wrong choice. But I think I would add some comments to the below to help future developers.
Ira
[1]
--- a/kernel/entry/common.c +++ b/kernel/entry/common.c @@ -317,6 +317,9 @@ noinstr irqentry_state_t irqentry_enter(struct pt_regs *regs)
if (user_mode(regs)) { irqentry_enter_from_user_mode(regs); + instrumentation_begin(); + arch_save_aux_pt_regs(regs); + instrumentation_end(); return ret; }
@@ -353,6 +356,7 @@ noinstr irqentry_state_t irqentry_enter(struct pt_regs *regs) ct_irq_enter(); instrumentation_begin(); trace_hardirqs_off_finish(); + arch_save_aux_pt_regs(regs); instrumentation_end();
ret.exit_rcu = true; @@ -369,6 +373,7 @@ noinstr irqentry_state_t irqentry_enter(struct pt_regs *regs) instrumentation_begin(); rcu_irq_enter_check_tick(); trace_hardirqs_off_finish(); + arch_save_aux_pt_regs(regs); instrumentation_end();
return ret;
| |