cpu-to-thread_info update for v5.16-rc1
Cross-architecture update to move task_struct::cpu back into thread_info on arm64, x86, s390, powerpc, and riscv. All Acked by arch maintainers. Quoting Ard Biesheuvel: "Move task_struct::cpu back into thread_info Keeping CPU in task_struct is problematic for architectures that define raw_smp_processor_id() in terms of this field, as it requires linux/sched.h to be included, which causes a lot of pain in terms of circular dependencies (aka 'header soup') This series moves it back into thread_info (where it came from) for all architectures that enable THREAD_INFO_IN_TASK, addressing the header soup issue as well as some pointless differences in the implementations of task_cpu() and set_task_cpu()." -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEEpcP2jyKd1g9yPm4TiXL039xtwCYFAmGAEPYWHGtlZXNjb29r QGNocm9taXVtLm9yZwAKCRCJcvTf3G3AJq4wEACItgLuyzPgB2eSLVMc3sHPIWcn EUWbAWsuzJH79wmJtn2AKxW/C5OLBNGeoNjkXQvFN3ULkQDPrfCpB4x/tB6CjIQI WRDf8kO7oaAD85ZrbSwyFl/MFfrD67f6H1HZoB9FKWAzuv/Bp2xQ0Kf06Dv4HEZp CzprzZuWtjHB+qgyy+EpGOge3zbFmCuYPE2QpMYLWgs1rcVW9OYvoCI6AYtNefrC 6Kl6CbmBb1k6lFxkhM7wvRcIJthBl6Bajpc3Z2uL1aLb27dVpQZs3YpY859Knb6U ZpOQCRJOMui3HOxyF3bDUI37y0XVLm6xaNM6C/7i0XS1GiFlSxkGVamg+Mp7anpI +hdK5kqtSagaBC9CaJvRHnWIex1npQAfiyDNdyiEbrsUJ1dp6/zZcQSe4/m/XRbi vywQPGxU9f1ASshzHsGU2TJf7Ps7qHulUsS5fKwmHU2ZjQnbYCoPN10JGO9gKjOX yioN5xsKnbPY9j0ys3l9XBqaMJ8KAr1XspplTGIMZIVbjNMlqrfgbg8Qn8T8WGM7 oUqudMIxczilj0/iEGfGRxBeFaYAfhGQCDnxNlNX9g7Xe/gHTJgNYlHVxL55jHNu AoPE3Gd0X8K9fbov0BCB6a21XwGJ6Wj+FSrnvuyWrRuy8JWiDFJaVKUBEcalKr7a MhoUNQPu5M83OdC42A== =PzvV -----END PGP SIGNATURE----- Merge tag 'cpu-to-thread_info-v5.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux Pull thread_info update to move 'cpu' back from task_struct from Kees Cook: "Cross-architecture update to move task_struct::cpu back into thread_info on arm64, x86, s390, powerpc, and riscv. All Acked by arch maintainers. Quoting Ard Biesheuvel: 'Move task_struct::cpu back into thread_info Keeping CPU in task_struct is problematic for architectures that define raw_smp_processor_id() in terms of this field, as it requires linux/sched.h to be included, which causes a lot of pain in terms of circular dependencies (aka 'header soup') This series moves it back into thread_info (where it came from) for all architectures that enable THREAD_INFO_IN_TASK, addressing the header soup issue as well as some pointless differences in the implementations of task_cpu() and set_task_cpu()'" * tag 'cpu-to-thread_info-v5.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: riscv: rely on core code to keep thread_info::cpu updated powerpc: smp: remove hack to obtain offset of task_struct::cpu sched: move CPU field back into thread_info if THREAD_INFO_IN_TASK=y powerpc: add CPU field to struct thread_info s390: add CPU field to struct thread_info x86: add CPU field to struct thread_info arm64: add CPU field to struct thread_info
This commit is contained in:
commit
01463374c5
@ -42,6 +42,7 @@ struct thread_info {
|
||||
void *scs_base;
|
||||
void *scs_sp;
|
||||
#endif
|
||||
u32 cpu;
|
||||
};
|
||||
|
||||
#define thread_saved_pc(tsk) \
|
||||
|
@ -28,8 +28,8 @@
|
||||
int main(void)
|
||||
{
|
||||
DEFINE(TSK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
|
||||
DEFINE(TSK_CPU, offsetof(struct task_struct, cpu));
|
||||
BLANK();
|
||||
DEFINE(TSK_TI_CPU, offsetof(struct task_struct, thread_info.cpu));
|
||||
DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags));
|
||||
DEFINE(TSK_TI_PREEMPT, offsetof(struct task_struct, thread_info.preempt_count));
|
||||
#ifdef CONFIG_ARM64_SW_TTBR0_PAN
|
||||
|
@ -412,7 +412,7 @@ SYM_FUNC_END(__create_page_tables)
|
||||
scs_load \tsk
|
||||
|
||||
adr_l \tmp1, __per_cpu_offset
|
||||
ldr w\tmp2, [\tsk, #TSK_CPU]
|
||||
ldr w\tmp2, [\tsk, #TSK_TI_CPU]
|
||||
ldr \tmp1, [\tmp1, \tmp2, lsl #3]
|
||||
set_this_cpu_offset \tmp1
|
||||
.endm
|
||||
|
@ -446,17 +446,6 @@ else
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef CONFIG_SMP
|
||||
ifdef CONFIG_PPC32
|
||||
prepare: task_cpu_prepare
|
||||
|
||||
PHONY += task_cpu_prepare
|
||||
task_cpu_prepare: prepare0
|
||||
$(eval KBUILD_CFLAGS += -D_TASK_CPU=$(shell awk '{if ($$2 == "TASK_CPU") print $$3;}' include/generated/asm-offsets.h))
|
||||
|
||||
endif # CONFIG_PPC32
|
||||
endif # CONFIG_SMP
|
||||
|
||||
PHONY += checkbin
|
||||
# Check toolchain versions:
|
||||
# - gcc-4.6 is the minimum kernel-wide version so nothing required.
|
||||
|
@ -87,22 +87,7 @@ int is_cpu_dead(unsigned int cpu);
|
||||
/* 32-bit */
|
||||
extern int smp_hw_index[];
|
||||
|
||||
/*
|
||||
* This is particularly ugly: it appears we can't actually get the definition
|
||||
* of task_struct here, but we need access to the CPU this task is running on.
|
||||
* Instead of using task_struct we're using _TASK_CPU which is extracted from
|
||||
* asm-offsets.h by kbuild to get the current processor ID.
|
||||
*
|
||||
* This also needs to be safeguarded when building asm-offsets.s because at
|
||||
* that time _TASK_CPU is not defined yet. It could have been guarded by
|
||||
* _TASK_CPU itself, but we want the build to fail if _TASK_CPU is missing
|
||||
* when building something else than asm-offsets.s
|
||||
*/
|
||||
#ifdef GENERATING_ASM_OFFSETS
|
||||
#define raw_smp_processor_id() (0)
|
||||
#else
|
||||
#define raw_smp_processor_id() (*(unsigned int *)((void *)current + _TASK_CPU))
|
||||
#endif
|
||||
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
||||
#define hard_smp_processor_id() (smp_hw_index[smp_processor_id()])
|
||||
|
||||
static inline int get_hard_smp_processor_id(int cpu)
|
||||
|
@ -47,6 +47,9 @@
|
||||
struct thread_info {
|
||||
int preempt_count; /* 0 => preemptable,
|
||||
<0 => BUG */
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned int cpu;
|
||||
#endif
|
||||
unsigned long local_flags; /* private flags for thread */
|
||||
#ifdef CONFIG_LIVEPATCH
|
||||
unsigned long *livepatch_sp;
|
||||
|
@ -9,8 +9,6 @@
|
||||
* #defines from the assembly-language output.
|
||||
*/
|
||||
|
||||
#define GENERATING_ASM_OFFSETS /* asm/smp.h */
|
||||
|
||||
#include <linux/compat.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
@ -93,7 +91,7 @@ int main(void)
|
||||
#endif /* CONFIG_PPC64 */
|
||||
OFFSET(TASK_STACK, task_struct, stack);
|
||||
#ifdef CONFIG_SMP
|
||||
OFFSET(TASK_CPU, task_struct, cpu);
|
||||
OFFSET(TASK_CPU, task_struct, thread_info.cpu);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LIVEPATCH
|
||||
|
@ -1223,7 +1223,7 @@ static void cpu_idle_thread_init(unsigned int cpu, struct task_struct *idle)
|
||||
paca_ptrs[cpu]->kstack = (unsigned long)task_stack_page(idle) +
|
||||
THREAD_SIZE - STACK_FRAME_OVERHEAD;
|
||||
#endif
|
||||
idle->cpu = cpu;
|
||||
task_thread_info(idle)->cpu = cpu;
|
||||
secondary_current = current_set[cpu] = idle;
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,6 @@ void asm_offsets(void)
|
||||
OFFSET(TASK_TI_PREEMPT_COUNT, task_struct, thread_info.preempt_count);
|
||||
OFFSET(TASK_TI_KERNEL_SP, task_struct, thread_info.kernel_sp);
|
||||
OFFSET(TASK_TI_USER_SP, task_struct, thread_info.user_sp);
|
||||
OFFSET(TASK_TI_CPU, task_struct, thread_info.cpu);
|
||||
|
||||
OFFSET(TASK_THREAD_F0, task_struct, thread.fstate.f[0]);
|
||||
OFFSET(TASK_THREAD_F1, task_struct, thread.fstate.f[1]);
|
||||
|
@ -543,11 +543,6 @@ ENTRY(__switch_to)
|
||||
REG_L s9, TASK_THREAD_S9_RA(a4)
|
||||
REG_L s10, TASK_THREAD_S10_RA(a4)
|
||||
REG_L s11, TASK_THREAD_S11_RA(a4)
|
||||
/* Swap the CPU entry around. */
|
||||
lw a3, TASK_TI_CPU(a0)
|
||||
lw a4, TASK_TI_CPU(a1)
|
||||
sw a3, TASK_TI_CPU(a1)
|
||||
sw a4, TASK_TI_CPU(a0)
|
||||
/* The offset of thread_info in task_struct is zero. */
|
||||
move tp, a1
|
||||
ret
|
||||
|
@ -318,7 +318,6 @@ clear_bss_done:
|
||||
call setup_trap_vector
|
||||
/* Restore C environment */
|
||||
la tp, init_task
|
||||
sw zero, TASK_TI_CPU(tp)
|
||||
la sp, init_thread_union + THREAD_SIZE
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
|
@ -37,6 +37,7 @@
|
||||
struct thread_info {
|
||||
unsigned long flags; /* low level flags */
|
||||
unsigned long syscall_work; /* SYSCALL_WORK_ flags */
|
||||
unsigned int cpu; /* current CPU */
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -57,6 +57,9 @@ struct thread_info {
|
||||
unsigned long flags; /* low level flags */
|
||||
unsigned long syscall_work; /* SYSCALL_WORK_ flags */
|
||||
u32 status; /* thread synchronous flags */
|
||||
#ifdef CONFIG_SMP
|
||||
u32 cpu; /* current CPU */
|
||||
#endif
|
||||
};
|
||||
|
||||
#define INIT_THREAD_INFO(tsk) \
|
||||
|
@ -750,10 +750,6 @@ struct task_struct {
|
||||
#ifdef CONFIG_SMP
|
||||
int on_cpu;
|
||||
struct __call_single_node wake_entry;
|
||||
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
||||
/* Current CPU: */
|
||||
unsigned int cpu;
|
||||
#endif
|
||||
unsigned int wakee_flips;
|
||||
unsigned long wakee_flip_decay_ts;
|
||||
struct task_struct *last_wakee;
|
||||
@ -1886,10 +1882,7 @@ extern struct thread_info init_thread_info;
|
||||
extern unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)];
|
||||
|
||||
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
||||
static inline struct thread_info *task_thread_info(struct task_struct *task)
|
||||
{
|
||||
return &task->thread_info;
|
||||
}
|
||||
# define task_thread_info(task) (&(task)->thread_info)
|
||||
#elif !defined(__HAVE_THREAD_FUNCTIONS)
|
||||
# define task_thread_info(task) ((struct thread_info *)(task)->stack)
|
||||
#endif
|
||||
@ -2133,11 +2126,7 @@ static __always_inline bool need_resched(void)
|
||||
|
||||
static inline unsigned int task_cpu(const struct task_struct *p)
|
||||
{
|
||||
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
||||
return READ_ONCE(p->cpu);
|
||||
#else
|
||||
return READ_ONCE(task_thread_info(p)->cpu);
|
||||
#endif
|
||||
}
|
||||
|
||||
extern void set_task_cpu(struct task_struct *p, unsigned int cpu);
|
||||
|
@ -1912,11 +1912,7 @@ static inline void __set_task_cpu(struct task_struct *p, unsigned int cpu)
|
||||
* per-task data have been completed by this moment.
|
||||
*/
|
||||
smp_wmb();
|
||||
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
||||
WRITE_ONCE(p->cpu, cpu);
|
||||
#else
|
||||
WRITE_ONCE(task_thread_info(p)->cpu, cpu);
|
||||
#endif
|
||||
p->wake_cpu = cpu;
|
||||
#endif
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user