On 10/19/16 7:57 AM, ido...@idosch.org wrote:
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index 136ae6bb..465e128 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -3877,7 +3877,7 @@ struct net_device *netdev_all_lower_get_next_rcu(struct 
> net_device *dev,
>            ldev = netdev_all_lower_get_next(dev, &(iter)))
>  
>  #define netdev_for_each_all_lower_dev_rcu(dev, ldev, iter) \
> -     for (iter = (dev)->all_adj_list.lower.next, \
> +     for (iter = &(dev)->all_adj_list.lower, \
>            ldev = netdev_all_lower_get_next_rcu(dev, &(iter)); \
>            ldev; \
>            ldev = netdev_all_lower_get_next_rcu(dev, &(iter)))
> diff --git a/net/core/dev.c b/net/core/dev.c
> index f1fe26f..b09ac57 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -5511,10 +5511,14 @@ struct net_device 
> *netdev_all_lower_get_next_rcu(struct net_device *dev,
>  {
>       struct netdev_adjacent *lower;
>  
> -     lower = list_first_or_null_rcu(&dev->all_adj_list.lower,
> -                                    struct netdev_adjacent, list);
> +     lower = list_entry_rcu((*iter)->next, struct netdev_adjacent, list);
> +
> +     if (&lower->list == &dev->all_adj_list.lower)
> +             return NULL;
> +
> +     *iter = &lower->list;
>  
> -     return lower ? lower->dev : NULL;
> +     return lower->dev;
>  }
>  EXPORT_SYMBOL(netdev_all_lower_get_next_rcu);


When I converted this function in my series I wondered how the current code 
worked at all. I guess I didn't. This is inline with what I did and matches the 
form used for the all_upper variant, so for 4.9 and 4.8.x

Acked-by: David Ahern <d...@cumulusnetworks.com>

I would like to see my series applied to 4.9 at some point.

Reply via email to