Re: [PATCH 3/4] net: move softnet_data

2006-12-20 Thread David Miller
From: Stephen Hemminger [EMAIL PROTECTED]
Date: Thu, 14 Dec 2006 12:48:17 -0800

 Make softnet_data local to dev.c.  
 
 Signed-off-by: Stephen Hemminger [EMAIL PROTECTED]

Slight mistake here, I think:

 +#ifdef CONFIG_NETPOLL
 +extern void  netpoll_do_completion(void);
 +#endif

Ok.

 --- linux-2.6.20-rc1.orig/net/core/dev.c
 +++ linux-2.6.20-rc1/net/core/dev.c
 ...
 @@ -1673,6 +1686,34 @@ static inline struct net_device *skb_bon
   return dev;
  }
  
 +#ifdef CONFIG_NETPOLL
 +void netpoll_do_completion(void)
 +{

Ok.

 --- linux-2.6.20-rc1.orig/net/core/netpoll.c
 +++ linux-2.6.20-rc1/net/core/netpoll.c
  ...
 @@ -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:

-ENOTESTED, I think this makes netpoll_do_completion() call itself,
ie. the local static version here, not the one you are exporting from
net/core/dev.c

Because of the extern you added, I can't see how the compiler
didn't complain loudly about this mismatch.

I had to see this, so I compiled it myself, and it doesn't even
build:

  CC  net/core/netpoll.o
net/core/netpoll.c:184: error: static declaration of 
$,1rx(Bnetpoll_do_completion$,1ry(B follows non-static declaration
include/linux/netdevice.h:604: error: previous declaration of 
$,1rx(Bnetpoll_do_completion$,1ry(B was here
net/core/netpoll.c: In function $,1rx(Bnetpoll_do_completion$,1ry(B:
net/core/netpoll.c:186: error: $,1rx(Bper_cpu__softnet_data$,1ry(B 
undeclared (first use in this function)
net/core/netpoll.c:186: error: (Each undeclared identifier is reported only once
net/core/netpoll.c:186: error: for each function it appears in.)
net/core/netpoll.c:188: error: dereferencing pointer to incomplete type
net/core/netpoll.c:192: error: dereferencing pointer to incomplete type
net/core/netpoll.c:193: error: dereferencing pointer to incomplete type

Stephen... come on :-)

-
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


[PATCH 3/4] net: move softnet_data

2006-12-14 Thread Stephen Hemminger
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