diff options
Diffstat (limited to 'net/core/pktgen.c')
-rw-r--r-- | net/core/pktgen.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 6e79e96cb4f2..43923811bd6a 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -250,8 +250,7 @@ struct pktgen_dev { | |||
250 | __u64 count; /* Default No packets to send */ | 250 | __u64 count; /* Default No packets to send */ |
251 | __u64 sofar; /* How many pkts we've sent so far */ | 251 | __u64 sofar; /* How many pkts we've sent so far */ |
252 | __u64 tx_bytes; /* How many bytes we've transmitted */ | 252 | __u64 tx_bytes; /* How many bytes we've transmitted */ |
253 | __u64 errors; /* Errors when trying to transmit, | 253 | __u64 errors; /* Errors when trying to transmit, */ |
254 | pkts will be re-sent */ | ||
255 | 254 | ||
256 | /* runtime counters relating to clone_skb */ | 255 | /* runtime counters relating to clone_skb */ |
257 | 256 | ||
@@ -340,6 +339,7 @@ struct pktgen_dev { | |||
340 | __u16 cur_udp_src; | 339 | __u16 cur_udp_src; |
341 | __u16 cur_queue_map; | 340 | __u16 cur_queue_map; |
342 | __u32 cur_pkt_size; | 341 | __u32 cur_pkt_size; |
342 | __u32 last_pkt_size; | ||
343 | 343 | ||
344 | __u8 hh[14]; | 344 | __u8 hh[14]; |
345 | /* = { | 345 | /* = { |
@@ -2051,9 +2051,8 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
2051 | read_lock_bh(&idev->lock); | 2051 | read_lock_bh(&idev->lock); |
2052 | for (ifp = idev->addr_list; ifp; | 2052 | for (ifp = idev->addr_list; ifp; |
2053 | ifp = ifp->if_next) { | 2053 | ifp = ifp->if_next) { |
2054 | if (ifp->scope == IFA_LINK | 2054 | if (ifp->scope == IFA_LINK && |
2055 | && !(ifp-> | 2055 | !(ifp->flags & IFA_F_TENTATIVE)) { |
2056 | flags & IFA_F_TENTATIVE)) { | ||
2057 | ipv6_addr_copy(&pkt_dev-> | 2056 | ipv6_addr_copy(&pkt_dev-> |
2058 | cur_in6_saddr, | 2057 | cur_in6_saddr, |
2059 | &ifp->addr); | 2058 | &ifp->addr); |
@@ -2189,12 +2188,13 @@ static inline int f_pick(struct pktgen_dev *pkt_dev) | |||
2189 | /* If there was already an IPSEC SA, we keep it as is, else | 2188 | /* If there was already an IPSEC SA, we keep it as is, else |
2190 | * we go look for it ... | 2189 | * we go look for it ... |
2191 | */ | 2190 | */ |
2191 | #define DUMMY_MARK 0 | ||
2192 | static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow) | 2192 | static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow) |
2193 | { | 2193 | { |
2194 | struct xfrm_state *x = pkt_dev->flows[flow].x; | 2194 | struct xfrm_state *x = pkt_dev->flows[flow].x; |
2195 | if (!x) { | 2195 | if (!x) { |
2196 | /*slow path: we dont already have xfrm_state*/ | 2196 | /*slow path: we dont already have xfrm_state*/ |
2197 | x = xfrm_stateonly_find(&init_net, | 2197 | x = xfrm_stateonly_find(&init_net, DUMMY_MARK, |
2198 | (xfrm_address_t *)&pkt_dev->cur_daddr, | 2198 | (xfrm_address_t *)&pkt_dev->cur_daddr, |
2199 | (xfrm_address_t *)&pkt_dev->cur_saddr, | 2199 | (xfrm_address_t *)&pkt_dev->cur_saddr, |
2200 | AF_INET, | 2200 | AF_INET, |
@@ -3436,7 +3436,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) | |||
3436 | pkt_dev->clone_count--; /* back out increment, OOM */ | 3436 | pkt_dev->clone_count--; /* back out increment, OOM */ |
3437 | return; | 3437 | return; |
3438 | } | 3438 | } |
3439 | 3439 | pkt_dev->last_pkt_size = pkt_dev->skb->len; | |
3440 | pkt_dev->allocated_skbs++; | 3440 | pkt_dev->allocated_skbs++; |
3441 | pkt_dev->clone_count = 0; /* reset counter */ | 3441 | pkt_dev->clone_count = 0; /* reset counter */ |
3442 | } | 3442 | } |
@@ -3448,12 +3448,14 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) | |||
3448 | txq = netdev_get_tx_queue(odev, queue_map); | 3448 | txq = netdev_get_tx_queue(odev, queue_map); |
3449 | 3449 | ||
3450 | __netif_tx_lock_bh(txq); | 3450 | __netif_tx_lock_bh(txq); |
3451 | atomic_inc(&(pkt_dev->skb->users)); | ||
3452 | 3451 | ||
3453 | if (unlikely(netif_tx_queue_stopped(txq) || netif_tx_queue_frozen(txq))) | 3452 | if (unlikely(netif_tx_queue_stopped(txq) || netif_tx_queue_frozen(txq))) { |
3454 | ret = NETDEV_TX_BUSY; | 3453 | ret = NETDEV_TX_BUSY; |
3455 | else | 3454 | pkt_dev->last_ok = 0; |
3456 | ret = (*xmit)(pkt_dev->skb, odev); | 3455 | goto unlock; |
3456 | } | ||
3457 | atomic_inc(&(pkt_dev->skb->users)); | ||
3458 | ret = (*xmit)(pkt_dev->skb, odev); | ||
3457 | 3459 | ||
3458 | switch (ret) { | 3460 | switch (ret) { |
3459 | case NETDEV_TX_OK: | 3461 | case NETDEV_TX_OK: |
@@ -3461,7 +3463,13 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) | |||
3461 | pkt_dev->last_ok = 1; | 3463 | pkt_dev->last_ok = 1; |
3462 | pkt_dev->sofar++; | 3464 | pkt_dev->sofar++; |
3463 | pkt_dev->seq_num++; | 3465 | pkt_dev->seq_num++; |
3464 | pkt_dev->tx_bytes += pkt_dev->cur_pkt_size; | 3466 | pkt_dev->tx_bytes += pkt_dev->last_pkt_size; |
3467 | break; | ||
3468 | case NET_XMIT_DROP: | ||
3469 | case NET_XMIT_CN: | ||
3470 | case NET_XMIT_POLICED: | ||
3471 | /* skb has been consumed */ | ||
3472 | pkt_dev->errors++; | ||
3465 | break; | 3473 | break; |
3466 | default: /* Drivers are not supposed to return other values! */ | 3474 | default: /* Drivers are not supposed to return other values! */ |
3467 | if (net_ratelimit()) | 3475 | if (net_ratelimit()) |
@@ -3475,6 +3483,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) | |||
3475 | atomic_dec(&(pkt_dev->skb->users)); | 3483 | atomic_dec(&(pkt_dev->skb->users)); |
3476 | pkt_dev->last_ok = 0; | 3484 | pkt_dev->last_ok = 0; |
3477 | } | 3485 | } |
3486 | unlock: | ||
3478 | __netif_tx_unlock_bh(txq); | 3487 | __netif_tx_unlock_bh(txq); |
3479 | 3488 | ||
3480 | /* If pkt_dev->count is zero, then run forever */ | 3489 | /* If pkt_dev->count is zero, then run forever */ |
@@ -3516,6 +3525,7 @@ static int pktgen_thread_worker(void *arg) | |||
3516 | wait_event_interruptible_timeout(t->queue, | 3525 | wait_event_interruptible_timeout(t->queue, |
3517 | t->control != 0, | 3526 | t->control != 0, |
3518 | HZ/10); | 3527 | HZ/10); |
3528 | try_to_freeze(); | ||
3519 | continue; | 3529 | continue; |
3520 | } | 3530 | } |
3521 | 3531 | ||
@@ -3622,6 +3632,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) | |||
3622 | { | 3632 | { |
3623 | struct pktgen_dev *pkt_dev; | 3633 | struct pktgen_dev *pkt_dev; |
3624 | int err; | 3634 | int err; |
3635 | int node = cpu_to_node(t->cpu); | ||
3625 | 3636 | ||
3626 | /* We don't allow a device to be on several threads */ | 3637 | /* We don't allow a device to be on several threads */ |
3627 | 3638 | ||
@@ -3631,12 +3642,13 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) | |||
3631 | return -EBUSY; | 3642 | return -EBUSY; |
3632 | } | 3643 | } |
3633 | 3644 | ||
3634 | pkt_dev = kzalloc(sizeof(struct pktgen_dev), GFP_KERNEL); | 3645 | pkt_dev = kzalloc_node(sizeof(struct pktgen_dev), GFP_KERNEL, node); |
3635 | if (!pkt_dev) | 3646 | if (!pkt_dev) |
3636 | return -ENOMEM; | 3647 | return -ENOMEM; |
3637 | 3648 | ||
3638 | strcpy(pkt_dev->odevname, ifname); | 3649 | strcpy(pkt_dev->odevname, ifname); |
3639 | pkt_dev->flows = vmalloc(MAX_CFLOWS * sizeof(struct flow_state)); | 3650 | pkt_dev->flows = vmalloc_node(MAX_CFLOWS * sizeof(struct flow_state), |
3651 | node); | ||
3640 | if (pkt_dev->flows == NULL) { | 3652 | if (pkt_dev->flows == NULL) { |
3641 | kfree(pkt_dev); | 3653 | kfree(pkt_dev); |
3642 | return -ENOMEM; | 3654 | return -ENOMEM; |
@@ -3698,7 +3710,8 @@ static int __init pktgen_create_thread(int cpu) | |||
3698 | struct proc_dir_entry *pe; | 3710 | struct proc_dir_entry *pe; |
3699 | struct task_struct *p; | 3711 | struct task_struct *p; |
3700 | 3712 | ||
3701 | t = kzalloc(sizeof(struct pktgen_thread), GFP_KERNEL); | 3713 | t = kzalloc_node(sizeof(struct pktgen_thread), GFP_KERNEL, |
3714 | cpu_to_node(cpu)); | ||
3702 | if (!t) { | 3715 | if (!t) { |
3703 | printk(KERN_ERR "pktgen: ERROR: out of memory, can't " | 3716 | printk(KERN_ERR "pktgen: ERROR: out of memory, can't " |
3704 | "create new thread.\n"); | 3717 | "create new thread.\n"); |