On Tue, Aug 20, 2019 at 10:15:18AM +0200, Petr Mladek wrote:

>       do {
>               tail_id = atomic_long_read(&nl->tail_id);
> 
>               /*
>                * Read might fail when the tail node has been removed
>                * and reused in parallel.
>                */
>               if (!numlist_read(nl, tail_id, NULL, &next_id))
>                       continue;
> 
>               /* Make sure the node is not the only node on the list. */
>               if (next_id == tail_id)
>                       return NULL;
> 
>               /* cC: Make sure the node is not busy. */
>               if (nl->busy(tail_id, nl->busy_arg))
>                       return NULL;
> 
>       while (atomic_long_cmpxchg_relaxed(&nl->tail_id, tail_id, next_id) !=
>                       tail_id);

Both you and John should have a look at atomic*_try_cmpxchg*(); with
that you can write the above as:

        tail_id = atomic_long_read(&nl->tai_id);
        do {
                ...
        } while (!atomic_long_try_cmpxchg_relaxed(&nl->tail_id, &tail_id, 
next_id));

And get better code-gen to boot.

Reply via email to