]> err.no Git - linux-2.6/blobdiff - net/core/pktgen.c
[MAC80211]: fix race conditions with keys
[linux-2.6] / net / core / pktgen.c
index 75215331b0457b122088f91d8f4d67d4382d27dc..94e42be16daaa00e24da84c786c00ffc3e751708 100644 (file)
  *
  * 802.1Q/Q-in-Q support by Francesco Fondelli (FF) <francesco.fondelli@gmail.com>
  *
+ * Fixed src_mac command to set source mac of packet to value specified in
+ * command by Adit Ranadive <adit.262@gmail.com>
+ *
  */
 #include <linux/sys.h>
 #include <linux/types.h>
 #include <linux/wait.h>
 #include <linux/etherdevice.h>
 #include <linux/kthread.h>
+#include <net/net_namespace.h>
 #include <net/checksum.h>
 #include <net/ipv6.h>
 #include <net/addrconf.h>
 #include <asm/div64.h>         /* do_div */
 #include <asm/timex.h>
 
-#define VERSION  "pktgen v2.68: Packet Generator for packet performance testing.\n"
+#define VERSION  "pktgen v2.69: Packet Generator for packet performance testing.\n"
 
 /* The buckets are exponential in 'width' */
 #define LAT_BUCKETS_MAX 32
 #define F_SVID_RND    (1<<10)  /* Random SVLAN ID */
 #define F_FLOW_SEQ    (1<<11)  /* Sequential flows */
 #define F_IPSEC_ON    (1<<12)  /* ipsec on for flows */
+#define F_QUEUE_MAP_RND (1<<13)        /* queue map Random */
 
 /* Thread control flag bits */
 #define T_TERMINATE   (1<<0)
