Re: [PATCH 0/8] Introduce simple hazard pointers for lockdep
From: Paul E. McKenney
Date: Thu Jun 26 2025 - 22:56:58 EST
On Thu, Jun 26, 2025 at 08:47:25AM -0700, Boqun Feng wrote:
> On Thu, Jun 26, 2025 at 03:16:49AM -0700, Christoph Hellwig wrote:
> > On Wed, Jun 25, 2025 at 07:08:57AM -0700, Boqun Feng wrote:
> > > Sure, I will put one for the future version, here is the gist:
> >
> > Thanks a lot!
> >
> > > The updater's wait can finish immediately if no one is accessing 'a', in
> > > other words it doesn't need to wait for reader 2.
> >
> > So basically it is the RCU concept, but limited to protecting exactly
> > one pointer update per critical section with no ability for the read
> > to e.g. acquire a refcount on the objected pointed to by that pointer?
>
> For the current simple hazard pointer, yes. But simple hazard pointers
> is easily to extend so support reading:
>
> { gp is a global pointer }
>
> Reader Updater
> ====== =======
> g = shazptr_acquire(p):
> WRITE_ONCE(*this_cpu_ptr(slot), gp);
> smp_mb();
>
> if (READ_ONCE(gp) == *this_cpu_ptr(slot)) {
> // still being protected.
> <can read gp here>
> to_free = READ_ONCE(gp);
> WRITE_ONCE(gp, new);
> synchronize_shazptr(to_free):
> smp_mb();
> // wait on the slot of reader
> // CPU being 0.
> READ_ONCE(per_cpu(reader, slot));
> }
>
> shazptr_clear(g):
> WRITE_ONCE(*this_cpu_ptr(slot), NULL); // unblock synchronize_shazptr()
>
>
> Usually the shazptr_acqurie() + "pointer comparison"* is called
> shazptr_try_protect().
>
> I will add a document about this in the next version along with other
> bits of hazard pointers.
>
> [*]: The pointer comparison is more complicated topic, but Mathieu has
> figured out how to do it correctly:
>
> https://lore.kernel.org/lkml/20241008135034.1982519-2-mathieu.desnoyers@xxxxxxxxxxxx/
It might be helpful to add that, at a high level, hazard pointers
are a scalable replacement for reference counting. At a similarly
high level, RCU is a scalable replacement for reader-writer locking.
At lower levels, there is considerable overlap in applicability, so that
you can use RCU to replace many reference-counting use cases and hazard
pointers to replace many reader-writer-locking use cases..
Plus, as both Mathieu and Boqun pointed out, both RCU and hazard pointers
can be combined with other synchronization mechanisms, including each
other.
Thanx, Paul