On Mon, 16 May 2022 09:22:09 +0200 Nico Boehr <nrb@xxxxxxxxxxxxx> wrote: > On Thu, 2022-04-14 at 10:02 +0200, Claudio Imbrenda wrote: > > [...] > > +/** > > + * s390_replace_asce - Try to replace the current ASCE of a gmap > > with > > + * another equivalent one. > > + * @gmap the gmap > > + * > > + * If the allocation of the new top level page table fails, the ASCE > > is not > > + * replaced. > > + * In any case, the old ASCE is always removed from the list. > > Therefore the > > + * caller has to make sure to save a pointer to it beforehands, > > unless an > > + * intentional leak is intended. > > + */ > > +int s390_replace_asce(struct gmap *gmap) > > +{ > > > [...] > > + /* Set new table origin while preserving existing ASCE > > control bits */ > > + asce = (gmap->asce & ~_ASCE_ORIGIN) | __pa(table); > > + WRITE_ONCE(gmap->asce, asce); > > Can someone concurrently touch the control bits? should not happen, nobody is using the ASCE while we replace it moreover, all callers of s390_replace_asce hold kvm->lock, as do all functions changing the ASCE