Skip to content

Commit

Permalink
Merge branch 'netpoll-next'
Browse files Browse the repository at this point in the history
Eric W. Biederman says:

====================
netpoll: Cleanups and fixes

This should be a small set of safe cleanups and fixes to netpoll.

The fixes are vlan headers are now always inserted when needed, and
napi polling is always avoided when network devices are closed.

There are a bunch of little cleanups removing unnecessary code, fixing
function naming, not taking unnecessary locks and removing general
silliness.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Mar 29, 2014
2 parents 3f705f7 + 5efeac4 commit 587daaf
Show file tree
Hide file tree
Showing 10 changed files with 91 additions and 85 deletions.
6 changes: 3 additions & 3 deletions drivers/net/bonding/bond_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -922,12 +922,12 @@ static inline int slave_enable_netpoll(struct slave *slave)
struct netpoll *np;
int err = 0;

np = kzalloc(sizeof(*np), GFP_ATOMIC);
np = kzalloc(sizeof(*np), GFP_KERNEL);
err = -ENOMEM;
if (!np)
goto out;

err = __netpoll_setup(np, slave->dev, GFP_ATOMIC);
err = __netpoll_setup(np, slave->dev);
if (err) {
kfree(np);
goto out;
Expand Down Expand Up @@ -962,7 +962,7 @@ static void bond_netpoll_cleanup(struct net_device *bond_dev)
slave_disable_netpoll(slave);
}

static int bond_netpoll_setup(struct net_device *dev, struct netpoll_info *ni, gfp_t gfp)
static int bond_netpoll_setup(struct net_device *dev, struct netpoll_info *ni)
{
struct bonding *bond = netdev_priv(dev);
struct list_head *iter;
Expand Down
16 changes: 7 additions & 9 deletions drivers/net/team/team.c
Original file line number Diff line number Diff line change
Expand Up @@ -1031,20 +1031,19 @@ static void team_port_leave(struct team *team, struct team_port *port)
}

#ifdef CONFIG_NET_POLL_CONTROLLER
static int team_port_enable_netpoll(struct team *team, struct team_port *port,
gfp_t gfp)
static int team_port_enable_netpoll(struct team *team, struct team_port *port)
{
struct netpoll *np;
int err;

if (!team->dev->npinfo)
return 0;

np = kzalloc(sizeof(*np), gfp);
np = kzalloc(sizeof(*np), GFP_KERNEL);
if (!np)
return -ENOMEM;

err = __netpoll_setup(np, port->dev, gfp);
err = __netpoll_setup(np, port->dev);
if (err) {
kfree(np);
return err;
Expand All @@ -1067,8 +1066,7 @@ static void team_port_disable_netpoll(struct team_port *port)
kfree(np);
}
#else
static int team_port_enable_netpoll(struct team *team, struct team_port *port,
gfp_t gfp)
static int team_port_enable_netpoll(struct team *team, struct team_port *port)
{
return 0;
}
Expand Down Expand Up @@ -1156,7 +1154,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev)
goto err_vids_add;
}

err = team_port_enable_netpoll(team, port, GFP_KERNEL);
err = team_port_enable_netpoll(team, port);
if (err) {
netdev_err(dev, "Failed to enable netpoll on device %s\n",
portname);
Expand Down Expand Up @@ -1850,15 +1848,15 @@ static void team_netpoll_cleanup(struct net_device *dev)
}

