> -----Original Message----- > From: David Laight <David.Laight@xxxxxxxxxx> > Sent: Wednesday, August 17, 2022 11:39 PM > To: Justin He <Justin.He@xxxxxxx>; Ard Biesheuvel <ardb@xxxxxxxxxx>; Len > Brown <lenb@xxxxxxxxxx>; James Morse <James.Morse@xxxxxxx>; Tony > Luck <tony.luck@xxxxxxxxx>; Borislav Petkov <bp@xxxxxxxxx>; Mauro > Carvalho Chehab <mchehab@xxxxxxxxxx>; Robert Richter <rric@xxxxxxxxxx>; > Robert Moore <robert.moore@xxxxxxxxx>; Qiuxu Zhuo > <qiuxu.zhuo@xxxxxxxxx>; Yazen Ghannam <yazen.ghannam@xxxxxxx> > Cc: linux-acpi@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; > linux-edac@xxxxxxxxxxxxxxx; devel@xxxxxxxxxx; Rafael J . Wysocki > <rafael@xxxxxxxxxx>; Shuai Xue <xueshuai@xxxxxxxxxxxxxxxxx>; Jarkko > Sakkinen <jarkko@xxxxxxxxxx>; linux-efi@xxxxxxxxxxxxxxx; > toshi.kani@xxxxxxx; nd <nd@xxxxxxx>; kernel test robot <lkp@xxxxxxxxx> > Subject: RE: [PATCH v2 6/7] apei/ghes: Use unrcu_pointer for cmpxchg > > From: Jia He > > Sent: 17 August 2022 15:35 > > > > ghes_estatus_caches should be add rcu annotation to avoid sparse > warnings. > > drivers/acpi/apei/ghes.c:733:25: sparse: sparse: incompatible types > > in comparison expression (different address spaces): > > drivers/acpi/apei/ghes.c:733:25: sparse: struct > ghes_estatus_cache [noderef] __rcu * > > drivers/acpi/apei/ghes.c:733:25: sparse: struct > ghes_estatus_cache * > > drivers/acpi/apei/ghes.c:813:25: sparse: sparse: incompatible types > > in comparison expression (different address spaces): > > drivers/acpi/apei/ghes.c:813:25: sparse: struct > ghes_estatus_cache [noderef] __rcu * > > drivers/acpi/apei/ghes.c:813:25: sparse: struct > ghes_estatus_cache * > > > > unrcu_pointer is to strip the __rcu in cmpxchg. > > > > Reported-by: kernel test robot <lkp@xxxxxxxxx> > > Signed-off-by: Jia He <justin.he@xxxxxxx> > > --- > > drivers/acpi/apei/ghes.c | 7 ++++--- > > 1 file changed, 4 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index > > 9272d963b57d..92ae58f4f7bb 100644 > > --- a/drivers/acpi/apei/ghes.c > > +++ b/drivers/acpi/apei/ghes.c > > @@ -144,7 +144,7 @@ struct ghes_vendor_record_entry { static struct > > gen_pool *ghes_estatus_pool; static unsigned long > > ghes_estatus_pool_size_request; > > > > -static struct ghes_estatus_cache > > *ghes_estatus_caches[GHES_ESTATUS_CACHES_SIZE]; > > +static struct ghes_estatus_cache __rcu > > +*ghes_estatus_caches[GHES_ESTATUS_CACHES_SIZE]; > > static atomic_t ghes_estatus_cache_alloced; > > > > static int ghes_panic_timeout __read_mostly = 30; @@ -834,8 +834,9 > @@ > > static void ghes_estatus_cache_add( > > } > > /* new_cache must be put into array after its contents are written */ > > smp_wmb(); > > - if (slot != -1 && cmpxchg(ghes_estatus_caches + slot, > > - slot_cache, new_cache) == slot_cache) { > > + if (slot != -1 && unrcu_pointer(cmpxchg(ghes_estatus_caches + slot, > > + RCU_INITIALIZER(slot_cache), > > + RCU_INITIALIZER(new_cache)))) { > > Did you test this? > There seems to be an == missing. Sorry about it, -- Cheers, Justin (Jia He)