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.desnoy...@efficios.com/

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

Reply via email to