static int team_netpoll_setup(struct net_device *dev,
struct netpoll_info *npifo, gfp_t gfp)
struct netpoll_info *npifo)
{
struct team *team = netdev_priv(dev);
struct team_port *port;
int err = 0;

mutex_lock(&team->lock);
list_for_each_entry(port, &team->port_list, list) {
err = team_port_enable_netpoll(team, port, gfp);
err = team_port_enable_netpoll(team, port);
if (err) {
__team_netpoll_cleanup(team);
break;
Expand Down
8 changes: 6 additions & 2 deletions include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -1037,8 +1037,7 @@ struct net_device_ops {
#ifdef CONFIG_NET_POLL_CONTROLLER
void (*ndo_poll_controller)(struct net_device *dev);
int (*ndo_netpoll_setup)(struct net_device *dev,
struct netpoll_info *info,
gfp_t gfp);
struct netpoll_info *info);
void (*ndo_netpoll_cleanup)(struct net_device *dev);
#endif
#ifdef CONFIG_NET_RX_BUSY_POLL
Expand Down Expand Up @@ -2910,6 +2909,11 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
} \
}

#define HARD_TX_TRYLOCK(dev, txq) \
(((dev->features & NETIF_F_LLTX) == 0) ? \
__netif_tx_trylock(txq) : \
true )

#define HARD_TX_UNLOCK(dev, txq) { \
if ((dev->features & NETIF_F_LLTX) == 0) { \
__netif_tx_unlock(txq); \
Expand Down
10 changes: 5 additions & 5 deletions include/linux/netpoll.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,17 +47,17 @@ struct netpoll_info {
};

#ifdef CONFIG_NETPOLL
extern void netpoll_rx_disable(struct net_device *dev);
extern void netpoll_rx_enable(struct net_device *dev);
extern void netpoll_poll_disable(struct net_device *dev);
extern void netpoll_poll_enable(struct net_device *dev);
#else
static inline void netpoll_rx_disable(struct net_device *dev) { return; }
static inline void netpoll_rx_enable(struct net_device *dev) { return; }
static inline void netpoll_poll_disable(struct net_device *dev) { return; }
static inline void netpoll_poll_enable(struct net_device *dev) { return; }
#endif

void netpoll_send_udp(struct netpoll *np, const char *msg, int len);
void netpoll_print_options(struct netpoll *np);
int netpoll_parse_options(struct netpoll *np, char *opt);
int __netpoll_setup(struct netpoll *np, struct net_device *ndev, gfp_t gfp);
int __netpoll_setup(struct netpoll *np, struct net_device *ndev);
int netpoll_setup(struct netpoll *np);
void __netpoll_cleanup(struct netpoll *np);
void __netpoll_free_async(struct netpoll *np);
Expand Down
7 changes: 3 additions & 4 deletions net/8021q/vlan_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -707,20 +707,19 @@ static void vlan_dev_poll_controller(struct net_device *dev)
return;
}

static int vlan_dev_netpoll_setup(struct net_device *dev, struct netpoll_info *npinfo,
gfp_t gfp)
static int vlan_dev_netpoll_setup(struct net_device *dev, struct netpoll_info *npinfo)
{
struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
struct net_device *real_dev = vlan->real_dev;
struct netpoll *netpoll;
int err = 0;

netpoll = kzalloc(sizeof(*netpoll), gfp);
netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
err = -ENOMEM;
if (!netpoll)
goto out;

err = __netpoll_setup(netpoll, real_dev, gfp);
err = __netpoll_setup(netpoll, real_dev);
if (err) {
kfree(netpoll);
goto out;
Expand Down
15 changes: 7 additions & 8 deletions net/bridge/br_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,16 +218,16 @@ static void br_netpoll_cleanup(struct net_device *dev)
br_netpoll_disable(p);
}

static int __br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
static int __br_netpoll_enable(struct net_bridge_port *p)
{
struct netpoll *np;
int err;

np = kzalloc(sizeof(*p->np), gfp);
np = kzalloc(sizeof(*p->np), GFP_KERNEL);
if (!np)
return -ENOMEM;

err = __netpoll_setup(np, p->dev, gfp);
err = __netpoll_setup(np, p->dev);
if (err) {
kfree(np);
return err;
Expand All @@ -237,16 +237,15 @@ static int __br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
return err;
}

int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
int br_netpoll_enable(struct net_bridge_port *p)
{
if (!p->br->dev->npinfo)
return 0;

return __br_netpoll_enable(p, gfp);
return __br_netpoll_enable(p);
}

static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni,
gfp_t gfp)
static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni)
{
struct net_bridge *br = netdev_priv(dev);
struct net_bridge_port *p;
Expand All @@ -255,7 +254,7 @@ static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni,
list_for_each_entry(p, &br->port_list, list) {
if (!p->dev)
continue;
err = __br_netpoll_enable(p, gfp);
err = __br_netpoll_enable(p);
if (err)
goto fail;
}
Expand Down
2 changes: 1 addition & 1 deletion net/bridge/br_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
if (err)
goto err2;

err = br_netpoll_enable(p, GFP_KERNEL);
err = br_netpoll_enable(p);
if (err)
goto err3;

Expand Down
4 changes: 2 additions & 2 deletions net/bridge/br_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -349,15 +349,15 @@ static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
netpoll_send_skb(np, skb);
}

int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp);
int br_netpoll_enable(struct net_bridge_port *p);
void br_netpoll_disable(struct net_bridge_port *p);
#else
static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
struct sk_buff *skb)
{
}

static inline int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
static inline int br_netpoll_enable(struct net_bridge_port *p)
{
return 0;
}
Expand Down
17 changes: 6 additions & 11 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1245,7 +1245,7 @@ static int __dev_open(struct net_device *dev)
* If we don't do this there is a chance ndo_poll_controller
* or ndo_poll may be running while we open the device
*/
netpoll_rx_disable(dev);
netpoll_poll_disable(dev);

ret = call_netdevice_notifiers(NETDEV_PRE_UP, dev);
ret = notifier_to_errno(ret);
Expand All @@ -1260,7 +1260,7 @@ static int __dev_open(struct net_device *dev)
if (!ret && ops->ndo_open)
ret = ops->ndo_open(dev);

netpoll_rx_enable(dev);
netpoll_poll_enable(dev);

if (ret)
clear_bit(__LINK_STATE_START, &dev->state);
Expand Down Expand Up @@ -1313,6 +1313,9 @@ static int __dev_close_many(struct list_head *head)
might_sleep();

list_for_each_entry(dev, head, close_list) {
/* Temporarily disable netpoll until the interface is down */
netpoll_poll_disable(dev);

call_netdevice_notifiers(NETDEV_GOING_DOWN, dev);

clear_bit(__LINK_STATE_START, &dev->state);
Expand Down Expand Up @@ -1343,6 +1346,7 @@ static int __dev_close_many(struct list_head *head)

dev->flags &= ~IFF_UP;
net_dmaengine_put();
netpoll_poll_enable(dev);
}

return 0;
Expand All @@ -1353,14 +1357,10 @@ static int __dev_close(struct net_device *dev)
int retval;
LIST_HEAD(single);

/* Temporarily disable netpoll until the interface is down */
netpoll_rx_disable(dev);

list_add(&dev->close_list, &single);
retval = __dev_close_many(&single);
list_del(&single);

netpoll_rx_enable(dev);
return retval;
}

Expand Down Expand Up @@ -1398,14 +1398,9 @@ int dev_close(struct net_device *dev)
if (dev->flags & IFF_UP) {
LIST_HEAD(single);

/* Block netpoll rx while the interface is going down */
netpoll_rx_disable(dev);

list_add(&dev->close_list, &single);
dev_close_many(&single);
list_del(&single);

netpoll_rx_enable(dev);
}
return 0;
}
Expand Down
Loading

0 comments on commit 587daaf

Please sign in to comment.