aboutsummaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
Diffstat (limited to 'net/core')
-rw-r--r--net/core/pktgen.c298
1 files changed, 159 insertions, 139 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index ad41f06c13ca..51b1e61d3029 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -163,13 +163,14 @@
163#include <asm/byteorder.h> 163#include <asm/byteorder.h>
164#include <linux/rcupdate.h> 164#include <linux/rcupdate.h>
165#include <linux/bitops.h> 165#include <linux/bitops.h>
166#include <asm/io.h> 166#include <linux/io.h>
167#include <linux/timex.h>
168#include <linux/uaccess.h>
167#include <asm/dma.h> 169#include <asm/dma.h>
168#include <asm/uaccess.h>
169#include <asm/div64.h> /* do_div */ 170#include <asm/div64.h> /* do_div */
170#include <asm/timex.h>
171 171
172#define VERSION "pktgen v2.70: Packet Generator for packet performance testing.\n" 172#define VERSION \
173 "pktgen v2.70: Packet Generator for packet performance testing.\n"
173 174
174#define IP_NAME_SZ 32 175#define IP_NAME_SZ 32
175#define MAX_MPLS_LABELS 16 /* This is the max label stack depth */ 176#define MAX_MPLS_LABELS 16 /* This is the max label stack depth */
@@ -207,7 +208,7 @@
207#define PKTGEN_MAGIC 0xbe9be955 208#define PKTGEN_MAGIC 0xbe9be955
208#define PG_PROC_DIR "pktgen" 209#define PG_PROC_DIR "pktgen"
209#define PGCTRL "pgctrl" 210#define PGCTRL "pgctrl"
210static struct proc_dir_entry *pg_proc_dir = NULL; 211static struct proc_dir_entry *pg_proc_dir;
211 212
212#define MAX_CFLOWS 65536 213#define MAX_CFLOWS 65536
213 214
@@ -232,9 +233,9 @@ struct pktgen_dev {
232 */ 233 */
233 struct proc_dir_entry *entry; /* proc file */ 234 struct proc_dir_entry *entry; /* proc file */
234 struct pktgen_thread *pg_thread;/* the owner */ 235 struct pktgen_thread *pg_thread;/* the owner */
235 struct list_head list; /* Used for chaining in the thread's run-queue */ 236 struct list_head list; /* chaining in the thread's run-queue */
236 237
237 int running; /* if this changes to false, the test will stop */ 238 int running; /* if false, the test will stop */
238 239
239 /* If min != max, then we will either do a linear iteration, or 240 /* If min != max, then we will either do a linear iteration, or
240 * we will do a random selection from within the range. 241 * we will do a random selection from within the range.
@@ -252,15 +253,16 @@ struct pktgen_dev {
252 __u64 count; /* Default No packets to send */ 253 __u64 count; /* Default No packets to send */
253 __u64 sofar; /* How many pkts we've sent so far */ 254 __u64 sofar; /* How many pkts we've sent so far */
254 __u64 tx_bytes; /* How many bytes we've transmitted */ 255 __u64 tx_bytes; /* How many bytes we've transmitted */
255 __u64 errors; /* Errors when trying to transmit, pkts will be re-sent */ 256 __u64 errors; /* Errors when trying to transmit,
257 pkts will be re-sent */
256 258
257 /* runtime counters relating to clone_skb */ 259 /* runtime counters relating to clone_skb */
258 260
259 __u64 allocated_skbs; 261 __u64 allocated_skbs;
260 __u32 clone_count; 262 __u32 clone_count;
261 int last_ok; /* Was last skb sent? 263 int last_ok; /* Was last skb sent?
262 * Or a failed transmit of some sort? This will keep 264 * Or a failed transmit of some sort?
263 * sequence numbers in order, for example. 265 * This will keep sequence numbers in order
264 */ 266 */
265 ktime_t next_tx; 267 ktime_t next_tx;
266 ktime_t started_at; 268 ktime_t started_at;
@@ -269,11 +271,14 @@ struct pktgen_dev {
269 271
270 __u32 seq_num; 272 __u32 seq_num;
271 273
272 int clone_skb; /* Use multiple SKBs during packet gen. If this number 274 int clone_skb; /*
273 * is greater than 1, then that many copies of the same 275 * Use multiple SKBs during packet gen.
274 * packet will be sent before a new packet is allocated. 276 * If this number is greater than 1, then
275 * For instance, if you want to send 1024 identical packets 277 * that many copies of the same packet will be
276 * before creating a new packet, set clone_skb to 1024. 278 * sent before a new packet is allocated.
279 * If you want to send 1024 identical packets
280 * before creating a new packet,
281 * set clone_skb to 1024.
277 */ 282 */
278 283
279 char dst_min[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ 284 char dst_min[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */
@@ -305,8 +310,10 @@ struct pktgen_dev {
305 __u16 udp_dst_max; /* exclusive, dest UDP port */ 310 __u16 udp_dst_max; /* exclusive, dest UDP port */
306 311
307 /* DSCP + ECN */ 312 /* DSCP + ECN */
308 __u8 tos; /* six most significant bits of (former) IPv4 TOS are for dscp codepoint */ 313 __u8 tos; /* six MSB of (former) IPv4 TOS
309 __u8 traffic_class; /* ditto for the (former) Traffic Class in IPv6 (see RFC 3260, sec. 4) */ 314 are for dscp codepoint */
315 __u8 traffic_class; /* ditto for the (former) Traffic Class in IPv6
316 (see RFC 3260, sec. 4) */
310 317
311 /* MPLS */ 318 /* MPLS */
312 unsigned nr_labels; /* Depth of stack, 0 = no MPLS */ 319 unsigned nr_labels; /* Depth of stack, 0 = no MPLS */
@@ -347,15 +354,17 @@ struct pktgen_dev {
347 */ 354 */
348 __u16 pad; /* pad out the hh struct to an even 16 bytes */ 355 __u16 pad; /* pad out the hh struct to an even 16 bytes */
349 356
350 struct sk_buff *skb; /* skb we are to transmit next, mainly used for when we 357 struct sk_buff *skb; /* skb we are to transmit next, used for when we
351 * are transmitting the same one multiple times 358 * are transmitting the same one multiple times
352 */ 359 */
353 struct net_device *odev; /* The out-going device. Note that the device should 360 struct net_device *odev; /* The out-going device.
354 * have it's pg_info pointer pointing back to this 361 * Note that the device should have it's
355 * device. This will be set when the user specifies 362 * pg_info pointer pointing back to this
356 * the out-going device name (not when the inject is 363 * device.
357 * started as it used to do.) 364 * Set when the user specifies the out-going
358 */ 365 * device name (not when the inject is
366 * started as it used to do.)
367 */
359 struct flow_state *flows; 368 struct flow_state *flows;
360 unsigned cflows; /* Concurrent flows (config) */ 369 unsigned cflows; /* Concurrent flows (config) */
361 unsigned lflow; /* Flow length (config) */ 370 unsigned lflow; /* Flow length (config) */
@@ -380,13 +389,14 @@ struct pktgen_hdr {
380}; 389};
381 390
382struct pktgen_thread { 391struct pktgen_thread {
383 spinlock_t if_lock; 392 spinlock_t if_lock; /* for list of devices */
384 struct list_head if_list; /* All device here */ 393 struct list_head if_list; /* All device here */
385 struct list_head th_list; 394 struct list_head th_list;
386 struct task_struct *tsk; 395 struct task_struct *tsk;
387 char result[512]; 396 char result[512];
388 397
389 /* Field for thread to receive "posted" events terminate, stop ifs etc. */ 398 /* Field for thread to receive "posted" events terminate,
399 stop ifs etc. */
390 400
391 u32 control; 401 u32 control;
392 int cpu; 402 int cpu;
@@ -453,8 +463,8 @@ static int pgctrl_show(struct seq_file *seq, void *v)
453 return 0; 463 return 0;
454} 464}
455 465
456static ssize_t pgctrl_write(struct file *file, const char __user * buf, 466static ssize_t pgctrl_write(struct file *file, const char __user *buf,
457 size_t count, loff_t * ppos) 467 size_t count, loff_t *ppos)
458{ 468{
459 int err = 0; 469 int err = 0;
460 char data[128]; 470 char data[128];
@@ -545,11 +555,14 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
545 " daddr: %s min_daddr: %s max_daddr: %s\n", b1, 555 " daddr: %s min_daddr: %s max_daddr: %s\n", b1,
546 b2, b3); 556 b2, b3);
547 557
548 } else 558 } else {
559 seq_printf(seq,
560 " dst_min: %s dst_max: %s\n",
561 pkt_dev->dst_min, pkt_dev->dst_max);
549 seq_printf(seq, 562 seq_printf(seq,
550 " dst_min: %s dst_max: %s\n src_min: %s src_max: %s\n", 563 " src_min: %s src_max: %s\n",
551 pkt_dev->dst_min, pkt_dev->dst_max, pkt_dev->src_min, 564 pkt_dev->src_min, pkt_dev->src_max);
552 pkt_dev->src_max); 565 }
553 566
554 seq_puts(seq, " src_mac: "); 567 seq_puts(seq, " src_mac: ");
555 568
@@ -561,7 +574,8 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
561 seq_printf(seq, "%pM\n", pkt_dev->dst_mac); 574 seq_printf(seq, "%pM\n", pkt_dev->dst_mac);
562 575
563 seq_printf(seq, 576 seq_printf(seq,
564 " udp_src_min: %d udp_src_max: %d udp_dst_min: %d udp_dst_max: %d\n", 577 " udp_src_min: %d udp_src_max: %d"
578 " udp_dst_min: %d udp_dst_max: %d\n",
565 pkt_dev->udp_src_min, pkt_dev->udp_src_max, 579 pkt_dev->udp_src_min, pkt_dev->udp_src_max,
566 pkt_dev->udp_dst_min, pkt_dev->udp_dst_max); 580 pkt_dev->udp_dst_min, pkt_dev->udp_dst_max);
567 581
@@ -577,23 +591,21 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
577 i == pkt_dev->nr_labels-1 ? "\n" : ", "); 591 i == pkt_dev->nr_labels-1 ? "\n" : ", ");
578 } 592 }
579 593
580 if (pkt_dev->vlan_id != 0xffff) { 594 if (pkt_dev->vlan_id != 0xffff)
581 seq_printf(seq, " vlan_id: %u vlan_p: %u vlan_cfi: %u\n", 595 seq_printf(seq, " vlan_id: %u vlan_p: %u vlan_cfi: %u\n",
582 pkt_dev->vlan_id, pkt_dev->vlan_p, pkt_dev->vlan_cfi); 596 pkt_dev->vlan_id, pkt_dev->vlan_p,
583 } 597 pkt_dev->vlan_cfi);
584 598
585 if (pkt_dev->svlan_id != 0xffff) { 599 if (pkt_dev->svlan_id != 0xffff)
586 seq_printf(seq, " svlan_id: %u vlan_p: %u vlan_cfi: %u\n", 600 seq_printf(seq, " svlan_id: %u vlan_p: %u vlan_cfi: %u\n",
587 pkt_dev->svlan_id, pkt_dev->svlan_p, pkt_dev->svlan_cfi); 601 pkt_dev->svlan_id, pkt_dev->svlan_p,
588 } 602 pkt_dev->svlan_cfi);
589 603
590 if (pkt_dev->tos) { 604 if (pkt_dev->tos)
591 seq_printf(seq, " tos: 0x%02x\n", pkt_dev->tos); 605 seq_printf(seq, " tos: 0x%02x\n", pkt_dev->tos);
592 }
593 606
594 if (pkt_dev->traffic_class) { 607 if (pkt_dev->traffic_class)
595 seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class); 608 seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class);
596 }
597 609
598 seq_printf(seq, " Flags: "); 610 seq_printf(seq, " Flags: ");
599 611
@@ -696,7 +708,8 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
696} 708}
697 709
698 710
699static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, __u32 *num) 711static int hex32_arg(const char __user *user_buffer, unsigned long maxlen,
712 __u32 *num)
700{ 713{
701 int i = 0; 714 int i = 0;
702 *num = 0; 715 *num = 0;
@@ -846,9 +859,9 @@ static ssize_t pktgen_if_write(struct file *file,
846 /* Read variable name */ 859 /* Read variable name */
847 860
848 len = strn_len(&user_buffer[i], sizeof(name) - 1); 861 len = strn_len(&user_buffer[i], sizeof(name) - 1);
849 if (len < 0) { 862 if (len < 0)
850 return len; 863 return len;
851 } 864
852 memset(name, 0, sizeof(name)); 865 memset(name, 0, sizeof(name));
853 if (copy_from_user(name, &user_buffer[i], len)) 866 if (copy_from_user(name, &user_buffer[i], len))
854 return -EFAULT; 867 return -EFAULT;
@@ -872,9 +885,9 @@ static ssize_t pktgen_if_write(struct file *file,
872 885
873 if (!strcmp(name, "min_pkt_size")) { 886 if (!strcmp(name, "min_pkt_size")) {
874 len = num_arg(&user_buffer[i], 10, &value); 887 len = num_arg(&user_buffer[i], 10, &value);
875 if (len < 0) { 888 if (len < 0)
876 return len; 889 return len;
877 } 890
878 i += len; 891 i += len;
879 if (value < 14 + 20 + 8) 892 if (value < 14 + 20 + 8)
880 value = 14 + 20 + 8; 893 value = 14 + 20 + 8;
@@ -889,9 +902,9 @@ static ssize_t pktgen_if_write(struct file *file,
889 902
890 if (!strcmp(name, "max_pkt_size")) { 903 if (!strcmp(name, "max_pkt_size")) {
891 len = num_arg(&user_buffer[i], 10, &value); 904 len = num_arg(&user_buffer[i], 10, &value);
892 if (len < 0) { 905 if (len < 0)
893 return len; 906 return len;
894 } 907
895 i += len; 908 i += len;
896 if (value < 14 + 20 + 8) 909 if (value < 14 + 20 + 8)
897 value = 14 + 20 + 8; 910 value = 14 + 20 + 8;
@@ -908,9 +921,9 @@ static ssize_t pktgen_if_write(struct file *file,
908 921
909 if (!strcmp(name, "pkt_size")) { 922 if (!strcmp(name, "pkt_size")) {
910 len = num_arg(&user_buffer[i], 10, &value); 923 len = num_arg(&user_buffer[i], 10, &value);
911 if (len < 0) { 924 if (len < 0)
912 return len; 925 return len;
913 } 926
914 i += len; 927 i += len;
915 if (value < 14 + 20 + 8) 928 if (value < 14 + 20 + 8)
916 value = 14 + 20 + 8; 929 value = 14 + 20 + 8;
@@ -925,9 +938,9 @@ static ssize_t pktgen_if_write(struct file *file,
925 938
926 if (!strcmp(name, "debug")) { 939 if (!strcmp(name, "debug")) {
927 len = num_arg(&user_buffer[i], 10, &value); 940 len = num_arg(&user_buffer[i], 10, &value);
928 if (len < 0) { 941 if (len < 0)
929 return len; 942 return len;
930 } 943
931 i += len; 944 i += len;
932 debug = value; 945 debug = value;
933 sprintf(pg_result, "OK: debug=%u", debug); 946 sprintf(pg_result, "OK: debug=%u", debug);
@@ -936,9 +949,9 @@ static ssize_t pktgen_if_write(struct file *file,
936 949
937 if (!strcmp(name, "frags")) { 950 if (!strcmp(name, "frags")) {
938 len = num_arg(&user_buffer[i], 10, &value); 951 len = num_arg(&user_buffer[i], 10, &value);
939 if (len < 0) { 952 if (len < 0)
940 return len; 953 return len;
941 } 954
942 i += len; 955 i += len;
943 pkt_dev->nfrags = value; 956 pkt_dev->nfrags = value;
944 sprintf(pg_result, "OK: frags=%u", pkt_dev->nfrags); 957 sprintf(pg_result, "OK: frags=%u", pkt_dev->nfrags);
@@ -946,9 +959,9 @@ static ssize_t pktgen_if_write(struct file *file,
946 } 959 }
947 if (!strcmp(name, "delay")) { 960 if (!strcmp(name, "delay")) {
948 len = num_arg(&user_buffer[i], 10, &value); 961 len = num_arg(&user_buffer[i], 10, &value);
949 if (len < 0) { 962 if (len < 0)
950 return len; 963 return len;
951 } 964
952 i += len; 965 i += len;
953 if (value == 0x7FFFFFFF) 966 if (value == 0x7FFFFFFF)
954 pkt_dev->delay = ULLONG_MAX; 967 pkt_dev->delay = ULLONG_MAX;
@@ -961,9 +974,9 @@ static ssize_t pktgen_if_write(struct file *file,
961 } 974 }
962 if (!strcmp(name, "udp_src_min")) { 975 if (!strcmp(name, "udp_src_min")) {
963 len = num_arg(&user_buffer[i], 10, &value); 976 len = num_arg(&user_buffer[i], 10, &value);
964 if (len < 0) { 977 if (len < 0)
965 return len; 978 return len;
966 } 979
967 i += len; 980 i += len;
968 if (value != pkt_dev->udp_src_min) { 981 if (value != pkt_dev->udp_src_min) {
969 pkt_dev->udp_src_min = value; 982 pkt_dev->udp_src_min = value;
@@ -974,9 +987,9 @@ static ssize_t pktgen_if_write(struct file *file,
974 } 987 }
975 if (!strcmp(name, "udp_dst_min")) { 988 if (!strcmp(name, "udp_dst_min")) {
976 len = num_arg(&user_buffer[i], 10, &value); 989 len = num_arg(&user_buffer[i], 10, &value);
977 if (len < 0) { 990 if (len < 0)
978 return len; 991 return len;
979 } 992
980 i += len; 993 i += len;
981 if (value != pkt_dev->udp_dst_min) { 994 if (value != pkt_dev->udp_dst_min) {
982 pkt_dev->udp_dst_min = value; 995 pkt_dev->udp_dst_min = value;
@@ -987,9 +1000,9 @@ static ssize_t pktgen_if_write(struct file *file,
987 } 1000 }
988 if (!strcmp(name, "udp_src_max")) { 1001 if (!strcmp(name, "udp_src_max")) {
989 len = num_arg(&user_buffer[i], 10, &value); 1002 len = num_arg(&user_buffer[i], 10, &value);
990 if (len < 0) { 1003 if (len < 0)
991 return len; 1004 return len;
992 } 1005
993 i += len; 1006 i += len;
994 if (value != pkt_dev->udp_src_max) { 1007 if (value != pkt_dev->udp_src_max) {
995 pkt_dev->udp_src_max = value; 1008 pkt_dev->udp_src_max = value;
@@ -1000,9 +1013,9 @@ static ssize_t pktgen_if_write(struct file *file,
1000 } 1013 }
1001 if (!strcmp(name, "udp_dst_max")) { 1014 if (!strcmp(name, "udp_dst_max")) {
1002 len = num_arg(&user_buffer[i], 10, &value); 1015 len = num_arg(&user_buffer[i], 10, &value);
1003 if (len < 0) { 1016 if (len < 0)
1004 return len; 1017 return len;
1005 } 1018
1006 i += len; 1019 i += len;
1007 if (value != pkt_dev->udp_dst_max) { 1020 if (value != pkt_dev->udp_dst_max) {
1008 pkt_dev->udp_dst_max = value; 1021 pkt_dev->udp_dst_max = value;
@@ -1013,9 +1026,9 @@ static ssize_t pktgen_if_write(struct file *file,
1013 } 1026 }
1014 if (!strcmp(name, "clone_skb")) { 1027 if (!strcmp(name, "clone_skb")) {
1015 len = num_arg(&user_buffer[i], 10, &value); 1028 len = num_arg(&user_buffer[i], 10, &value);
1016 if (len < 0) { 1029 if (len < 0)
1017 return len; 1030 return len;
1018 } 1031
1019 i += len; 1032 i += len;
1020 pkt_dev->clone_skb = value; 1033 pkt_dev->clone_skb = value;
1021 1034
@@ -1024,9 +1037,9 @@ static ssize_t pktgen_if_write(struct file *file,
1024 } 1037 }
1025 if (!strcmp(name, "count")) { 1038 if (!strcmp(name, "count")) {
1026 len = num_arg(&user_buffer[i], 10, &value); 1039 len = num_arg(&user_buffer[i], 10, &value);
1027 if (len < 0) { 1040 if (len < 0)
1028 return len; 1041 return len;
1029 } 1042
1030 i += len; 1043 i += len;
1031 pkt_dev->count = value; 1044 pkt_dev->count = value;
1032 sprintf(pg_result, "OK: count=%llu", 1045 sprintf(pg_result, "OK: count=%llu",
@@ -1035,9 +1048,9 @@ static ssize_t pktgen_if_write(struct file *file,
1035 } 1048 }
1036 if (!strcmp(name, "src_mac_count")) { 1049 if (!strcmp(name, "src_mac_count")) {
1037 len = num_arg(&user_buffer[i], 10, &value); 1050 len = num_arg(&user_buffer[i], 10, &value);
1038 if (len < 0) { 1051 if (len < 0)
1039 return len; 1052 return len;
1040 } 1053
1041 i += len; 1054 i += len;
1042 if (pkt_dev->src_mac_count != value) { 1055 if (pkt_dev->src_mac_count != value) {
1043 pkt_dev->src_mac_count = value; 1056 pkt_dev->src_mac_count = value;
@@ -1049,9 +1062,9 @@ static ssize_t pktgen_if_write(struct file *file,
1049 } 1062 }
1050 if (!strcmp(name, "dst_mac_count")) { 1063 if (!strcmp(name, "dst_mac_count")) {
1051 len = num_arg(&user_buffer[i], 10, &value); 1064 len = num_arg(&user_buffer[i], 10, &value);
1052 if (len < 0) { 1065 if (len < 0)
1053 return len; 1066 return len;
1054 } 1067
1055 i += len; 1068 i += len;
1056 if (pkt_dev->dst_mac_count != value) { 1069 if (pkt_dev->dst_mac_count != value) {
1057 pkt_dev->dst_mac_count = value; 1070 pkt_dev->dst_mac_count = value;
@@ -1065,9 +1078,9 @@ static ssize_t pktgen_if_write(struct file *file,
1065 char f[32]; 1078 char f[32];
1066 memset(f, 0, 32); 1079 memset(f, 0, 32);
1067 len = strn_len(&user_buffer[i], sizeof(f) - 1); 1080 len = strn_len(&user_buffer[i], sizeof(f) - 1);
1068 if (len < 0) { 1081 if (len < 0)
1069 return len; 1082 return len;
1070 } 1083
1071 if (copy_from_user(f, &user_buffer[i], len)) 1084 if (copy_from_user(f, &user_buffer[i], len))
1072 return -EFAULT; 1085 return -EFAULT;
1073 i += len; 1086 i += len;
@@ -1166,9 +1179,8 @@ static ssize_t pktgen_if_write(struct file *file,
1166 } 1179 }
1167 if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) { 1180 if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) {
1168 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1); 1181 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1);
1169 if (len < 0) { 1182 if (len < 0)
1170 return len; 1183 return len;
1171 }
1172 1184
1173 if (copy_from_user(buf, &user_buffer[i], len)) 1185 if (copy_from_user(buf, &user_buffer[i], len))
1174 return -EFAULT; 1186 return -EFAULT;
@@ -1188,9 +1200,9 @@ static ssize_t pktgen_if_write(struct file *file,
1188 } 1200 }
1189 if (!strcmp(name, "dst_max")) { 1201 if (!strcmp(name, "dst_max")) {
1190 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1); 1202 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1);
1191 if (len < 0) { 1203 if (len < 0)
1192 return len; 1204 return len;
1193 } 1205
1194 1206
1195 if (copy_from_user(buf, &user_buffer[i], len)) 1207 if (copy_from_user(buf, &user_buffer[i], len))
1196 return -EFAULT; 1208 return -EFAULT;
@@ -1301,9 +1313,9 @@ static ssize_t pktgen_if_write(struct file *file,
1301 } 1313 }
1302 if (!strcmp(name, "src_min")) { 1314 if (!strcmp(name, "src_min")) {
1303 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1); 1315 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1);
1304 if (len < 0) { 1316 if (len < 0)
1305 return len; 1317 return len;
1306 } 1318
1307 if (copy_from_user(buf, &user_buffer[i], len)) 1319 if (copy_from_user(buf, &user_buffer[i], len))
1308 return -EFAULT; 1320 return -EFAULT;
1309 buf[len] = 0; 1321 buf[len] = 0;
@@ -1322,9 +1334,9 @@ static ssize_t pktgen_if_write(struct file *file,
1322 } 1334 }
1323 if (!strcmp(name, "src_max")) { 1335 if (!strcmp(name, "src_max")) {
1324 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1); 1336 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1);
1325 if (len < 0) { 1337 if (len < 0)
1326 return len; 1338 return len;
1327 } 1339
1328 if (copy_from_user(buf, &user_buffer[i], len)) 1340 if (copy_from_user(buf, &user_buffer[i], len))
1329 return -EFAULT; 1341 return -EFAULT;
1330 buf[len] = 0; 1342 buf[len] = 0;
@@ -1348,9 +1360,9 @@ static ssize_t pktgen_if_write(struct file *file,
1348 memcpy(old_dmac, pkt_dev->dst_mac, ETH_ALEN); 1360 memcpy(old_dmac, pkt_dev->dst_mac, ETH_ALEN);
1349 1361
1350 len = strn_len(&user_buffer[i], sizeof(valstr) - 1); 1362 len = strn_len(&user_buffer[i], sizeof(valstr) - 1);
1351 if (len < 0) { 1363 if (len < 0)
1352 return len; 1364 return len;
1353 } 1365
1354 memset(valstr, 0, sizeof(valstr)); 1366 memset(valstr, 0, sizeof(valstr));
1355 if (copy_from_user(valstr, &user_buffer[i], len)) 1367 if (copy_from_user(valstr, &user_buffer[i], len))
1356 return -EFAULT; 1368 return -EFAULT;
@@ -1390,9 +1402,9 @@ static ssize_t pktgen_if_write(struct file *file,
1390 memcpy(old_smac, pkt_dev->src_mac, ETH_ALEN); 1402 memcpy(old_smac, pkt_dev->src_mac, ETH_ALEN);
1391 1403
1392 len = strn_len(&user_buffer[i], sizeof(valstr) - 1); 1404 len = strn_len(&user_buffer[i], sizeof(valstr) - 1);
1393 if (len < 0) { 1405 if (len < 0)
1394 return len; 1406 return len;
1395 } 1407
1396 memset(valstr, 0, sizeof(valstr)); 1408 memset(valstr, 0, sizeof(valstr));
1397 if (copy_from_user(valstr, &user_buffer[i], len)) 1409 if (copy_from_user(valstr, &user_buffer[i], len))
1398 return -EFAULT; 1410 return -EFAULT;
@@ -1433,9 +1445,9 @@ static ssize_t pktgen_if_write(struct file *file,
1433 1445
1434 if (!strcmp(name, "flows")) { 1446 if (!strcmp(name, "flows")) {
1435 len = num_arg(&user_buffer[i], 10, &value); 1447 len = num_arg(&user_buffer[i], 10, &value);
1436 if (len < 0) { 1448 if (len < 0)
1437 return len; 1449 return len;
1438 } 1450
1439 i += len; 1451 i += len;
1440 if (value > MAX_CFLOWS) 1452 if (value > MAX_CFLOWS)
1441 value = MAX_CFLOWS; 1453 value = MAX_CFLOWS;
@@ -1447,9 +1459,9 @@ static ssize_t pktgen_if_write(struct file *file,
1447 1459
1448 if (!strcmp(name, "flowlen")) { 1460 if (!strcmp(name, "flowlen")) {
1449 len = num_arg(&user_buffer[i], 10, &value); 1461 len = num_arg(&user_buffer[i], 10, &value);
1450 if (len < 0) { 1462 if (len < 0)
1451 return len; 1463 return len;
1452 } 1464
1453 i += len; 1465 i += len;
1454 pkt_dev->lflow = value; 1466 pkt_dev->lflow = value;
1455 sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow); 1467 sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow);
@@ -1458,9 +1470,9 @@ static ssize_t pktgen_if_write(struct file *file,
1458 1470
1459 if (!strcmp(name, "queue_map_min")) { 1471 if (!strcmp(name, "queue_map_min")) {
1460 len = num_arg(&user_buffer[i], 5, &value); 1472 len = num_arg(&user_buffer[i], 5, &value);
1461 if (len < 0) { 1473 if (len < 0)
1462 return len; 1474 return len;
1463 } 1475
1464 i += len; 1476 i += len;
1465 pkt_dev->queue_map_min = value; 1477 pkt_dev->queue_map_min = value;
1466 sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min); 1478 sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min);
@@ -1469,9 +1481,9 @@ static ssize_t pktgen_if_write(struct file *file,
1469 1481
1470 if (!strcmp(name, "queue_map_max")) { 1482 if (!strcmp(name, "queue_map_max")) {
1471 len = num_arg(&user_buffer[i], 5, &value); 1483 len = num_arg(&user_buffer[i], 5, &value);
1472 if (len < 0) { 1484 if (len < 0)
1473 return len; 1485 return len;
1474 } 1486
1475 i += len; 1487 i += len;
1476 pkt_dev->queue_map_max = value; 1488 pkt_dev->queue_map_max = value;
1477 sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max); 1489 sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max);
@@ -1503,9 +1515,9 @@ static ssize_t pktgen_if_write(struct file *file,
1503 1515
1504 if (!strcmp(name, "vlan_id")) { 1516 if (!strcmp(name, "vlan_id")) {
1505 len = num_arg(&user_buffer[i], 4, &value); 1517 len = num_arg(&user_buffer[i], 4, &value);
1506 if (len < 0) { 1518 if (len < 0)
1507 return len; 1519 return len;
1508 } 1520
1509 i += len; 1521 i += len;
1510 if (value <= 4095) { 1522 if (value <= 4095) {
1511 pkt_dev->vlan_id = value; /* turn on VLAN */ 1523 pkt_dev->vlan_id = value; /* turn on VLAN */
@@ -1530,9 +1542,9 @@ static ssize_t pktgen_if_write(struct file *file,
1530 1542
1531 if (!strcmp(name, "vlan_p")) { 1543 if (!strcmp(name, "vlan_p")) {
1532 len = num_arg(&user_buffer[i], 1, &value); 1544 len = num_arg(&user_buffer[i], 1, &value);
1533 if (len < 0) { 1545 if (len < 0)
1534 return len; 1546 return len;
1535 } 1547
1536 i += len; 1548 i += len;
1537 if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) { 1549 if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) {
1538 pkt_dev->vlan_p = value; 1550 pkt_dev->vlan_p = value;
@@ -1545,9 +1557,9 @@ static ssize_t pktgen_if_write(struct file *file,
1545 1557
1546 if (!strcmp(name, "vlan_cfi")) { 1558 if (!strcmp(name, "vlan_cfi")) {
1547 len = num_arg(&user_buffer[i], 1, &value); 1559 len = num_arg(&user_buffer[i], 1, &value);
1548 if (len < 0) { 1560 if (len < 0)
1549 return len; 1561 return len;
1550 } 1562
1551 i += len; 1563 i += len;
1552 if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) { 1564 if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) {
1553 pkt_dev->vlan_cfi = value; 1565 pkt_dev->vlan_cfi = value;
@@ -1560,9 +1572,9 @@ static ssize_t pktgen_if_write(struct file *file,
1560 1572
1561 if (!strcmp(name, "svlan_id")) { 1573 if (!strcmp(name, "svlan_id")) {
1562 len = num_arg(&user_buffer[i], 4, &value); 1574 len = num_arg(&user_buffer[i], 4, &value);
1563 if (len < 0) { 1575 if (len < 0)
1564 return len; 1576 return len;
1565 } 1577
1566 i += len; 1578 i += len;
1567 if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) { 1579 if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) {
1568 pkt_dev->svlan_id = value; /* turn on SVLAN */ 1580 pkt_dev->svlan_id = value; /* turn on SVLAN */
@@ -1587,9 +1599,9 @@ static ssize_t pktgen_if_write(struct file *file,
1587 1599
1588 if (!strcmp(name, "svlan_p")) { 1600 if (!strcmp(name, "svlan_p")) {
1589 len = num_arg(&user_buffer[i], 1, &value); 1601 len = num_arg(&user_buffer[i], 1, &value);
1590 if (len < 0) { 1602 if (len < 0)
1591 return len; 1603 return len;
1592 } 1604
1593 i += len; 1605 i += len;
1594 if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) { 1606 if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) {
1595 pkt_dev->svlan_p = value; 1607 pkt_dev->svlan_p = value;
@@ -1602,9 +1614,9 @@ static ssize_t pktgen_if_write(struct file *file,
1602 1614
1603 if (!strcmp(name, "svlan_cfi")) { 1615 if (!strcmp(name, "svlan_cfi")) {
1604 len = num_arg(&user_buffer[i], 1, &value); 1616 len = num_arg(&user_buffer[i], 1, &value);
1605 if (len < 0) { 1617 if (len < 0)
1606 return len; 1618 return len;
1607 } 1619
1608 i += len; 1620 i += len;
1609 if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) { 1621 if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) {
1610 pkt_dev->svlan_cfi = value; 1622 pkt_dev->svlan_cfi = value;
@@ -1618,9 +1630,9 @@ static ssize_t pktgen_if_write(struct file *file,
1618 if (!strcmp(name, "tos")) { 1630 if (!strcmp(name, "tos")) {
1619 __u32 tmp_value = 0; 1631 __u32 tmp_value = 0;
1620 len = hex32_arg(&user_buffer[i], 2, &tmp_value); 1632 len = hex32_arg(&user_buffer[i], 2, &tmp_value);
1621 if (len < 0) { 1633 if (len < 0)
1622 return len; 1634 return len;
1623 } 1635
1624 i += len; 1636 i += len;
1625 if (len == 2) { 1637 if (len == 2) {
1626 pkt_dev->tos = tmp_value; 1638 pkt_dev->tos = tmp_value;
@@ -1634,9 +1646,9 @@ static ssize_t pktgen_if_write(struct file *file,
1634 if (!strcmp(name, "traffic_class")) { 1646 if (!strcmp(name, "traffic_class")) {
1635 __u32 tmp_value = 0; 1647 __u32 tmp_value = 0;
1636 len = hex32_arg(&user_buffer[i], 2, &tmp_value); 1648 len = hex32_arg(&user_buffer[i], 2, &tmp_value);
1637 if (len < 0) { 1649 if (len < 0)
1638 return len; 1650 return len;
1639 } 1651
1640 i += len; 1652 i += len;
1641 if (len == 2) { 1653 if (len == 2) {
1642 pkt_dev->traffic_class = tmp_value; 1654 pkt_dev->traffic_class = tmp_value;
@@ -1906,13 +1918,14 @@ static int pktgen_device_event(struct notifier_block *unused,
1906 return NOTIFY_DONE; 1918 return NOTIFY_DONE;
1907} 1919}
1908 1920
1909static struct net_device *pktgen_dev_get_by_name(struct pktgen_dev *pkt_dev, const char *ifname) 1921static struct net_device *pktgen_dev_get_by_name(struct pktgen_dev *pkt_dev,
1922 const char *ifname)
1910{ 1923{
1911 char b[IFNAMSIZ+5]; 1924 char b[IFNAMSIZ+5];
1912 int i = 0; 1925 int i = 0;
1913 1926
1914 for(i=0; ifname[i] != '@'; i++) { 1927 for (i = 0; ifname[i] != '@'; i++) {
1915 if(i == IFNAMSIZ) 1928 if (i == IFNAMSIZ)
1916 break; 1929 break;
1917 1930
1918 b[i] = ifname[i]; 1931 b[i] = ifname[i];
@@ -1979,7 +1992,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
1979 printk(KERN_WARNING "pktgen: WARNING: Requested " 1992 printk(KERN_WARNING "pktgen: WARNING: Requested "
1980 "queue_map_min (zero-based) (%d) exceeds valid range " 1993 "queue_map_min (zero-based) (%d) exceeds valid range "
1981 "[0 - %d] for (%d) queues on %s, resetting\n", 1994 "[0 - %d] for (%d) queues on %s, resetting\n",
1982 pkt_dev->queue_map_min, (ntxq ?: 1)- 1, ntxq, 1995 pkt_dev->queue_map_min, (ntxq ?: 1) - 1, ntxq,
1983 pkt_dev->odev->name); 1996 pkt_dev->odev->name);
1984 pkt_dev->queue_map_min = ntxq - 1; 1997 pkt_dev->queue_map_min = ntxq - 1;
1985 } 1998 }
@@ -1987,7 +2000,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
1987 printk(KERN_WARNING "pktgen: WARNING: Requested " 2000 printk(KERN_WARNING "pktgen: WARNING: Requested "
1988 "queue_map_max (zero-based) (%d) exceeds valid range " 2001 "queue_map_max (zero-based) (%d) exceeds valid range "
1989 "[0 - %d] for (%d) queues on %s, resetting\n", 2002 "[0 - %d] for (%d) queues on %s, resetting\n",
1990 pkt_dev->queue_map_max, (ntxq ?: 1)- 1, ntxq, 2003 pkt_dev->queue_map_max, (ntxq ?: 1) - 1, ntxq,
1991 pkt_dev->odev->name); 2004 pkt_dev->odev->name);
1992 pkt_dev->queue_map_max = ntxq - 1; 2005 pkt_dev->queue_map_max = ntxq - 1;
1993 } 2006 }
@@ -2028,7 +2041,8 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
2028 */ 2041 */
2029 2042
2030 rcu_read_lock(); 2043 rcu_read_lock();
2031 if ((idev = __in6_dev_get(pkt_dev->odev)) != NULL) { 2044 idev = __in6_dev_get(pkt_dev->odev);
2045 if (idev) {
2032 struct inet6_ifaddr *ifp; 2046 struct inet6_ifaddr *ifp;
2033 2047
2034 read_lock_bh(&idev->lock); 2048 read_lock_bh(&idev->lock);
@@ -2181,7 +2195,7 @@ static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow)
2181 if (x) { 2195 if (x) {
2182 pkt_dev->flows[flow].x = x; 2196 pkt_dev->flows[flow].x = x;
2183 set_pkt_overhead(pkt_dev); 2197 set_pkt_overhead(pkt_dev);
2184 pkt_dev->pkt_overhead+=x->props.header_len; 2198 pkt_dev->pkt_overhead += x->props.header_len;
2185 } 2199 }
2186 2200
2187 } 2201 }
@@ -2320,18 +2334,18 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev)
2320 2334
2321 if (!(pkt_dev->flags & F_IPV6)) { 2335 if (!(pkt_dev->flags & F_IPV6)) {
2322 2336
2323 if ((imn = ntohl(pkt_dev->saddr_min)) < (imx = 2337 imn = ntohl(pkt_dev->saddr_min);
2324 ntohl(pkt_dev-> 2338 imx = ntohl(pkt_dev->saddr_max);
2325 saddr_max))) { 2339 if (imn < imx) {
2326 __u32 t; 2340 __u32 t;
2327 if (pkt_dev->flags & F_IPSRC_RND) 2341 if (pkt_dev->flags & F_IPSRC_RND)
2328 t = random32() % (imx - imn) + imn; 2342 t = random32() % (imx - imn) + imn;
2329 else { 2343 else {
2330 t = ntohl(pkt_dev->cur_saddr); 2344 t = ntohl(pkt_dev->cur_saddr);
2331 t++; 2345 t++;
2332 if (t > imx) { 2346 if (t > imx)
2333 t = imn; 2347 t = imn;
2334 } 2348
2335 } 2349 }
2336 pkt_dev->cur_saddr = htonl(t); 2350 pkt_dev->cur_saddr = htonl(t);
2337 } 2351 }
@@ -2442,7 +2456,7 @@ static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev)
2442 if (err) 2456 if (err)
2443 goto error; 2457 goto error;
2444 2458
2445 x->curlft.bytes +=skb->len; 2459 x->curlft.bytes += skb->len;
2446 x->curlft.packets++; 2460 x->curlft.packets++;
2447error: 2461error:
2448 spin_unlock(&x->lock); 2462 spin_unlock(&x->lock);
@@ -2474,11 +2488,11 @@ static int process_ipsec(struct pktgen_dev *pkt_dev,
2474 int ret; 2488 int ret;
2475 __u8 *eth; 2489 __u8 *eth;
2476 nhead = x->props.header_len - skb_headroom(skb); 2490 nhead = x->props.header_len - skb_headroom(skb);
2477 if (nhead >0) { 2491 if (nhead > 0) {
2478 ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC); 2492 ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC);
2479 if (ret < 0) { 2493 if (ret < 0) {
2480 printk(KERN_ERR "Error expanding " 2494 printk(KERN_ERR "Error expanding "
2481 "ipsec packet %d\n",ret); 2495 "ipsec packet %d\n", ret);
2482 goto err; 2496 goto err;
2483 } 2497 }
2484 } 2498 }
@@ -2488,13 +2502,13 @@ static int process_ipsec(struct pktgen_dev *pkt_dev,
2488 ret = pktgen_output_ipsec(skb, pkt_dev); 2502 ret = pktgen_output_ipsec(skb, pkt_dev);
2489 if (ret) { 2503 if (ret) {
2490 printk(KERN_ERR "Error creating ipsec " 2504 printk(KERN_ERR "Error creating ipsec "
2491 "packet %d\n",ret); 2505 "packet %d\n", ret);
2492 goto err; 2506 goto err;
2493 } 2507 }
2494 /* restore ll */ 2508 /* restore ll */
2495 eth = (__u8 *) skb_push(skb, ETH_HLEN); 2509 eth = (__u8 *) skb_push(skb, ETH_HLEN);
2496 memcpy(eth, pkt_dev->hh, 12); 2510 memcpy(eth, pkt_dev->hh, 12);
2497 *(u16 *) & eth[12] = protocol; 2511 *(u16 *) &eth[12] = protocol;
2498 } 2512 }
2499 } 2513 }
2500 return 1; 2514 return 1;
@@ -2507,9 +2521,9 @@ err:
2507static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) 2521static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev)
2508{ 2522{
2509 unsigned i; 2523 unsigned i;
2510 for (i = 0; i < pkt_dev->nr_labels; i++) { 2524 for (i = 0; i < pkt_dev->nr_labels; i++)
2511 *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM; 2525 *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM;
2512 } 2526
2513 mpls--; 2527 mpls--;
2514 *mpls |= MPLS_STACK_BOTTOM; 2528 *mpls |= MPLS_STACK_BOTTOM;
2515} 2529}
@@ -2676,8 +2690,9 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
2676 } 2690 }
2677 } 2691 }
2678 2692
2679 /* Stamp the time, and sequence number, convert them to network byte order */ 2693 /* Stamp the time, and sequence number,
2680 2694 * convert them to network byte order
2695 */
2681 if (pgh) { 2696 if (pgh) {
2682 struct timeval timestamp; 2697 struct timeval timestamp;
2683 2698
@@ -2931,7 +2946,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
2931 udph = udp_hdr(skb); 2946 udph = udp_hdr(skb);
2932 2947
2933 memcpy(eth, pkt_dev->hh, 12); 2948 memcpy(eth, pkt_dev->hh, 12);
2934 *(__be16 *) & eth[12] = protocol; 2949 *(__be16 *) &eth[12] = protocol;
2935 2950
2936 /* Eth + IPh + UDPh + mpls */ 2951 /* Eth + IPh + UDPh + mpls */
2937 datalen = pkt_dev->cur_pkt_size - 14 - 2952 datalen = pkt_dev->cur_pkt_size - 14 -
@@ -3025,8 +3040,10 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
3025 } 3040 }
3026 } 3041 }
3027 3042
3028 /* Stamp the time, and sequence number, convert them to network byte order */ 3043 /* Stamp the time, and sequence number,
3029 /* should we update cloned packets too ? */ 3044 * convert them to network byte order
3045 * should we update cloned packets too ?
3046 */
3030 if (pgh) { 3047 if (pgh) {
3031 struct timeval timestamp; 3048 struct timeval timestamp;
3032 3049
@@ -3174,7 +3191,8 @@ static void pktgen_run_all_threads(void)
3174 3191
3175 mutex_unlock(&pktgen_thread_lock); 3192 mutex_unlock(&pktgen_thread_lock);
3176 3193
3177 schedule_timeout_interruptible(msecs_to_jiffies(125)); /* Propagate thread->control */ 3194 /* Propagate thread->control */
3195 schedule_timeout_interruptible(msecs_to_jiffies(125));
3178 3196
3179 pktgen_wait_all_threads_run(); 3197 pktgen_wait_all_threads_run();
3180} 3198}
@@ -3192,7 +3210,8 @@ static void pktgen_reset_all_threads(void)
3192 3210
3193 mutex_unlock(&pktgen_thread_lock); 3211 mutex_unlock(&pktgen_thread_lock);
3194 3212
3195 schedule_timeout_interruptible(msecs_to_jiffies(125)); /* Propagate thread->control */ 3213 /* Propagate thread->control */
3214 schedule_timeout_interruptible(msecs_to_jiffies(125));
3196 3215
3197 pktgen_wait_all_threads_run(); 3216 pktgen_wait_all_threads_run();
3198} 3217}
@@ -3485,7 +3504,8 @@ static int pktgen_thread_worker(void *arg)
3485 init_waitqueue_head(&t->queue); 3504 init_waitqueue_head(&t->queue);
3486 complete(&t->start_done); 3505 complete(&t->start_done);
3487 3506
3488 pr_debug("pktgen: starting pktgen/%d: pid=%d\n", cpu, task_pid_nr(current)); 3507 pr_debug("pktgen: starting pktgen/%d: pid=%d\n",
3508 cpu, task_pid_nr(current));
3489 3509
3490 set_current_state(TASK_INTERRUPTIBLE); 3510 set_current_state(TASK_INTERRUPTIBLE);
3491 3511