mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
ARM: 9150/1: Fix PID_IN_CONTEXTIDR regression when THREAD_INFO_IN_TASK=y
The code that implements the rarely used PID_IN_CONTEXTIDR feature
dereferences the 'task' field of struct thread_info directly, and this
is no longer possible when THREAD_INFO_IN_TASK=y, as the 'task' field is
omitted from the struct definition in that case. Instead, we should just
cast the thread_info pointer to a task_struct pointer, given that the
former is now the first member of the latter.
So use a helper that abstracts this, and provide implementations for
both cases.
Reported by: Arnd Bergmann <arnd@arndb.de>
Fixes: 18ed1c01a7
("ARM: smp: Enable THREAD_INFO_IN_TASK")
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
This commit is contained in:
parent
13a695aa50
commit
fa191b711c
@ -79,9 +79,20 @@ struct thread_info {
|
||||
|
||||
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
||||
#define INIT_THREAD_INFO_TASK(tsk)
|
||||
|
||||
static inline struct task_struct *thread_task(struct thread_info* ti)
|
||||
{
|
||||
return (struct task_struct *)ti;
|
||||
}
|
||||
|
||||
#else
|
||||
#define INIT_THREAD_INFO_TASK(tsk) .task = &(tsk),
|
||||
|
||||
static inline struct task_struct *thread_task(struct thread_info* ti)
|
||||
{
|
||||
return ti->task;
|
||||
}
|
||||
|
||||
/*
|
||||
* how to get the thread information struct from C
|
||||
*/
|
||||
|
@ -109,7 +109,7 @@ static int contextidr_notifier(struct notifier_block *unused, unsigned long cmd,
|
||||
if (cmd != THREAD_NOTIFY_SWITCH)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
pid = task_pid_nr(thread->task) << ASID_BITS;
|
||||
pid = task_pid_nr(thread_task(thread)) << ASID_BITS;
|
||||
asm volatile(
|
||||
" mrc p15, 0, %0, c13, c0, 1\n"
|
||||
" and %0, %0, %2\n"
|
||||
|
Loading…
Reference in New Issue
Block a user