* [net 0/3][pull request] Intel Wired LAN Driver Updates
@ 2013-11-19 15:40 Jeff Kirsher
2013-11-19 15:40 ` [net 1/3] net: allow netdev_all_upper_get_next_dev_rcu with rtnl lock held Jeff Kirsher
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Jeff Kirsher @ 2013-11-19 15:40 UTC (permalink / raw)
To: davem; +Cc: Jeff Kirsher, netdev, gospo, sassmann
This series contains updates to net and igb.
John provides a patch against net to be able to walk all upper devices
when bringing a device online where the RTNL lock is held.
Akeem provides a igb fix where WOL was being reported as supported on
some ethernet devices which did not have that capability.
Carolyn provides a igb fix to add a call to dev_close if the queue
reinit fails in order to make it clear to the user that the device is
down.
The following are changes since commit d11a347de3f521af62da25e74156ea39e3774f19:
be2net: Delete secondary unicast MAC addresses during be_close
and are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net master
Akeem G Abodunrin (1):
igb: Fixed Wake On Lan support
Carolyn Wyborny (1):
igb: Update queue reinit function to call dev_close when init of
queues fails
John Fastabend (1):
net: allow netdev_all_upper_get_next_dev_rcu with rtnl lock held
drivers/net/ethernet/intel/igb/igb_ethtool.c | 7 +++--
drivers/net/ethernet/intel/igb/igb_main.c | 1 +
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 6 ++--
include/linux/netdevice.h | 9 ++++++
net/core/dev.c | 43 ++++++++++++++++++++-------
5 files changed, 49 insertions(+), 17 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [net 1/3] net: allow netdev_all_upper_get_next_dev_rcu with rtnl lock held
2013-11-19 15:40 [net 0/3][pull request] Intel Wired LAN Driver Updates Jeff Kirsher
@ 2013-11-19 15:40 ` Jeff Kirsher
2013-11-19 17:18 ` John Fastabend
2013-11-19 15:40 ` [net 2/3] igb: Fixed Wake On Lan support Jeff Kirsher
2013-11-19 15:40 ` [net 3/3] igb: Update queue reinit function to call dev_close when init of queues fails Jeff Kirsher
2 siblings, 1 reply; 5+ messages in thread
From: Jeff Kirsher @ 2013-11-19 15:40 UTC (permalink / raw)
To: davem
Cc: John Fastabend, netdev, gospo, sassmann, Veaceslav Falico,
Jeff Kirsher
From: John Fastabend <john.r.fastabend@intel.com>
It is useful to be able to walk all upper devices when bringing
a device online where the RTNL lock is held. In this case it
is safe to walk the all_adj_list because the RTNL lock is used
to protect the write side as well.
Here we rearrange the netdev_all_upper_get_next_dev_rcu into three
routines:
netdev_all_upper_get_next_dev_rcu()
netdev_all_upper_get_next_dev_rtnl()
netdev_all_upper_get_next_dev()
One for RCU callers, one for RTNL callers and a final routine
to implement the work. Both the _rcu and _rtnl variants are
exposed. Where the net/ethernet/intel/ixgbe driver is a consumer
of the _rtnl variant. netdev_all_upper_get_next_dev() is static.
CC: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 6 ++--
include/linux/netdevice.h | 9 ++++++
net/core/dev.c | 43 ++++++++++++++++++++-------
3 files changed, 44 insertions(+), 14 deletions(-)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index bd8f523..9eeb6f0 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -4336,7 +4336,7 @@ static void ixgbe_configure_dfwd(struct ixgbe_adapter *adapter)
struct list_head *iter;
int err;
- netdev_for_each_all_upper_dev_rcu(adapter->netdev, upper, iter) {
+ netdev_for_each_all_upper_dev_rtnl(adapter->netdev, upper, iter) {
if (netif_is_macvlan(upper)) {
struct macvlan_dev *dfwd = netdev_priv(upper);
struct ixgbe_fwd_adapter *vadapter = dfwd->fwd_priv;
@@ -4601,7 +4601,7 @@ static void ixgbe_up_complete(struct ixgbe_adapter *adapter)
netif_tx_start_all_queues(adapter->netdev);
/* enable any upper devices */
- netdev_for_each_all_upper_dev_rcu(adapter->netdev, upper, iter) {
+ netdev_for_each_all_upper_dev_rtnl(adapter->netdev, upper, iter) {
if (netif_is_macvlan(upper)) {
struct macvlan_dev *vlan = netdev_priv(upper);
@@ -4803,7 +4803,7 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
netif_tx_disable(netdev);
/* disable any upper devices */
- netdev_for_each_all_upper_dev_rcu(adapter->netdev, upper, iter) {
+ netdev_for_each_all_upper_dev_rtnl(adapter->netdev, upper, iter) {
if (netif_is_macvlan(upper)) {
struct macvlan_dev *vlan = netdev_priv(upper);
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 8b3de7c..59872b2 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2843,6 +2843,8 @@ bool netdev_has_upper_dev(struct net_device *dev, struct net_device *upper_dev);
bool netdev_has_any_upper_dev(struct net_device *dev);
struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev,
struct list_head **iter);
+struct net_device *netdev_all_upper_get_next_dev_rtnl(struct net_device *dev,
+ struct list_head **iter);
/* iterate through upper list, must be called under RCU read lock */
#define netdev_for_each_all_upper_dev_rcu(dev, updev, iter) \
@@ -2851,6 +2853,13 @@ struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev,
updev; \
updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)))
+/* iterate through upper list, must be called under RTNL */
+#define netdev_for_each_all_upper_dev_rtnl(dev, updev, iter) \
+ for (iter = &(dev)->all_adj_list.upper, \
+ updev = netdev_all_upper_get_next_dev_rtnl(dev, &(iter)); \
+ updev; \
+ updev = netdev_all_upper_get_next_dev_rtnl(dev, &(iter)))
+
void *netdev_lower_get_next_private(struct net_device *dev,
struct list_head **iter);
void *netdev_lower_get_next_private_rcu(struct net_device *dev,
diff --git a/net/core/dev.c b/net/core/dev.c
index 7e00a73..79c4c1e 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4487,6 +4487,21 @@ void *netdev_adjacent_get_private(struct list_head *adj_list)
}
EXPORT_SYMBOL(netdev_adjacent_get_private);
+static struct net_device *netdev_all_upper_get_next_dev(struct net_device *dev,
+ struct list_head **iter)
+{
+ struct netdev_adjacent *upper;
+
+ upper = list_entry_rcu((*iter)->next, struct netdev_adjacent, list);
+
+ if (&upper->list == &dev->all_adj_list.upper)
+ return NULL;
+
+ *iter = &upper->list;
+
+ return upper->dev;
+}
+
/**
* netdev_all_upper_get_next_dev_rcu - Get the next dev from upper list
* @dev: device
@@ -4498,22 +4513,28 @@ EXPORT_SYMBOL(netdev_adjacent_get_private);
struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev,
struct list_head **iter)
{
- struct netdev_adjacent *upper;
-
WARN_ON_ONCE(!rcu_read_lock_held());
-
- upper = list_entry_rcu((*iter)->next, struct netdev_adjacent, list);
-
- if (&upper->list == &dev->all_adj_list.upper)
- return NULL;
-
- *iter = &upper->list;
-
- return upper->dev;
+ return netdev_all_upper_get_next_dev(dev, iter);
}
EXPORT_SYMBOL(netdev_all_upper_get_next_dev_rcu);
/**
+ * netdev_all_upper_get_next_dev_rtnl - Get the next dev from upper list
+ * @dev: device
+ * @iter: list_head ** of the current position
+ *
+ * Gets the next device from the dev's upper list, starting from iter
+ * position. The caller must hold RTNL.
+ */
+struct net_device *netdev_all_upper_get_next_dev_rtnl(struct net_device *dev,
+ struct list_head **iter)
+{
+ WARN_ON_ONCE(!lockdep_rtnl_is_held());
+ return netdev_all_upper_get_next_dev(dev, iter);
+}
+EXPORT_SYMBOL(netdev_all_upper_get_next_dev_rtnl);
+
+/**
* netdev_lower_get_next_private - Get the next ->private from the
* lower neighbour list
* @dev: device
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [net 2/3] igb: Fixed Wake On Lan support
2013-11-19 15:40 [net 0/3][pull request] Intel Wired LAN Driver Updates Jeff Kirsher
2013-11-19 15:40 ` [net 1/3] net: allow netdev_all_upper_get_next_dev_rcu with rtnl lock held Jeff Kirsher
@ 2013-11-19 15:40 ` Jeff Kirsher
2013-11-19 15:40 ` [net 3/3] igb: Update queue reinit function to call dev_close when init of queues fails Jeff Kirsher
2 siblings, 0 replies; 5+ messages in thread
From: Jeff Kirsher @ 2013-11-19 15:40 UTC (permalink / raw)
To: davem; +Cc: Akeem G Abodunrin, netdev, gospo, sassmann, Jeff Kirsher
From: Akeem G Abodunrin <akeem.g.abodunrin@intel.com>
This patch fixes Wake on Lan being reported as supported on some Ethernet
ports, in contrary to Hardware capability.
Signed-off-by: Akeem G Abodunrin <akeem.g.abodunrin@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
drivers/net/ethernet/intel/igb/igb_ethtool.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index b0f3666..c3143da 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -2062,14 +2062,15 @@ static void igb_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
{
struct igb_adapter *adapter = netdev_priv(netdev);
- wol->supported = WAKE_UCAST | WAKE_MCAST |
- WAKE_BCAST | WAKE_MAGIC |
- WAKE_PHY;
wol->wolopts = 0;
if (!(adapter->flags & IGB_FLAG_WOL_SUPPORTED))
return;
+ wol->supported = WAKE_UCAST | WAKE_MCAST |
+ WAKE_BCAST | WAKE_MAGIC |
+ WAKE_PHY;
+
/* apply any specific unsupported masks here */
switch (adapter->hw.device_id) {
default:
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [net 3/3] igb: Update queue reinit function to call dev_close when init of queues fails
2013-11-19 15:40 [net 0/3][pull request] Intel Wired LAN Driver Updates Jeff Kirsher
2013-11-19 15:40 ` [net 1/3] net: allow netdev_all_upper_get_next_dev_rcu with rtnl lock held Jeff Kirsher
2013-11-19 15:40 ` [net 2/3] igb: Fixed Wake On Lan support Jeff Kirsher
@ 2013-11-19 15:40 ` Jeff Kirsher
2 siblings, 0 replies; 5+ messages in thread
From: Jeff Kirsher @ 2013-11-19 15:40 UTC (permalink / raw)
To: davem; +Cc: Carolyn Wyborny, netdev, gospo, sassmann, Jeff Kirsher
From: Carolyn Wyborny <carolyn.wyborny@intel.com>
This patch adds a call to dev_close if the queue reinit fails in order
to make clearer to the user that the device is down.
Signed-off-by: Carolyn Wyborny <carolyn.wyborny@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
drivers/net/ethernet/intel/igb/igb_main.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index ebe6370..40320bd 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -7847,6 +7847,7 @@ int igb_reinit_queues(struct igb_adapter *adapter)
if (igb_init_interrupt_scheme(adapter, true)) {
dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
+ dev_close(netdev);
return -ENOMEM;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [net 1/3] net: allow netdev_all_upper_get_next_dev_rcu with rtnl lock held
2013-11-19 15:40 ` [net 1/3] net: allow netdev_all_upper_get_next_dev_rcu with rtnl lock held Jeff Kirsher
@ 2013-11-19 17:18 ` John Fastabend
0 siblings, 0 replies; 5+ messages in thread
From: John Fastabend @ 2013-11-19 17:18 UTC (permalink / raw)
To: Jeff Kirsher
Cc: davem, John Fastabend, netdev, gospo, sassmann, Veaceslav Falico
On 11/19/2013 07:40 AM, Jeff Kirsher wrote:
> From: John Fastabend <john.r.fastabend@intel.com>
>
> It is useful to be able to walk all upper devices when bringing
> a device online where the RTNL lock is held. In this case it
> is safe to walk the all_adj_list because the RTNL lock is used
> to protect the write side as well.
>
> Here we rearrange the netdev_all_upper_get_next_dev_rcu into three
> routines:
>
> netdev_all_upper_get_next_dev_rcu()
> netdev_all_upper_get_next_dev_rtnl()
> netdev_all_upper_get_next_dev()
>
> One for RCU callers, one for RTNL callers and a final routine
> to implement the work. Both the _rcu and _rtnl variants are
> exposed. Where the net/ethernet/intel/ixgbe driver is a consumer
> of the _rtnl variant. netdev_all_upper_get_next_dev() is static.
>
> CC: Veaceslav Falico <vfalico@redhat.com>
> Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> ---
[...]
NAK, lockdep_rtnl_is_held() is wrapped in CONFIG_PROVE_LOCKING,
#ifdef CONFIG_PROVE_LOCKING
extern int lockdep_rtnl_is_held(void);
#endif /* #ifdef CONFIG_PROVE_LOCKING */
[...]
> +struct net_device *netdev_all_upper_get_next_dev_rtnl(struct net_device *dev,
> + struct list_head **iter)
> +{
> + WARN_ON_ONCE(!lockdep_rtnl_is_held());
so this can cause a build error without CONFIG_PROVE_LOCKING. I can
either wrap this in a CONFIG_PROVE_LOCKING or do something like this,
extern int rtnl_is_locked(void);
#ifdef CONFIG_PROVE_LOCKING
extern int lockdep_rtnl_is_held(void);
+#else
+static inline int lockdep_rtnl_is_held(void)
+{
+ return 0;
+}
#endif /* #ifdef CONFIG_PROVE_LOCKING */
The lazy way to do this is to wrap the call site in rcu_read_{un}lock
but I would prefer not to do that.
> + return netdev_all_upper_get_next_dev(dev, iter);
> +}
Sorry for the noise I'll spin a new version.
John
--
John Fastabend Intel Corporation
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-11-19 17:18 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-19 15:40 [net 0/3][pull request] Intel Wired LAN Driver Updates Jeff Kirsher
2013-11-19 15:40 ` [net 1/3] net: allow netdev_all_upper_get_next_dev_rcu with rtnl lock held Jeff Kirsher
2013-11-19 17:18 ` John Fastabend
2013-11-19 15:40 ` [net 2/3] igb: Fixed Wake On Lan support Jeff Kirsher
2013-11-19 15:40 ` [net 3/3] igb: Update queue reinit function to call dev_close when init of queues fails Jeff Kirsher
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.