Le Fri, Oct 04, 2024 at 02:27:33PM -0400, Mathieu Desnoyers a écrit :
> +void hp_scan(struct hp_slot __percpu *percpu_slots, void *addr,
> +          void (*retire_cb)(int cpu, struct hp_slot *slot, void *addr))
> +{
> +     int cpu;
> +
> +     /*
> +      * Store A precedes hp_scan(): it unpublishes addr (sets it to
> +      * NULL or to a different value), and thus hides it from hazard
> +      * pointer readers.
> +      */
> +
> +     if (!addr)
> +             return;
> +     /* Memory ordering: Store A before Load B. */
> +     smp_mb();
> +     /* Scan all CPUs slots. */
> +     for_each_possible_cpu(cpu) {
> +             struct hp_slot *slot = per_cpu_ptr(percpu_slots, cpu);
> +
> +             if (retire_cb && smp_load_acquire(&slot->addr) == addr) /* Load 
> B */
> +                     retire_cb(cpu, slot, addr);
> +             /* Busy-wait if node is found. */
> +             while ((smp_load_acquire(&slot->addr)) == addr) /* Load B */
> +                     cpu_relax();

You agree that having a single possible per-cpu pointer per context and a busy
waiting update side pointer release can't be a general purpose hazard pointer
implementation, right? :-)

Thanks.

> +     }
> +}
> -- 
> 2.39.2
> 

Reply via email to