On Thu, Feb 2, 2017 at 3:47 PM, Joel Cunningham <joel.cunning...@me.com> wrote: > Hi, > > I’m studying the synchronization used on different parts of struct net_device > and I’m struggling to understand how structure member modifications in > dev_ioctl are synchronized. Getters in dev_ifsioc_locked() are only holding > rcu_read_lock() while setters in dev_ifsioc() are holding rtnl_lock, but not > using RCU APIs. I was specifically looking at SIOCGIFHWADDR/SIOCSIFHWADDR. > What’s to prevent one CPU from executing a getter and another CPU from > executing a setter resulting in possibly a torn read/write? I didn’t see > anything in rtnl_lock() that would wait for any rcu_reader_lock() critical > sections (on other CPUs) to finish before acquiring the mutex. > > Is there something about dev_ioctl that prevents parallel execution? or maybe > something I still don’t understand about the RCU implementation? > > Thanks, > > Joel
My advice would be to spend more time familiarizing yourself with RCU. The advantage of RCU is that it allows for updates while other threads are accessing the data. The rtnl_lock is just meant to prevent multiple writers from updating the data simultaneously. So between writers the rtnl_lock is used to keep things synchronized, but between writers and readers the mechanism that is meant to protect the data and keep it sane is RCU. - Alex