@@ -328,6 +333,7 @@ struct pktgen_dev {
        __be32 cur_daddr;
        __u16 cur_udp_dst;
        __u16 cur_udp_src;
+       __u16 cur_queue_map;
        __u32 cur_pkt_size;
 
        __u8 hh[14];
@@ -355,6 +361,10 @@ struct pktgen_dev {
        unsigned lflow;         /* Flow length  (config) */
        unsigned nflows;        /* accumulated flows (stats) */
        unsigned curfl;         /* current sequenced flow (state)*/
+
+       u16 queue_map_min;
+       u16 queue_map_max;
+
 #ifdef CONFIG_XFRM
        __u8    ipsmode;                /* IPSEC mode (config) */
        __u8    ipsproto;               /* IPSEC type (config) */
@@ -375,12 +385,10 @@ struct pktgen_thread {
        struct list_head th_list;
        struct task_struct *tsk;
        char result[512];
-       u32 max_before_softirq; /* We'll call do_softirq to prevent starvation. */
 
        /* Field for thread to receive "posted" events terminate, stop ifs etc. */
 
        u32 control;
-       int pid;
        int cpu;
 
        wait_queue_head_t queue;
@@ -567,7 +575,7 @@ static ssize_t pgctrl_write(struct file *file, const char __user * buf,
                pktgen_run_all_threads();
 
        else
-               printk("pktgen: Unknown command: %s\n", data);
+               printk(KERN_WARNING "pktgen: Unknown command: %s\n", data);
 
        err = count;
 
@@ -611,6 +619,11 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
        seq_printf(seq, "     flows: %u flowlen: %u\n", pkt_dev->cflows,
                   pkt_dev->lflow);
 
+       seq_printf(seq,
+                  "     queue_map_min: %u  queue_map_max: %u\n",
+                  pkt_dev->queue_map_min,
+                  pkt_dev->queue_map_max);
+
        if (pkt_dev->flags & F_IPV6) {
                char b1[128], b2[128], b3[128];
                fmt_ip6(b1, pkt_dev->in6_saddr.s6_addr);
@@ -707,6 +720,9 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
        if (pkt_dev->flags & F_MPLS_RND)
                seq_printf(seq,  "MPLS_RND  ");
 
+       if (pkt_dev->flags & F_QUEUE_MAP_RND)
+               seq_printf(seq,  "QUEUE_MAP_RND  ");
+
        if (pkt_dev->cflows) {
                if (pkt_dev->flags & F_FLOW_SEQ)
                        seq_printf(seq,  "FLOW_SEQ  "); /*in sequence flows*/
@@ -762,6 +778,8 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
        seq_printf(seq, "     cur_udp_dst: %d  cur_udp_src: %d\n",
                   pkt_dev->cur_udp_dst, pkt_dev->cur_udp_src);
 
+       seq_printf(seq, "     cur_queue_map: %u\n", pkt_dev->cur_queue_map);
+
        seq_printf(seq, "     flows: %u\n", pkt_dev->nflows);
 
        if (pkt_dev->result[0])
@@ -908,14 +926,14 @@ static ssize_t pktgen_if_write(struct file *file,
        pg_result = &(pkt_dev->result[0]);
 
        if (count < 1) {
-               printk("pktgen: wrong command format\n");
+               printk(KERN_WARNING "pktgen: wrong command format\n");
                return -EINVAL;
        }
 
        max = count - i;
        tmp = count_trail_chars(&user_buffer[i], max);
        if (tmp < 0) {
-               printk("pktgen: illegal format\n");
+               printk(KERN_WARNING "pktgen: illegal format\n");
                return tmp;
        }
        i += tmp;
@@ -943,7 +961,7 @@ static ssize_t pktgen_if_write(struct file *file,
                if (copy_from_user(tb, user_buffer, count))
                        return -EFAULT;
                tb[count] = 0;
-               printk("pktgen: %s,%lu  buffer -:%s:-\n", name,
+               printk(KERN_DEBUG "pktgen: %s,%lu  buffer -:%s:-\n", name,
                       (unsigned long)count, tb);
        }
 
@@ -1213,6 +1231,11 @@ static ssize_t pktgen_if_write(struct file *file,
                else if (strcmp(f, "FLOW_SEQ") == 0)
                        pkt_dev->flags |= F_FLOW_SEQ;
 
+               else if (strcmp(f, "QUEUE_MAP_RND") == 0)
+                       pkt_dev->flags |= F_QUEUE_MAP_RND;
+
+               else if (strcmp(f, "!QUEUE_MAP_RND") == 0)
+                       pkt_dev->flags &= ~F_QUEUE_MAP_RND;
 #ifdef CONFIG_XFRM
                else if (strcmp(f, "IPSEC") == 0)
                        pkt_dev->flags |= F_IPSEC_ON;
@@ -1248,7 +1271,7 @@ static ssize_t pktgen_if_write(struct file *file,
                        pkt_dev->cur_daddr = pkt_dev->daddr_min;
                }
                if (debug)
-                       printk("pktgen: dst_min set to: %s\n",
+                       printk(KERN_DEBUG "pktgen: dst_min set to: %s\n",
                               pkt_dev->dst_min);
                i += len;
                sprintf(pg_result, "OK: dst_min=%s", pkt_dev->dst_min);
@@ -1271,7 +1294,7 @@ static ssize_t pktgen_if_write(struct file *file,
                        pkt_dev->cur_daddr = pkt_dev->daddr_max;
                }
                if (debug)
-                       printk("pktgen: dst_max set to: %s\n",
+                       printk(KERN_DEBUG "pktgen: dst_max set to: %s\n",
                               pkt_dev->dst_max);
                i += len;
                sprintf(pg_result, "OK: dst_max=%s", pkt_dev->dst_max);
@@ -1294,7 +1317,7 @@ static ssize_t pktgen_if_write(struct file *file,
                ipv6_addr_copy(&pkt_dev->cur_in6_daddr, &pkt_dev->in6_daddr);
 
                if (debug)
-                       printk("pktgen: dst6 set to: %s\n", buf);
+                       printk(KERN_DEBUG "pktgen: dst6 set to: %s\n", buf);
 
                i += len;
                sprintf(pg_result, "OK: dst6=%s", buf);
@@ -1317,7 +1340,7 @@ static ssize_t pktgen_if_write(struct file *file,
                ipv6_addr_copy(&pkt_dev->cur_in6_daddr,
                               &pkt_dev->min_in6_daddr);
                if (debug)
-                       printk("pktgen: dst6_min set to: %s\n", buf);
+                       printk(KERN_DEBUG "pktgen: dst6_min set to: %s\n", buf);
 
                i += len;
                sprintf(pg_result, "OK: dst6_min=%s", buf);
@@ -1338,7 +1361,7 @@ static ssize_t pktgen_if_write(struct file *file,
                fmt_ip6(buf, pkt_dev->max_in6_daddr.s6_addr);
 
                if (debug)
-                       printk("pktgen: dst6_max set to: %s\n", buf);
+                       printk(KERN_DEBUG "pktgen: dst6_max set to: %s\n", buf);
 
                i += len;
                sprintf(pg_result, "OK: dst6_max=%s", buf);
@@ -1361,7 +1384,7 @@ static ssize_t pktgen_if_write(struct file *file,
                ipv6_addr_copy(&pkt_dev->cur_in6_saddr, &pkt_dev->in6_saddr);
 
                if (debug)
-                       printk("pktgen: src6 set to: %s\n", buf);
+                       printk(KERN_DEBUG "pktgen: src6 set to: %s\n", buf);
 
                i += len;
                sprintf(pg_result, "OK: src6=%s", buf);
@@ -1382,7 +1405,7 @@ static ssize_t pktgen_if_write(struct file *file,
                        pkt_dev->cur_saddr = pkt_dev->saddr_min;
                }
                if (debug)
-                       printk("pktgen: src_min set to: %s\n",
+                       printk(KERN_DEBUG "pktgen: src_min set to: %s\n",
                               pkt_dev->src_min);
                i += len;
                sprintf(pg_result, "OK: src_min=%s", pkt_dev->src_min);
@@ -1403,7 +1426,7 @@ static ssize_t pktgen_if_write(struct file *file,
                        pkt_dev->cur_saddr = pkt_dev->saddr_max;
                }
                if (debug)
-                       printk("pktgen: src_max set to: %s\n",
+                       printk(KERN_DEBUG "pktgen: src_max set to: %s\n",
                               pkt_dev->src_max);
                i += len;
                sprintf(pg_result, "OK: src_max=%s", pkt_dev->src_max);
@@ -1452,8 +1475,11 @@ static ssize_t pktgen_if_write(struct file *file,
        }
        if (!strcmp(name, "src_mac")) {
                char *v = valstr;
+               unsigned char old_smac[ETH_ALEN];
                unsigned char *m = pkt_dev->src_mac;
 
+               memcpy(old_smac, pkt_dev->src_mac, ETH_ALEN);
+
                len = strn_len(&user_buffer[i], sizeof(valstr) - 1);
                if (len < 0) {
                        return len;
@@ -1482,6 +1508,10 @@ static ssize_t pktgen_if_write(struct file *file,
                        }
                }
 
+               /* Set up Src MAC */
+               if (compare_ether_addr(old_smac, pkt_dev->src_mac))
+                       memcpy(&(pkt_dev->hh[6]), pkt_dev->src_mac, ETH_ALEN);
+
                sprintf(pg_result, "OK: srcmac");
                return count;
        }
@@ -1517,6 +1547,28 @@ static ssize_t pktgen_if_write(struct file *file,
                return count;
        }
 
+       if (!strcmp(name, "queue_map_min")) {
+               len = num_arg(&user_buffer[i], 5, &value);
+               if (len < 0) {
+                       return len;
+               }
+               i += len;
+               pkt_dev->queue_map_min = value;
+               sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min);
+               return count;
+       }
+
+       if (!strcmp(name, "queue_map_max")) {
+               len = num_arg(&user_buffer[i], 5, &value);
+               if (len < 0) {
+                       return len;
+               }
+               i += len;
+               pkt_dev->queue_map_max = value;
+               sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max);
+               return count;
+       }
+
        if (!strcmp(name, "mpls")) {
                unsigned n, offset;
                len = get_labels(&user_buffer[i], pkt_dev);
@@ -1533,7 +1585,7 @@ static ssize_t pktgen_if_write(struct file *file,
                        pkt_dev->svlan_id = 0xffff;
 
                        if (debug)
-                               printk("pktgen: VLAN/SVLAN auto turned off\n");
+                               printk(KERN_DEBUG "pktgen: VLAN/SVLAN auto turned off\n");
                }
                return count;
        }
@@ -1548,10 +1600,10 @@ static ssize_t pktgen_if_write(struct file *file,
                        pkt_dev->vlan_id = value;  /* turn on VLAN */
 
                        if (debug)
-                               printk("pktgen: VLAN turned on\n");
+                               printk(KERN_DEBUG "pktgen: VLAN turned on\n");
 
                        if (debug && pkt_dev->nr_labels)
-                               printk("pktgen: MPLS auto turned off\n");
+                               printk(KERN_DEBUG "pktgen: MPLS auto turned off\n");
 
                        pkt_dev->nr_labels = 0;    /* turn off MPLS */
                        sprintf(pg_result, "OK: vlan_id=%u", pkt_dev->vlan_id);
@@ -1560,7 +1612,7 @@ static ssize_t pktgen_if_write(struct file *file,
                        pkt_dev->svlan_id = 0xffff;
 
                        if (debug)
-                               printk("pktgen: VLAN/SVLAN turned off\n");
+                               printk(KERN_DEBUG "pktgen: VLAN/SVLAN turned off\n");
                }
                return count;
        }
@@ -1605,10 +1657,10 @@ static ssize_t pktgen_if_write(struct file *file,
                        pkt_dev->svlan_id = value;  /* turn on SVLAN */
 
                        if (debug)
-                               printk("pktgen: SVLAN turned on\n");
+                               printk(KERN_DEBUG "pktgen: SVLAN turned on\n");
 
                        if (debug && pkt_dev->nr_labels)
-                               printk("pktgen: MPLS auto turned off\n");
+                               printk(KERN_DEBUG "pktgen: MPLS auto turned off\n");
 
                        pkt_dev->nr_labels = 0;    /* turn off MPLS */
                        sprintf(pg_result, "OK: svlan_id=%u", pkt_dev->svlan_id);
@@ -1617,7 +1669,7 @@ static ssize_t pktgen_if_write(struct file *file,
                        pkt_dev->svlan_id = 0xffff;
 
                        if (debug)
-                               printk("pktgen: VLAN/SVLAN turned off\n");
+                               printk(KERN_DEBUG "pktgen: VLAN/SVLAN turned off\n");
                }
                return count;
        }
@@ -1709,9 +1761,6 @@ static int pktgen_thread_show(struct seq_file *seq, void *v)
 
        BUG_ON(!t);
 
-       seq_printf(seq, "Name: %s  max_before_softirq: %d\n",
-                  t->tsk->comm, t->max_before_softirq);
-
        seq_printf(seq, "Running: ");
 
        if_lock(t);
@@ -1744,7 +1793,6 @@ static ssize_t pktgen_thread_write(struct file *file,
        int i = 0, max, len, ret;
        char name[40];
        char *pg_result;
-       unsigned long value = 0;
 
        if (count < 1) {
                //      sprintf(pg_result, "Wrong command format");
@@ -1777,10 +1825,11 @@ static ssize_t pktgen_thread_write(struct file *file,
        i += len;
 
        if (debug)
-               printk("pktgen: t=%s, count=%lu\n", name, (unsigned long)count);
+               printk(KERN_DEBUG "pktgen: t=%s, count=%lu\n",
+                      name, (unsigned long)count);
 
        if (!t) {
-               printk("pktgen: ERROR: No thread\n");
+               printk(KERN_ERR "pktgen: ERROR: No thread\n");
                ret = -EINVAL;
                goto out;
        }
@@ -1817,12 +1866,8 @@ static ssize_t pktgen_thread_write(struct file *file,
        }
 
        if (!strcmp(name, "max_before_softirq")) {
-               len = num_arg(&user_buffer[i], 10, &value);
-               mutex_lock(&pktgen_thread_lock);
-               t->max_before_softirq = value;
-               mutex_unlock(&pktgen_thread_lock);
+               sprintf(pg_result, "OK: Note! max_before_softirq is obsoleted -- Do not use");
                ret = count;
-               sprintf(pg_result, "OK: max_before_softirq=%lu", value);
                goto out;
        }
 
@@ -1891,8 +1936,8 @@ static void pktgen_mark_device(const char *ifname)
                mutex_lock(&pktgen_thread_lock);
 
                if (++i >= max_tries) {
-                       printk("pktgen_mark_device: timed out after waiting "
-                              "%d msec for device %s to be removed\n",
+                       printk(KERN_ERR "pktgen_mark_device: timed out after "
+                              "waiting %d msec for device %s to be removed\n",
                               msec_per_try * i, ifname);
                        break;
                }
@@ -1930,6 +1975,9 @@ static int pktgen_device_event(struct notifier_block *unused,
 {
        struct net_device *dev = ptr;
 
+       if (dev->nd_net != &init_net)
+               return NOTIFY_DONE;
+
        /* It is OK that we do not hold the group lock right now,
         * as we run under the RTNL lock.
         */
@@ -1960,17 +2008,17 @@ static int pktgen_setup_dev(struct pktgen_dev *pkt_dev, const char *ifname)
                pkt_dev->odev = NULL;
        }
 
-       odev = dev_get_by_name(ifname);
+       odev = dev_get_by_name(&init_net, ifname);
        if (!odev) {
-               printk("pktgen: no such netdevice: \"%s\"\n", ifname);
+               printk(KERN_ERR "pktgen: no such netdevice: \"%s\"\n", ifname);
                return -ENODEV;
        }
 
        if (odev->type != ARPHRD_ETHER) {
-               printk("pktgen: not an ethernet device: \"%s\"\n", ifname);
+               printk(KERN_ERR "pktgen: not an ethernet device: \"%s\"\n", ifname);
                err = -EINVAL;
        } else if (!netif_running(odev)) {
-               printk("pktgen: device is down: \"%s\"\n", ifname);
+               printk(KERN_ERR "pktgen: device is down: \"%s\"\n", ifname);
                err = -ENETDOWN;
        } else {
                pkt_dev->odev = odev;
@@ -1987,7 +2035,8 @@ static int pktgen_setup_dev(struct pktgen_dev *pkt_dev, const char *ifname)
 static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
 {
        if (!pkt_dev->odev) {
-               printk("pktgen: ERROR: pkt_dev->odev == NULL in setup_inject.\n");
+               printk(KERN_ERR "pktgen: ERROR: pkt_dev->odev == NULL in "
+                      "setup_inject.\n");
                sprintf(pkt_dev->result,
                        "ERROR: pkt_dev->odev == NULL in setup_inject.\n");
                return;
@@ -2049,7 +2098,8 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
                        }
                        rcu_read_unlock();
                        if (err)
-                               printk("pktgen: ERROR: IPv6 link address not availble.\n");
+                               printk(KERN_ERR "pktgen: ERROR: IPv6 link "
+                                      "address not availble.\n");
                }
 #endif
        } else {
@@ -2099,7 +2149,6 @@ static void spin(struct pktgen_dev *pkt_dev, __u64 spin_until_us)
                if (spin_until_us - now > jiffies_to_usecs(1) + 1)
                        schedule_timeout_interruptible(1);
                else if (spin_until_us - now > 100) {
-                       do_softirq();
                        if (!pkt_dev->running)
                                return;
                        if (need_resched())
@@ -2156,8 +2205,7 @@ static inline int f_pick(struct pktgen_dev *pkt_dev)
 /* If there was already an IPSEC SA, we keep it as is, else
  * we go look for it ...
 */
-inline
-void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow)
+static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow)
 {
        struct xfrm_state *x = pkt_dev->flows[flow].x;
        if (!x) {
@@ -2376,6 +2424,20 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev)
                pkt_dev->cur_pkt_size = t;
        }
 
+       if (pkt_dev->queue_map_min < pkt_dev->queue_map_max) {
+               __u16 t;
+               if (pkt_dev->flags & F_QUEUE_MAP_RND) {
+                       t = random32() %
+                               (pkt_dev->queue_map_max - pkt_dev->queue_map_min + 1)
+                               + pkt_dev->queue_map_min;
+               } else {
+                       t = pkt_dev->cur_queue_map + 1;
+                       if (t > pkt_dev->queue_map_max)
+                               t = pkt_dev->queue_map_min;
+               }
+               pkt_dev->cur_queue_map = t;
+       }
+
        pkt_dev->flows[flow].count++;
 }
 
@@ -2441,7 +2503,8 @@ static inline int process_ipsec(struct pktgen_dev *pkt_dev,
                        if (nhead >0) {
                                ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC);
                                if (ret < 0) {
-                                       printk("Error expanding ipsec packet %d\n",ret);
+                                       printk(KERN_ERR "Error expanding "
+                                              "ipsec packet %d\n",ret);
                                        return 0;
                                }
                        }
@@ -2450,7 +2513,8 @@ static inline int process_ipsec(struct pktgen_dev *pkt_dev,
                        skb_pull(skb, ETH_HLEN);
                        ret = pktgen_output_ipsec(skb, pkt_dev);
                        if (ret) {
-                               printk("Error creating ipsec packet %d\n",ret);
+                               printk(KERN_ERR "Error creating ipsec "
+                                      "packet %d\n",ret);
                                kfree_skb(skb);
                                return 0;
                        }
@@ -2544,6 +2608,7 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
        skb->network_header = skb->tail;
        skb->transport_header = skb->network_header + sizeof(struct iphdr);
        skb_put(skb, sizeof(struct iphdr) + sizeof(struct udphdr));
+       skb->queue_mapping = pkt_dev->cur_queue_map;
 
        iph = ip_hdr(skb);
        udph = udp_hdr(skb);
@@ -2885,6 +2950,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
        skb->network_header = skb->tail;
        skb->transport_header = skb->network_header + sizeof(struct ipv6hdr);
        skb_put(skb, sizeof(struct ipv6hdr) + sizeof(struct udphdr));
+       skb->queue_mapping = pkt_dev->cur_queue_map;
 
        iph = ipv6_hdr(skb);
        udph = udp_hdr(skb);
@@ -3184,8 +3250,8 @@ static int pktgen_stop_device(struct pktgen_dev *pkt_dev)
        int nr_frags = pkt_dev->skb ? skb_shinfo(pkt_dev->skb)->nr_frags : -1;
 
        if (!pkt_dev->running) {
-               printk("pktgen: interface: %s is already stopped\n",
-                      pkt_dev->odev->name);
+               printk(KERN_WARNING "pktgen: interface: %s is already "
+                      "stopped\n", pkt_dev->odev->name);
                return -EINVAL;
        }
 
@@ -3327,8 +3393,9 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev)
        }
 
        if ((netif_queue_stopped(odev) ||
-            netif_subqueue_stopped(odev, pkt_dev->skb->queue_mapping)) ||
-            need_resched()) {
+            (pkt_dev->skb &&
+             netif_subqueue_stopped(odev, pkt_dev->skb->queue_mapping))) ||
+           need_resched()) {
                idle_start = getCurUs();
 
                if (!netif_running(odev)) {
@@ -3360,7 +3427,8 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev)
 
                        pkt_dev->skb = fill_packet(odev, pkt_dev);
                        if (pkt_dev->skb == NULL) {
-                               printk("pktgen: ERROR: couldn't allocate skb in fill_packet.\n");
+                               printk(KERN_ERR "pktgen: ERROR: couldn't "
+                                      "allocate skb in fill_packet.\n");
                                schedule();
                                pkt_dev->clone_count--; /* back out increment, OOM */
                                goto out;
@@ -3450,21 +3518,17 @@ static int pktgen_thread_worker(void *arg)
        struct pktgen_thread *t = arg;
        struct pktgen_dev *pkt_dev = NULL;
        int cpu = t->cpu;
-       u32 max_before_softirq;
-       u32 tx_since_softirq = 0;
 
        BUG_ON(smp_processor_id() != cpu);
 
        init_waitqueue_head(&t->queue);
 
-       t->pid = current->pid;
-
        pr_debug("pktgen: starting pktgen/%d:  pid=%d\n", cpu, current->pid);
 
-       max_before_softirq = t->max_before_softirq;
-
        set_current_state(TASK_INTERRUPTIBLE);
 
+       set_freezable();
+
        while (!kthread_should_stop()) {
                pkt_dev = next_to_run(t);
 
@@ -3479,24 +3543,9 @@ static int pktgen_thread_worker(void *arg)
 
                __set_current_state(TASK_RUNNING);
 
-               if (pkt_dev) {
-
+               if (pkt_dev)
                        pktgen_xmit(pkt_dev);
 
-                       /*
-                        * We like to stay RUNNING but must also give
-                        * others fair share.
-                        */
-
-                       tx_since_softirq += pkt_dev->last_ok;
-
-                       if (tx_since_softirq > max_before_softirq) {
-                               if (local_softirq_pending())
-                                       do_softirq();
-                               tx_since_softirq = 0;
-                       }
-               }
-
                if (t->control & T_STOP) {
                        pktgen_stop(t);
                        t->control &= ~(T_STOP);
@@ -3563,7 +3612,8 @@ static int add_dev_to_thread(struct pktgen_thread *t,
        if_lock(t);
 
        if (pkt_dev->pg_thread) {
-               printk("pktgen: ERROR:  already assigned to a thread.\n");
+               printk(KERN_ERR "pktgen: ERROR: already assigned "
+                      "to a thread.\n");
                rv = -EBUSY;
                goto out;
        }
@@ -3588,7 +3638,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
 
        pkt_dev = __pktgen_NN_threads(ifname, FIND);
        if (pkt_dev) {
-               printk("pktgen: ERROR: interface already used.\n");
+               printk(KERN_ERR "pktgen: ERROR: interface already used.\n");
                return -EBUSY;
        }
 
@@ -3630,7 +3680,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
 
        pkt_dev->entry = create_proc_entry(ifname, 0600, pg_proc_dir);
        if (!pkt_dev->entry) {
-               printk("pktgen: cannot create %s/%s procfs entry.\n",
+               printk(KERN_ERR "pktgen: cannot create %s/%s procfs entry.\n",
                       PG_PROC_DIR, ifname);
                err = -EINVAL;
                goto out2;
@@ -3663,7 +3713,8 @@ static int __init pktgen_create_thread(int cpu)
 
        t = kzalloc(sizeof(struct pktgen_thread), GFP_KERNEL);
        if (!t) {
-               printk("pktgen: ERROR: out of memory, can't create new thread.\n");
+               printk(KERN_ERR "pktgen: ERROR: out of memory, can't "
+                      "create new thread.\n");
                return -ENOMEM;
        }
 
@@ -3676,7 +3727,8 @@ static int __init pktgen_create_thread(int cpu)
 
        p = kthread_create(pktgen_thread_worker, t, "kpktgend_%d", cpu);
        if (IS_ERR(p)) {
-               printk("pktgen: kernel_thread() failed for cpu %d\n", t->cpu);
+               printk(KERN_ERR "pktgen: kernel_thread() failed "
+                      "for cpu %d\n", t->cpu);
                list_del(&t->th_list);
                kfree(t);
                return PTR_ERR(p);
@@ -3686,7 +3738,7 @@ static int __init pktgen_create_thread(int cpu)
 
        pe = create_proc_entry(t->tsk->comm, 0600, pg_proc_dir);
        if (!pe) {
-               printk("pktgen: cannot create %s/%s procfs entry.\n",
+               printk(KERN_ERR "pktgen: cannot create %s/%s procfs entry.\n",
                       PG_PROC_DIR, t->tsk->comm);
                kthread_stop(p);
                list_del(&t->th_list);
@@ -3725,7 +3777,8 @@ static int pktgen_remove_device(struct pktgen_thread *t,
        pr_debug("pktgen: remove_device pkt_dev=%p\n", pkt_dev);
 
        if (pkt_dev->running) {
-               printk("pktgen:WARNING: trying to remove a running interface, stopping it now.\n");
+               printk(KERN_WARNING "pktgen: WARNING: trying to remove a "
+                      "running interface, stopping it now.\n");
                pktgen_stop_device(pkt_dev);
        }
 
@@ -3757,18 +3810,18 @@ static int __init pg_init(void)
        int cpu;
        struct proc_dir_entry *pe;
 
-       printk(version);
+       printk(KERN_INFO "%s", version);
 
-       pg_proc_dir = proc_mkdir(PG_PROC_DIR, proc_net);
+       pg_proc_dir = proc_mkdir(PG_PROC_DIR, init_net.proc_net);
        if (!pg_proc_dir)
                return -ENODEV;
        pg_proc_dir->owner = THIS_MODULE;
 
        pe = create_proc_entry(PGCTRL, 0600, pg_proc_dir);
        if (pe == NULL) {
-               printk("pktgen: ERROR: cannot create %s procfs entry.\n",
-                      PGCTRL);
-               proc_net_remove(PG_PROC_DIR);
+               printk(KERN_ERR "pktgen: ERROR: cannot create %s "
+                      "procfs entry.\n", PGCTRL);
+               proc_net_remove(&init_net, PG_PROC_DIR);
                return -EINVAL;
        }
 
@@ -3783,15 +3836,16 @@ static int __init pg_init(void)
 
                err = pktgen_create_thread(cpu);
                if (err)
-                       printk("pktgen: WARNING: Cannot create thread for cpu %d (%d)\n",
-                                       cpu, err);
+                       printk(KERN_WARNING "pktgen: WARNING: Cannot create "
+                              "thread for cpu %d (%d)\n", cpu, err);
        }
 
        if (list_empty(&pktgen_threads)) {
-               printk("pktgen: ERROR: Initialization failed for all threads\n");
+               printk(KERN_ERR "pktgen: ERROR: Initialization failed for "
+                      "all threads\n");
                unregister_netdevice_notifier(&pktgen_notifier_block);
                remove_proc_entry(PGCTRL, pg_proc_dir);
-               proc_net_remove(PG_PROC_DIR);
+               proc_net_remove(&init_net, PG_PROC_DIR);
                return -ENODEV;
        }
 
@@ -3818,7 +3872,7 @@ static void __exit pg_cleanup(void)
 
        /* Clean up proc file system */
        remove_proc_entry(PGCTRL, pg_proc_dir);
-       proc_net_remove(PG_PROC_DIR);
+       proc_net_remove(&init_net, PG_PROC_DIR);
 }
 
 module_init(pg_init);