On Mon, 2023-12-11 at 11:26 +0100, Alexander Potapenko wrote: > > +static inline void *arch_kmsan_get_meta_or_null(void *addr, bool > > is_origin) > > +{ > > + if (addr >= (void *)&S390_lowcore && > > + addr < (void *)(&S390_lowcore + 1)) { > > + /* > > + * Different lowcores accessed via S390_lowcore are > > described > > + * by the same struct page. Resolve the prefix > > manually in > > + * order to get a distinct struct page. > > + */ > > + addr += (void *)lowcore_ptr[raw_smp_processor_id()] > > - > > + (void *)&S390_lowcore; > > + return kmsan_get_metadata(addr, is_origin); > > + } > > + return NULL; > > +} > > Is there a possibility for infinite recursion here? E.g. can > `lowcore_ptr[raw_smp_processor_id()]` point somewhere in between > `(void *)&S390_lowcore` and `(void *)(&S390_lowcore + 1))`? No, it's allocated with __get_free_pages() or memblock_alloc_low(). But since this question came up, I should probably add a check and a WARN_ON_ONCE() here.