On 8/18/15 10:17 AM, Nikolay Aleksandrov wrote:
diff --git a/include/net/vrf.h b/include/net/vrf.h
index 40e3793c7a05..22dfe2195092 100644
--- a/include/net/vrf.h
+++ b/include/net/vrf.h
@@ -35,7 +35,6 @@ struct net_vrf {
#if IS_ENABLED(CONFIG_NET_VRF)
-/* called with rcu_read_lock() */
static inline int vrf_master_ifindex_rcu(const struct net_device *dev)
{
struct net_vrf_dev *vrf_ptr;
@@ -44,12 +43,14 @@ static inline int vrf_master_ifindex_rcu(const struct
net_device *dev)
if (!dev)
return 0;
- if (netif_is_vrf(dev))
+ if (netif_is_vrf(dev)) {
ifindex = dev->ifindex;
- else {
+ } else {
+ rcu_read_lock();
vrf_ptr = rcu_dereference(dev->vrf_ptr);
if (vrf_ptr)
ifindex = vrf_ptr->ifindex;
+ rcu_read_unlock();
}
return ifindex;
The intent of the _rcu in the name is to mean it is called with
rcu_read_lock held which is the case for __fib_validate_source and
ip_route_input_slow. It looks like the icmp callers (icmp_reply and
icmp_route_lookup) are the exceptions. For those create a
static inline int vrf_master_ifindex(const struct net_device *dev)
{
}
that does the rcu lock/unlock and calls vrf_master_ifindex_rcu in between.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html