On Tue, 14 Sept 2021 at 17:49, Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > On Tue, Sep 14, 2021 at 5:11 AM Ard Biesheuvel <ardb@xxxxxxxxxx> wrote: > > > > static inline unsigned int task_cpu(const struct task_struct *p) > > { > > #ifdef CONFIG_THREAD_INFO_IN_TASK > > - return READ_ONCE(p->cpu); > > + return READ_ONCE(p->thread_info.cpu); > > #else > > return READ_ONCE(task_thread_info(p)->cpu); > > #endif > > Those two lines look different, but aren't. > > Please just remove the CONFIG_THREAD_INFO_IN_TASK conditional, and use > > return READ_ONCE(task_thread_info(p)->cpu); > > unconditionally, which now does the right thing regardless. > Unfortunately not. task_cpu() takes a 'const struct task_struct *', whereas task_thread_info() takes a 'struct task_struct *'. Since task_thread_info()-><foo> is widely used as an lvalue, I would need to update task_cpu()'s prototype and fix up all the callers, some of which take the const flavor themselves. Or introduce 'const_task_thread_info()' which takes the const flavor, and cannot be used to instantiate lvalues. Suggestions welcome, but this is the cleanest I could come up with.