On Mon, Sep 05, 2022 at 07:47:08PM +0300, Kirill A. Shutemov wrote: > Fair enough. How about this? > > diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h > index 803241dfc473..1a03c65a9c0f 100644 > --- a/arch/x86/include/asm/uaccess.h > +++ b/arch/x86/include/asm/uaccess.h > @@ -22,6 +22,8 @@ static inline bool pagefault_disabled(void); > #endif > > #ifdef CONFIG_X86_64 > +DECLARE_STATIC_KEY_FALSE(tagged_addr_key); > + > /* > * Mask out tag bits from the address. > * > @@ -30,8 +32,10 @@ static inline bool pagefault_disabled(void); > */ > #define untagged_addr(mm, addr) ({ \ > u64 __addr = (__force u64)(addr); \ > - s64 sign = (s64)__addr >> 63; \ > - __addr &= (mm)->context.untag_mask | sign; \ > + if (static_branch_unlikely(&tagged_addr_key)) { \ > + s64 sign = (s64)__addr >> 63; \ > + __addr &= (mm)->context.untag_mask | sign; \ > + } \ > (__force __typeof__(addr))__addr; \ > }) > > diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c > index 337f80a0862f..63194bf43c9a 100644 > --- a/arch/x86/kernel/process_64.c > +++ b/arch/x86/kernel/process_64.c > @@ -742,6 +742,9 @@ static long prctl_map_vdso(const struct vdso_image *image, unsigned long addr) > } > #endif > > +DEFINE_STATIC_KEY_FALSE(tagged_addr_key); So here you use the: false-unlikely scenario which seems suboptimal in this case, I was thinking the false-likely case would generate better code (see the comment in linux/jump_label.h). > +EXPORT_SYMBOL_GPL(tagged_addr_key); > + > static void enable_lam_func(void *mm) > { > struct mm_struct *loaded_mm = this_cpu_read(cpu_tlbstate.loaded_mm); > @@ -813,6 +816,7 @@ static int prctl_enable_tagged_addr(struct mm_struct *mm, unsigned long nr_bits) > } > > on_each_cpu_mask(mm_cpumask(mm), enable_lam_func, mm, true); > + static_branch_enable(&tagged_addr_key); > out: > mutex_unlock(&mm->context.lock); > mmap_write_unlock(mm); Aside from the one nit above, this looks about right.