On Mon, 2017-10-02 at 12:27 +0200, Florian Westphal wrote:
> Device alias can be set by either rtnetlink (rtnl is held) or sysfs.
> 
> rtnetlink hold the rtnl mutex, sysfs acquires it for this purpose.
> Add an extra mutex for it plus a seqcount to get a consistent snapshot
> of the alias buffer.


> +int dev_get_alias(const struct net_device *dev, char *alias, size_t len)
> +{
> +     unsigned int seq;
> +     int ret;
> +
> +     for (;;) {
> +             const char *name;
> +
> +             ret = 0;
> +             rcu_read_lock();
> +             name = rcu_dereference(dev->ifalias);
> +             seq = raw_seqcount_begin(&ifalias_rename_seq);
> +             if (name)
> +                     ret = snprintf(alias, len, "%s", name);
> +             rcu_read_unlock();
> +
> +             if (!read_seqcount_retry(&ifalias_rename_seq, seq))
> +                     break;
> +
> +             cond_resched();
> +     }
> +
> +     return ret;
> +}

I believe this too complex and not needed.

Just use RCU : A writer is supposed to work on a private copy, and
_then_ publish the new pointer, so that a reader can not see mangled
string.

We either copy the 'old' name or the 'new' one.

A seqcount is not needed, and wont prevent you from reading the value
right before a change anyway.



Reply via email to