Messages in this thread | | | From | David Laight <> | Subject | RE: [PATCH v2 6/7] apei/ghes: Use unrcu_pointer for cmpxchg | Date | Wed, 17 Aug 2022 15:38:33 +0000 |
| |
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@intel.com> > Signed-off-by: Jia He <justin.he@arm.com> > --- > 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.
David
> if (slot_cache) > call_rcu(&slot_cache->rcu, ghes_estatus_cache_rcu_free); > } else > -- > 2.25.1
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
| |