arm: remove interrupt nesting by ipi_preempt()/ipi_hardclock()

This was needed when intr_ipi_dispatch() was called by hardware-specific
IPI interrupt routines which didn't save the trap frame.  Now all ARM
interrupts pass through INTRNG which will have already saved the trap
frame and disabled preemption.

Remove the conditional trapframe/argument passing to the handlers.

Reviewed by: andrew
Differential Revision: https://reviews.freebsd.org/D37938
This commit is contained in:
Elliott Mitchell 2022-12-14 12:36:47 -08:00 committed by Andrew Turner
parent d09a955a60
commit c7e5e9dc41
3 changed files with 3 additions and 39 deletions

View File

@ -143,7 +143,6 @@ intr_ipi_lookup(u_int ipi)
void
intr_ipi_dispatch(u_int ipi, struct trapframe *tf)
{
void *arg;
struct intr_ipi *ii;
ii = intr_ipi_lookup(ipi);
@ -152,12 +151,7 @@ intr_ipi_dispatch(u_int ipi, struct trapframe *tf)
intr_ipi_increment_count(ii->ii_count, PCPU_GET(cpuid));
/*
* Supply ipi filter with trapframe argument
* if none is registered.
*/
arg = ii->ii_handler_arg != NULL ? ii->ii_handler_arg : tf;
ii->ii_handler(arg);
ii->ii_handler(ii->ii_handler_arg);
}
void

View File

@ -282,41 +282,17 @@ ipi_stop(void *dummy __unused)
static void
ipi_preempt(void *arg)
{
struct trapframe *oldframe;
struct thread *td;
critical_enter();
td = curthread;
td->td_intr_nesting_level++;
oldframe = td->td_intr_frame;
td->td_intr_frame = (struct trapframe *)arg;
CTR1(KTR_SMP, "%s: IPI_PREEMPT", __func__);
sched_preempt(td);
td->td_intr_frame = oldframe;
td->td_intr_nesting_level--;
critical_exit();
sched_preempt(curthread);
}
static void
ipi_hardclock(void *arg)
{
struct trapframe *oldframe;
struct thread *td;
critical_enter();
td = curthread;
td->td_intr_nesting_level++;
oldframe = td->td_intr_frame;
td->td_intr_frame = (struct trapframe *)arg;
CTR1(KTR_SMP, "%s: IPI_HARDCLOCK", __func__);
hardclockintr();
td->td_intr_frame = oldframe;
td->td_intr_nesting_level--;
critical_exit();
}
static void

View File

@ -917,7 +917,6 @@ intr_ipi_lookup(u_int ipi)
void
intr_ipi_dispatch(u_int ipi, struct trapframe *tf)
{
void *arg;
struct intr_ipi *ii;
ii = intr_ipi_lookup(ipi);
@ -926,12 +925,7 @@ intr_ipi_dispatch(u_int ipi, struct trapframe *tf)
intr_ipi_increment_count(ii->ii_count, PCPU_GET(cpuid));
/*
* Supply ipi filter with trapframe argument
* if none is registered.
*/
arg = ii->ii_handler_arg != NULL ? ii->ii_handler_arg : tf;
ii->ii_handler(arg);
ii->ii_handler(ii->ii_handler_arg);
}
#ifdef notyet