Make softnet_data local to dev.c.
Signed-off-by: Stephen Hemminger [EMAIL PROTECTED]
--- linux-2.6.20-rc1.orig/include/linux/netdevice.h
+++ linux-2.6.20-rc1/include/linux/netdevice.h
@@ -600,6 +600,9 @@ extern int dev_restart(struct net_devic
#ifdef CONFIG_NETPOLL_TRAP
extern int netpoll_trap(void);
#endif
+#ifdef CONFIG_NETPOLL
+extern voidnetpoll_do_completion(void);
+#endif
typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int
len);
extern int register_gifconf(unsigned int family, gifconf_func_t *
gifconf);
@@ -608,26 +611,6 @@ static inline int unregister_gifconf(uns
return register_gifconf(family, NULL);
}
-/*
- * Incoming packets are placed on per-cpu queues so that
- * no locking is needed.
- */
-
-struct softnet_data
-{
- struct net_device *output_queue;
- struct sk_buff_head input_pkt_queue;
- struct list_headpoll_list;
- struct sk_buff *completion_queue;
-
- struct net_device backlog_dev;/* Sorry. 8) */
-#ifdef CONFIG_NET_DMA
- struct dma_chan *net_dma;
-#endif
-};
-
-DECLARE_PER_CPU(struct softnet_data,softnet_data);
-
#define HAVE_NETIF_QUEUE
extern void __netif_schedule(struct net_device *dev);
--- linux-2.6.20-rc1.orig/net/core/dev.c
+++ linux-2.6.20-rc1/net/core/dev.c
@@ -203,10 +203,23 @@ static inline struct hlist_head *dev_ind
static RAW_NOTIFIER_HEAD(netdev_chain);
/*
- * Device drivers call our routines to queue packets here. We empty the
- * queue in the local softnet handler.
+ * Incoming packets are placed on per-cpu queues so that
+ * no locking is needed.
*/
-DEFINE_PER_CPU(struct softnet_data, softnet_data) = { NULL };
+struct softnet_data
+{
+ struct net_device *output_queue;
+ struct sk_buff_head input_pkt_queue;
+ struct list_headpoll_list;
+ struct sk_buff *completion_queue;
+
+ struct net_device backlog_dev;/* Sorry. 8) */
+#ifdef CONFIG_NET_DMA
+ struct dma_chan *net_dma;
+#endif
+};
+
+static DEFINE_PER_CPU(struct softnet_data, softnet_data);
#ifdef CONFIG_SYSFS
extern int netdev_sysfs_init(void);
@@ -1673,6 +1686,34 @@ static inline struct net_device *skb_bon
return dev;
}
+#ifdef CONFIG_NETPOLL
+void netpoll_do_completion(void)
+{
+ unsigned long flags;
+ struct softnet_data *sd = get_cpu_var(softnet_data);
+
+ if (sd-completion_queue) {
+ struct sk_buff *clist;
+
+ local_irq_save(flags);
+ clist = sd-completion_queue;
+ sd-completion_queue = NULL;
+ local_irq_restore(flags);
+
+ while (clist != NULL) {
+ struct sk_buff *skb = clist;
+ clist = clist-next;
+ if (skb-destructor)
+ dev_kfree_skb_any(skb); /* put this one back */
+ else
+ __kfree_skb(skb);
+ }
+ }
+
+ put_cpu_var(softnet_data);
+}
+#endif
+
static void net_tx_action(struct softirq_action *h)
{
struct softnet_data *sd = __get_cpu_var(softnet_data);
--- linux-2.6.20-rc1.orig/net/core/netpoll.c
+++ linux-2.6.20-rc1/net/core/netpoll.c
@@ -47,7 +47,6 @@ static atomic_t trapped;
(MAX_UDP_CHUNK + sizeof(struct udphdr) + \
sizeof(struct iphdr) + sizeof(struct ethhdr))
-static void zap_completion_queue(void);
static void arp_reply(struct sk_buff *skb);
static void queue_process(struct work_struct *work)
@@ -162,7 +161,7 @@ void netpoll_poll(struct netpoll *np)
service_arp_queue(np-dev-npinfo);
- zap_completion_queue();
+ netpoll_do_completion();
}
static void refill_skbs(void)
@@ -181,7 +180,7 @@ static void refill_skbs(void)
spin_unlock_irqrestore(skb_pool.lock, flags);
}
-static void zap_completion_queue(void)
+static void netpoll_do_completion(void)
{
unsigned long flags;
struct softnet_data *sd = get_cpu_var(softnet_data);
@@ -212,7 +211,7 @@ static struct sk_buff *find_skb(struct n
int count = 0;
struct sk_buff *skb;
- zap_completion_queue();
+ netpoll_do_completion();
refill_skbs();
repeat:
--
-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html