Skip to content

Commit

Permalink
x86/xen: Make irq_enable() noinstr
Browse files Browse the repository at this point in the history
vmlinux.o: warning: objtool: pv_ops[32]: native_irq_enable
vmlinux.o: warning: objtool: pv_ops[32]: __raw_callee_save_xen_irq_enable
vmlinux.o: warning: objtool: pv_ops[32]: xen_irq_enable_direct
vmlinux.o: warning: objtool: lock_is_held_type()+0xfe: call to pv_ops[32]() leaves .noinstr.text section

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Juergen Gross <jgross@suse.com>
Link: https://lore.kernel.org/r/20210624095148.872254932@infradead.org
  • Loading branch information
Peter Zijlstra committed Sep 17, 2021
1 parent 74ea805 commit d7bfc7d
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 31 deletions.
7 changes: 6 additions & 1 deletion arch/x86/kernel/paravirt.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,11 @@ static noinstr void pv_native_set_debugreg(int regno, unsigned long val)
{
native_set_debugreg(regno, val);
}

static noinstr void pv_native_irq_enable(void)
{
native_irq_enable();
}
#endif

enum paravirt_lazy_mode paravirt_get_lazy_mode(void)
Expand Down Expand Up @@ -302,7 +307,7 @@ struct paravirt_patch_template pv_ops = {
/* Irq ops. */
.irq.save_fl = __PV_IS_CALLEE_SAVE(native_save_fl),
.irq.irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable),
.irq.irq_enable = __PV_IS_CALLEE_SAVE(native_irq_enable),
.irq.irq_enable = __PV_IS_CALLEE_SAVE(pv_native_irq_enable),
.irq.safe_halt = native_safe_halt,
.irq.halt = native_halt,
#endif /* CONFIG_PARAVIRT_XXL */
Expand Down
4 changes: 2 additions & 2 deletions arch/x86/xen/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ asmlinkage __visible void xen_irq_disable(void)
}
PV_CALLEE_SAVE_REGS_THUNK(xen_irq_disable);

asmlinkage __visible void xen_irq_enable(void)
asmlinkage __visible noinstr void xen_irq_enable(void)
{
struct vcpu_info *vcpu;

Expand All @@ -76,7 +76,7 @@ asmlinkage __visible void xen_irq_enable(void)

preempt_enable();
}
PV_CALLEE_SAVE_REGS_THUNK(xen_irq_enable);
__PV_CALLEE_SAVE_REGS_THUNK(xen_irq_enable, ".noinstr.text");

static void xen_safe_halt(void)
{
Expand Down
56 changes: 28 additions & 28 deletions arch/x86/xen/xen-asm.S
Original file line number Diff line number Diff line change
Expand Up @@ -21,33 +21,6 @@
#include <linux/init.h>
#include <linux/linkage.h>

/*
* Enable events. This clears the event mask and tests the pending
* event status with one and operation. If there are pending events,
* then enter the hypervisor to get them handled.
*/
SYM_FUNC_START(xen_irq_enable_direct)
FRAME_BEGIN
/* Unmask events */
movb $0, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask

/*
* Preempt here doesn't matter because that will deal with any
* pending interrupts. The pending check may end up being run
* on the wrong CPU, but that doesn't hurt.
*/

/* Test for pending */
testb $0xff, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_pending
jz 1f

call check_events
1:
FRAME_END
ret
SYM_FUNC_END(xen_irq_enable_direct)


/*
* Disabling events is simply a matter of making the event mask
* non-zero.
Expand All @@ -57,6 +30,8 @@ SYM_FUNC_START(xen_irq_disable_direct)
ret
SYM_FUNC_END(xen_irq_disable_direct)

.pushsection .noinstr.text, "ax"

/*
* Force an event check by making a hypercall, but preserve regs
* before making the call.
Expand Down Expand Up @@ -86,7 +61,32 @@ SYM_FUNC_START(check_events)
ret
SYM_FUNC_END(check_events)

.pushsection .noinstr.text, "ax"
/*
* Enable events. This clears the event mask and tests the pending
* event status with one and operation. If there are pending events,
* then enter the hypervisor to get them handled.
*/
SYM_FUNC_START(xen_irq_enable_direct)
FRAME_BEGIN
/* Unmask events */
movb $0, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask

/*
* Preempt here doesn't matter because that will deal with any
* pending interrupts. The pending check may end up being run
* on the wrong CPU, but that doesn't hurt.
*/

/* Test for pending */
testb $0xff, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_pending
jz 1f

call check_events
1:
FRAME_END
ret
SYM_FUNC_END(xen_irq_enable_direct)

/*
* (xen_)save_fl is used to get the current interrupt enable status.
* Callers expect the status to be in X86_EFLAGS_IF, and other bits
Expand Down

0 comments on commit d7bfc7d

Please sign in to comment.