On Thu, 2024-06-20 at 11:25 +0200, Alexander Gordeev wrote: > On Wed, Jun 19, 2024 at 05:44:11PM +0200, Ilya Leoshkevich wrote: > > Hi Ilya, > > > +static inline bool is_lowcore_addr(void *addr) > > +{ > > + return addr >= (void *)&S390_lowcore && > > + addr < (void *)(&S390_lowcore + 1); > > +} > > + > > +static inline void *arch_kmsan_get_meta_or_null(void *addr, bool > > is_origin) > > +{ > > + if (is_lowcore_addr(addr)) { > > + /* > > + * 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; > > If I am not mistaken neither raw_smp_processor_id() itself, nor > lowcore_ptr[raw_smp_processor_id()] are atomic. Should the preemption > be disabled while the addr is calculated? > > But then the question arises - how meaningful the returned value is? > AFAICT kmsan_get_metadata() is called from a preemptable context. > So if the CPU is changed - how useful the previous CPU lowcore meta > is? This code path will only be triggered by instrumented code that accesses lowcore. That code is supposed to disable preemption; if it didn't, it's a bug in that code and it should be fixed there. > > Is it a memory block that needs to be ignored instead? > > > + if (WARN_ON_ONCE(is_lowcore_addr(addr))) > > + return NULL; > > lowcore_ptr[] pointing into S390_lowcore is rather a bug. Right, but AFAIK BUG() calls are discouraged. I guess in a debug tool the rules are more relaxed, but we can recover from this condition here easily, that's why I still went for WARN_ON_ONCE(). > > + return kmsan_get_metadata(addr, is_origin); > > + } > > + return NULL; > > +} > > Thanks!