[PARISC] Add PREEMPT support
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
This commit is contained in:
parent
bc8846c522
commit
50a34dbd61
3 changed files with 39 additions and 9 deletions
|
@ -177,14 +177,10 @@ config ARCH_DISCONTIGMEM_DEFAULT
|
|||
def_bool y
|
||||
depends on ARCH_DISCONTIGMEM_ENABLE
|
||||
|
||||
source "kernel/Kconfig.preempt"
|
||||
source "kernel/Kconfig.hz"
|
||||
source "mm/Kconfig"
|
||||
|
||||
config PREEMPT
|
||||
bool
|
||||
# bool "Preemptible Kernel"
|
||||
default n
|
||||
|
||||
config COMPAT
|
||||
def_bool y
|
||||
depends on 64BIT
|
||||
|
|
|
@ -1014,14 +1014,21 @@ intr_restore:
|
|||
nop
|
||||
nop
|
||||
|
||||
#ifndef CONFIG_PREEMPT
|
||||
# define intr_do_preempt intr_restore
|
||||
#endif /* !CONFIG_PREEMPT */
|
||||
|
||||
.import schedule,code
|
||||
intr_do_resched:
|
||||
/* Only do reschedule if we are returning to user space */
|
||||
/* Only call schedule on return to userspace. If we're returning
|
||||
* to kernel space, we may schedule if CONFIG_PREEMPT, otherwise
|
||||
* we jump back to intr_restore.
|
||||
*/
|
||||
LDREG PT_IASQ0(%r16), %r20
|
||||
CMPIB= 0,%r20,intr_restore /* backward */
|
||||
CMPIB= 0, %r20, intr_do_preempt
|
||||
nop
|
||||
LDREG PT_IASQ1(%r16), %r20
|
||||
CMPIB= 0,%r20,intr_restore /* backward */
|
||||
CMPIB= 0, %r20, intr_do_preempt
|
||||
nop
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
|
@ -1037,6 +1044,32 @@ intr_do_resched:
|
|||
#endif
|
||||
ldo R%intr_check_sig(%r2), %r2
|
||||
|
||||
/* preempt the current task on returning to kernel
|
||||
* mode from an interrupt, iff need_resched is set,
|
||||
* and preempt_count is 0. otherwise, we continue on
|
||||
* our merry way back to the current running task.
|
||||
*/
|
||||
#ifdef CONFIG_PREEMPT
|
||||
.import preempt_schedule_irq,code
|
||||
intr_do_preempt:
|
||||
rsm PSW_SM_I, %r0 /* disable interrupts */
|
||||
|
||||
/* current_thread_info()->preempt_count */
|
||||
mfctl %cr30, %r1
|
||||
LDREG TI_PRE_COUNT(%r1), %r19
|
||||
CMPIB<> 0, %r19, intr_restore /* if preempt_count > 0 */
|
||||
nop /* prev insn branched backwards */
|
||||
|
||||
/* check if we interrupted a critical path */
|
||||
LDREG PT_PSW(%r16), %r20
|
||||
bb,<,n %r20, 31 - PSW_SM_I, intr_restore
|
||||
nop
|
||||
|
||||
BL preempt_schedule_irq, %r2
|
||||
nop
|
||||
|
||||
b intr_restore /* ssm PSW_SM_I done by intr_restore */
|
||||
#endif /* CONFIG_PREEMPT */
|
||||
|
||||
.import do_signal,code
|
||||
intr_do_signal:
|
||||
|
|
|
@ -49,7 +49,8 @@ struct thread_info {
|
|||
|
||||
#endif /* !__ASSEMBLY */
|
||||
|
||||
#define PREEMPT_ACTIVE 0x10000000
|
||||
#define PREEMPT_ACTIVE_BIT 28
|
||||
#define PREEMPT_ACTIVE (1 << PREEMPT_ACTIVE_BIT)
|
||||
|
||||
/*
|
||||
* thread information flags
|
||||
|
|
Loading…
Reference in a new issue