Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 194793
b: refs/heads/master
c: 0e34e93
h: refs/heads/master
i:
  194791: 8dbceed
v: v3
  • Loading branch information
WANG Cong authored and David S. Miller committed May 6, 2010
1 parent 7dfbd65 commit c8ad0a5
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 08259594e047170923ef11d1482648642bfe606f
refs/heads/master: 0e34e93177fb1f642cab080e0bde664c06c7183a
15 changes: 9 additions & 6 deletions trunk/drivers/net/netconsole.c
Original file line number Diff line number Diff line change
Expand Up @@ -665,7 +665,8 @@ static int netconsole_netdev_event(struct notifier_block *this,
struct netconsole_target *nt;
struct net_device *dev = ptr;

if (!(event == NETDEV_CHANGENAME || event == NETDEV_UNREGISTER))
if (!(event == NETDEV_CHANGENAME || event == NETDEV_UNREGISTER ||
event == NETDEV_BONDING_DESLAVE || event == NETDEV_GOING_DOWN))
goto done;

spin_lock_irqsave(&target_list_lock, flags);
Expand All @@ -677,19 +678,21 @@ static int netconsole_netdev_event(struct notifier_block *this,
strlcpy(nt->np.dev_name, dev->name, IFNAMSIZ);
break;
case NETDEV_UNREGISTER:
if (!nt->enabled)
break;
netpoll_cleanup(&nt->np);
/* Fall through */
case NETDEV_GOING_DOWN:
case NETDEV_BONDING_DESLAVE:
nt->enabled = 0;
printk(KERN_INFO "netconsole: network logging stopped"
", interface %s unregistered\n",
dev->name);
break;
}
}
netconsole_target_put(nt);
}
spin_unlock_irqrestore(&target_list_lock, flags);
if (event == NETDEV_UNREGISTER || event == NETDEV_BONDING_DESLAVE)
printk(KERN_INFO "netconsole: network logging stopped, "
"interface %s %s\n", dev->name,
event == NETDEV_UNREGISTER ? "unregistered" : "released slaves");

done:
return NOTIFY_DONE;
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/if.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@
* release skb->dst
*/
#define IFF_DONT_BRIDGE 0x800 /* disallow bridging this ether dev */
#define IFF_IN_NETPOLL 0x1000 /* whether we are processing netpoll */
#define IFF_DISABLE_NETPOLL 0x2000 /* disable netpoll at run-time */

#define IF_GET_IFACE 0x0001 /* for querying only */
#define IF_GET_PROTO 0x0002
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -724,6 +724,7 @@ struct net_device_ops {
unsigned short vid);
#ifdef CONFIG_NET_POLL_CONTROLLER
void (*ndo_poll_controller)(struct net_device *dev);
void (*ndo_netpoll_cleanup)(struct net_device *dev);
#endif
int (*ndo_set_vf_mac)(struct net_device *dev,
int queue, u8 *mac);
Expand Down
5 changes: 5 additions & 0 deletions trunk/include/linux/netpoll.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

struct netpoll {
struct net_device *dev;
struct net_device *real_dev;
char dev_name[IFNAMSIZ];
const char *name;
void (*rx_hook)(struct netpoll *, int, char *, int);
Expand All @@ -36,8 +37,11 @@ struct netpoll_info {
struct sk_buff_head txq;

struct delayed_work tx_work;

struct netpoll *netpoll;
};

void netpoll_poll_dev(struct net_device *dev);
void netpoll_poll(struct netpoll *np);
void netpoll_send_udp(struct netpoll *np, const char *msg, int len);
void netpoll_print_options(struct netpoll *np);
Expand All @@ -47,6 +51,7 @@ int netpoll_trap(void);
void netpoll_set_trap(int trap);
void netpoll_cleanup(struct netpoll *np);
int __netpoll_rx(struct sk_buff *skb);
void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb);


#ifdef CONFIG_NETPOLL
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/notifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ static inline int notifier_to_errno(int ret)
#define NETDEV_POST_TYPE_CHANGE 0x000F
#define NETDEV_POST_INIT 0x0010
#define NETDEV_UNREGISTER_BATCH 0x0011
#define NETDEV_BONDING_DESLAVE 0x0012

#define SYS_DOWN 0x0001 /* Notify of system down */
#define SYS_RESTART SYS_DOWN
Expand Down
26 changes: 21 additions & 5 deletions trunk/net/core/netpoll.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,8 @@ static void service_arp_queue(struct netpoll_info *npi)
}
}

void netpoll_poll(struct netpoll *np)
void netpoll_poll_dev(struct net_device *dev)
{
struct net_device *dev = np->dev;
const struct net_device_ops *ops;

if (!dev || !netif_running(dev))
Expand All @@ -201,6 +200,11 @@ void netpoll_poll(struct netpoll *np)
zap_completion_queue();
}

void netpoll_poll(struct netpoll *np)
{
netpoll_poll_dev(np->dev);
}

static void refill_skbs(void)
{
struct sk_buff *skb;
Expand Down Expand Up @@ -282,7 +286,7 @@ static int netpoll_owner_active(struct net_device *dev)
return 0;
}

static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
{
int status = NETDEV_TX_BUSY;
unsigned long tries;
Expand All @@ -308,7 +312,9 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
tries > 0; --tries) {
if (__netif_tx_trylock(txq)) {
if (!netif_tx_queue_stopped(txq)) {
dev->priv_flags |= IFF_IN_NETPOLL;
status = ops->ndo_start_xmit(skb, dev);
dev->priv_flags &= ~IFF_IN_NETPOLL;
if (status == NETDEV_TX_OK)
txq_trans_update(txq);
}
Expand Down Expand Up @@ -756,7 +762,10 @@ int netpoll_setup(struct netpoll *np)
atomic_inc(&npinfo->refcnt);
}

if (!ndev->netdev_ops->ndo_poll_controller) {
npinfo->netpoll = np;

if ((ndev->priv_flags & IFF_DISABLE_NETPOLL) ||
!ndev->netdev_ops->ndo_poll_controller) {
printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n",
np->name, np->dev_name);
err = -ENOTSUPP;
Expand Down Expand Up @@ -878,14 +887,19 @@ void netpoll_cleanup(struct netpoll *np)
}

if (atomic_dec_and_test(&npinfo->refcnt)) {
const struct net_device_ops *ops;
skb_queue_purge(&npinfo->arp_tx);
skb_queue_purge(&npinfo->txq);
cancel_rearming_delayed_work(&npinfo->tx_work);

/* clean after last, unfinished work */
__skb_queue_purge(&npinfo->txq);
kfree(npinfo);
np->dev->npinfo = NULL;
ops = np->dev->netdev_ops;
if (ops->ndo_netpoll_cleanup)
ops->ndo_netpoll_cleanup(np->dev);
else
np->dev->npinfo = NULL;
}
}

Expand All @@ -908,11 +922,13 @@ void netpoll_set_trap(int trap)
atomic_dec(&trapped);
}

EXPORT_SYMBOL(netpoll_send_skb);
EXPORT_SYMBOL(netpoll_set_trap);
EXPORT_SYMBOL(netpoll_trap);
EXPORT_SYMBOL(netpoll_print_options);
EXPORT_SYMBOL(netpoll_parse_options);
EXPORT_SYMBOL(netpoll_setup);
EXPORT_SYMBOL(netpoll_cleanup);
EXPORT_SYMBOL(netpoll_send_udp);
EXPORT_SYMBOL(netpoll_poll_dev);
EXPORT_SYMBOL(netpoll_poll);

0 comments on commit c8ad0a5

Please sign in to comment.