Skip to content

Commit

Permalink
[PARISC] Add PREEMPT support
Browse files Browse the repository at this point in the history
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
  • Loading branch information
Kyle McMartin authored and Kyle McMartin committed Mar 30, 2006
1 parent bc8846c commit 50a34db
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 9 deletions.
6 changes: 1 addition & 5 deletions arch/parisc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
39 changes: 36 additions & 3 deletions arch/parisc/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand Down
3 changes: 2 additions & 1 deletion include/asm-parisc/thread_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 50a34db

Please sign in to comment.