lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 15 Jan 2010 07:15:59 -0800 From: "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com> To: Eric Dumazet <eric.dumazet@...il.com> Cc: yoshfuji@...ux-ipv6.org, netdev@...r.kernel.org, mingo@...e.hu, akpm@...ux-foundation.org, peterz@...radead.org Subject: Re: What protects rcu_dereference() in __in6_dev_get()? On Fri, Jan 15, 2010 at 06:50:15AM +0100, Eric Dumazet wrote: > Le 14/01/2010 19:32, Paul E. McKenney a écrit : > > Hello, Yoshi, > > > > Could you please tell me what protects the rcu_dereference() in > > __in6_dev_get()? I am adding lockdep-based checking to RCU, and > > "git blame" said I should ask you about this one. > > > > The current code, rcu_dereference(), assumes that this is protected only > > by RCU. My problem might be any of the following: > > > > o Some other flavor of RCU protects this, e.g., RCU-bh, which > > would require rcu_dereference_bh(). > > > > o This is called from updates as well as from readers, and > > some lock protects the updates. > > > > o This is called during initialization, when this pointer is > > inaccessible to readers. > > > > Please note that I can add a check to cover multiple possibilities. > > For a real example in include/linux/fdtable.h: > > > > file = rcu_dereference_check(fdt->fd[fd], > > rcu_read_lock_held() || > > lockdep_is_held(&files->file_lock) || > > atomic_read(&files->count) == 1); > > > > The first argument is the pointer, and the second argument says that > > this may be protected by either RCU (as opposed to RCU-bh, RCU-sched, > > or SRCU), the files->file_lock as recorded by lockdep, or by being in > > a single-threaded process as noted by the value of files->count. > > (Please see http://lwn.net/Articles/368683/ for a recent patch, another > > will go out soon.) > > > > So, could you please tell me what protects the rcu_dereference() > > in __in6_dev_get() so that I can craft the appropriate form of > > rcu_dereference()? > > > > Thanx, Paul > > Hi Paul > > __in6_dev_get() is called either with rcu_read_lock()/rcu_read_unlock() protection, > or with the RTNL mutex held. Very good! So I make a lockdep_rtnl_is_held() in net/core/rtnetlink.c: #ifdef CONFIG_PROVE_LOCKING int lockdep_rtnl_is_held(void) { return lockdep_is_held(&rtnl_mutex); } EXPORT_SYMBOL(lockdep_rtnl_is_held); #endif /* #ifdef CONFIG_PROVE_LOCKING */ Then I make __in6_dev_get() look as follows: static inline struct inet6_dev * __in6_dev_get(struct net_device *dev) { return rcu_dereference_check(dev->ip6_ptr, rcu_read_lock_held() || lockdep_rtnl_is_held()); } Seem reasonable? > Well, thats the theory, we could have some bugs of course :) I know that feeling! ;-) Thanx, Paul -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists