On Thu, Jun 20, 2024 at 3:38 PM Ilya Leoshkevich <iii@xxxxxxxxxxxxx> wrote: > > 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(). We have KMSAN_WARN_ON() for that, sorry for not pointing it out earlier: https://elixir.bootlin.com/linux/latest/source/mm/kmsan/kmsan.h#L46