flush instruction cache at context switch time if necessary
Change-Id: Ic09415ea772a9de6dca43a98168a8346ca86d3e7
This commit is contained in:
committed by
Masamichi Takagi
parent
f0bc1a6b07
commit
2dd8687974
@ -1772,4 +1772,9 @@ int smp_call_func(cpu_set_t *__cpu_set, smp_func_t __func, void *__arg)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void arch_flush_icache_all(void)
|
||||
{
|
||||
asm("ic ialluis");
|
||||
dsb(ish);
|
||||
}
|
||||
/*** end of file ***/
|
||||
|
||||
@ -102,4 +102,6 @@ static inline void cpu_disable_nmi(void)
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
void arch_flush_icache_all(void);
|
||||
|
||||
#endif /* !__HEADER_ARM64_ARCH_CPU_H */
|
||||
|
||||
@ -3199,6 +3199,7 @@ void load_page_table(struct page_table *pt)
|
||||
{
|
||||
if (pt == NULL) {
|
||||
// load page table for idle(EL1) process.
|
||||
switch_mm(init_pt);
|
||||
return;
|
||||
}
|
||||
// load page table for user(EL0) thread.
|
||||
|
||||
@ -1821,6 +1821,10 @@ ihk_mc_init_user_tlsbase(ihk_mc_user_context_t *ctx,
|
||||
do_arch_prctl(ARCH_SET_FS, tls_base_addr);
|
||||
}
|
||||
|
||||
void arch_flush_icache_all(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/*@
|
||||
@ assigns \nothing;
|
||||
|
||||
@ -47,5 +47,6 @@ static inline unsigned long read_tsc(void)
|
||||
WRITE_ONCE(*p, v); \
|
||||
})
|
||||
|
||||
void arch_flush_icache_all(void);
|
||||
|
||||
#endif /* ARCH_CPU_H */
|
||||
|
||||
@ -73,6 +73,7 @@ struct cpu_local_var {
|
||||
ihk_spinlock_t runq_lock;
|
||||
unsigned long runq_irqstate;
|
||||
struct thread *current;
|
||||
int prevpid;
|
||||
struct list_head runq;
|
||||
size_t runq_len;
|
||||
size_t runq_reserved; /* Number of threads which are about to be added to runq */
|
||||
|
||||
@ -3324,6 +3324,7 @@ void schedule(void)
|
||||
struct thread *next, *prev, *thread, *tmp = NULL;
|
||||
int switch_ctx = 0;
|
||||
struct thread *last;
|
||||
int prevpid;
|
||||
|
||||
if (cpu_local_var(no_preempt)) {
|
||||
kprintf("%s: WARNING can't schedule() while no preemption, cnt: %d\n",
|
||||
@ -3337,6 +3338,7 @@ void schedule(void)
|
||||
|
||||
next = NULL;
|
||||
prev = v->current;
|
||||
prevpid = v->prevpid;
|
||||
|
||||
v->flags &= ~CPU_FLAG_NEED_RESCHED;
|
||||
|
||||
@ -3381,6 +3383,8 @@ void schedule(void)
|
||||
|
||||
if (prev != next) {
|
||||
switch_ctx = 1;
|
||||
v->prevpid = v->current && v->current->proc ?
|
||||
v->current->proc->pid : 0;
|
||||
v->current = next;
|
||||
reset_cputime();
|
||||
}
|
||||
@ -3420,6 +3424,18 @@ void schedule(void)
|
||||
next->vm->address_space->page_table)
|
||||
ihk_mc_load_page_table(next->vm->address_space->page_table);
|
||||
|
||||
/*
|
||||
* Unless switching to a thread in the same process,
|
||||
* to the idle thread, or to the same process that ran
|
||||
* before the idle, clear the instruction cache.
|
||||
*/
|
||||
if ((prev && prev->proc != next->proc) &&
|
||||
next != &cpu_local_var(idle) &&
|
||||
(prevpid != next->proc->pid ||
|
||||
prev != &cpu_local_var(idle))) {
|
||||
arch_flush_icache_all();
|
||||
}
|
||||
|
||||
last = arch_switch_context(prev, next);
|
||||
|
||||
/*
|
||||
@ -3433,6 +3449,8 @@ void schedule(void)
|
||||
cpu_local_var(runq_irqstate));
|
||||
|
||||
if ((last != NULL) && (last->status == PS_EXITED)) {
|
||||
v->prevpid = 0;
|
||||
arch_flush_icache_all();
|
||||
release_thread(last);
|
||||
rusage_num_threads_dec();
|
||||
#ifdef RUSAGE_DEBUG
|
||||
|
||||
Reference in New Issue
Block a user