diff options
author | Petko Manolov <petkan@nucleusys.com> | 2013-04-25 18:41:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-29 13:57:49 -0400 |
commit | 313a58e487ab3eb80e7e1f9baddc75968288aad9 (patch) | |
tree | 5dbb435244b98990b1d9286a59622ced4ccfea3a | |
parent | 5f5624cf156283687e11ea329c7a0523c677ea0e (diff) |
drivers: net: usb: pegasus: remove skb pool
The socket buffer pool for the receive path is now gone. It's existence
didn't make much difference (performance-wise) and the code is better off
without the spinlocks protecting it.
Signed-off-by: Petko Manolov <petkan@nucleusys.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/usb/pegasus.c | 73 | ||||
-rw-r--r-- | drivers/net/usb/pegasus.h | 3 |
2 files changed, 9 insertions, 67 deletions
diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c index 73051d10ead2..ff7b84d4c9fd 100644 --- a/drivers/net/usb/pegasus.c +++ b/drivers/net/usb/pegasus.c | |||
@@ -575,51 +575,6 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb) | |||
575 | return ret; | 575 | return ret; |
576 | } | 576 | } |
577 | 577 | ||
578 | static void fill_skb_pool(pegasus_t *pegasus) | ||
579 | { | ||
580 | int i; | ||
581 | |||
582 | for (i = 0; i < RX_SKBS; i++) { | ||
583 | if (pegasus->rx_pool[i]) | ||
584 | continue; | ||
585 | pegasus->rx_pool[i] = dev_alloc_skb(PEGASUS_MTU + 2); | ||
586 | /* | ||
587 | ** we give up if the allocation fail. the tasklet will be | ||
588 | ** rescheduled again anyway... | ||
589 | */ | ||
590 | if (pegasus->rx_pool[i] == NULL) | ||
591 | return; | ||
592 | skb_reserve(pegasus->rx_pool[i], 2); | ||
593 | } | ||
594 | } | ||
595 | |||
596 | static void free_skb_pool(pegasus_t *pegasus) | ||
597 | { | ||
598 | int i; | ||
599 | |||
600 | for (i = 0; i < RX_SKBS; i++) { | ||
601 | if (pegasus->rx_pool[i]) { | ||
602 | dev_kfree_skb(pegasus->rx_pool[i]); | ||
603 | pegasus->rx_pool[i] = NULL; | ||
604 | } | ||
605 | } | ||
606 | } | ||
607 | |||
608 | static inline struct sk_buff *pull_skb(pegasus_t * pegasus) | ||
609 | { | ||
610 | int i; | ||
611 | struct sk_buff *skb; | ||
612 | |||
613 | for (i = 0; i < RX_SKBS; i++) { | ||
614 | if (likely(pegasus->rx_pool[i] != NULL)) { | ||
615 | skb = pegasus->rx_pool[i]; | ||
616 | pegasus->rx_pool[i] = NULL; | ||
617 | return skb; | ||
618 | } | ||
619 | } | ||
620 | return NULL; | ||
621 | } | ||
622 | |||
623 | static void read_bulk_callback(struct urb *urb) | 578 | static void read_bulk_callback(struct urb *urb) |
624 | { | 579 | { |
625 | pegasus_t *pegasus = urb->context; | 580 | pegasus_t *pegasus = urb->context; |
@@ -704,9 +659,8 @@ static void read_bulk_callback(struct urb *urb) | |||
704 | if (pegasus->flags & PEGASUS_UNPLUG) | 659 | if (pegasus->flags & PEGASUS_UNPLUG) |
705 | return; | 660 | return; |
706 | 661 | ||
707 | spin_lock(&pegasus->rx_pool_lock); | 662 | pegasus->rx_skb = __netdev_alloc_skb_ip_align(pegasus->net, PEGASUS_MTU, |
708 | pegasus->rx_skb = pull_skb(pegasus); | 663 | GFP_ATOMIC); |
709 | spin_unlock(&pegasus->rx_pool_lock); | ||
710 | 664 | ||
711 | if (pegasus->rx_skb == NULL) | 665 | if (pegasus->rx_skb == NULL) |
712 | goto tl_sched; | 666 | goto tl_sched; |
@@ -734,24 +688,23 @@ tl_sched: | |||
734 | static void rx_fixup(unsigned long data) | 688 | static void rx_fixup(unsigned long data) |
735 | { | 689 | { |
736 | pegasus_t *pegasus; | 690 | pegasus_t *pegasus; |
737 | unsigned long flags; | ||
738 | int status; | 691 | int status; |
739 | 692 | ||
740 | pegasus = (pegasus_t *) data; | 693 | pegasus = (pegasus_t *) data; |
741 | if (pegasus->flags & PEGASUS_UNPLUG) | 694 | if (pegasus->flags & PEGASUS_UNPLUG) |
742 | return; | 695 | return; |
743 | 696 | ||
744 | spin_lock_irqsave(&pegasus->rx_pool_lock, flags); | ||
745 | fill_skb_pool(pegasus); | ||
746 | if (pegasus->flags & PEGASUS_RX_URB_FAIL) | 697 | if (pegasus->flags & PEGASUS_RX_URB_FAIL) |
747 | if (pegasus->rx_skb) | 698 | if (pegasus->rx_skb) |
748 | goto try_again; | 699 | goto try_again; |
749 | if (pegasus->rx_skb == NULL) | 700 | if (pegasus->rx_skb == NULL) |
750 | pegasus->rx_skb = pull_skb(pegasus); | 701 | pegasus->rx_skb = __netdev_alloc_skb_ip_align(pegasus->net, |
702 | PEGASUS_MTU, | ||
703 | GFP_ATOMIC); | ||
751 | if (pegasus->rx_skb == NULL) { | 704 | if (pegasus->rx_skb == NULL) { |
752 | netif_warn(pegasus, rx_err, pegasus->net, "low on memory\n"); | 705 | netif_warn(pegasus, rx_err, pegasus->net, "low on memory\n"); |
753 | tasklet_schedule(&pegasus->rx_tl); | 706 | tasklet_schedule(&pegasus->rx_tl); |
754 | goto done; | 707 | return; |
755 | } | 708 | } |
756 | usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb, | 709 | usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb, |
757 | usb_rcvbulkpipe(pegasus->usb, 1), | 710 | usb_rcvbulkpipe(pegasus->usb, 1), |
@@ -767,8 +720,6 @@ try_again: | |||
767 | } else { | 720 | } else { |
768 | pegasus->flags &= ~PEGASUS_RX_URB_FAIL; | 721 | pegasus->flags &= ~PEGASUS_RX_URB_FAIL; |
769 | } | 722 | } |
770 | done: | ||
771 | spin_unlock_irqrestore(&pegasus->rx_pool_lock, flags); | ||
772 | } | 723 | } |
773 | 724 | ||
774 | static void write_bulk_callback(struct urb *urb) | 725 | static void write_bulk_callback(struct urb *urb) |
@@ -1007,10 +958,9 @@ static int pegasus_open(struct net_device *net) | |||
1007 | int res; | 958 | int res; |
1008 | 959 | ||
1009 | if (pegasus->rx_skb == NULL) | 960 | if (pegasus->rx_skb == NULL) |
1010 | pegasus->rx_skb = pull_skb(pegasus); | 961 | pegasus->rx_skb = __netdev_alloc_skb_ip_align(pegasus->net, |
1011 | /* | 962 | PEGASUS_MTU, |
1012 | ** Note: no point to free the pool. it is empty :-) | 963 | GFP_KERNEL); |
1013 | */ | ||
1014 | if (!pegasus->rx_skb) | 964 | if (!pegasus->rx_skb) |
1015 | return -ENOMEM; | 965 | return -ENOMEM; |
1016 | 966 | ||
@@ -1044,7 +994,6 @@ static int pegasus_open(struct net_device *net) | |||
1044 | res = -EIO; | 994 | res = -EIO; |
1045 | usb_kill_urb(pegasus->rx_urb); | 995 | usb_kill_urb(pegasus->rx_urb); |
1046 | usb_kill_urb(pegasus->intr_urb); | 996 | usb_kill_urb(pegasus->intr_urb); |
1047 | free_skb_pool(pegasus); | ||
1048 | goto exit; | 997 | goto exit; |
1049 | } | 998 | } |
1050 | set_carrier(net); | 999 | set_carrier(net); |
@@ -1364,7 +1313,6 @@ static int pegasus_probe(struct usb_interface *intf, | |||
1364 | pegasus->mii.mdio_write = mdio_write; | 1313 | pegasus->mii.mdio_write = mdio_write; |
1365 | pegasus->mii.phy_id_mask = 0x1f; | 1314 | pegasus->mii.phy_id_mask = 0x1f; |
1366 | pegasus->mii.reg_num_mask = 0x1f; | 1315 | pegasus->mii.reg_num_mask = 0x1f; |
1367 | spin_lock_init(&pegasus->rx_pool_lock); | ||
1368 | pegasus->msg_enable = netif_msg_init(msg_level, NETIF_MSG_DRV | 1316 | pegasus->msg_enable = netif_msg_init(msg_level, NETIF_MSG_DRV |
1369 | | NETIF_MSG_PROBE | NETIF_MSG_LINK); | 1317 | | NETIF_MSG_PROBE | NETIF_MSG_LINK); |
1370 | 1318 | ||
@@ -1376,7 +1324,6 @@ static int pegasus_probe(struct usb_interface *intf, | |||
1376 | goto out2; | 1324 | goto out2; |
1377 | } | 1325 | } |
1378 | set_ethernet_addr(pegasus); | 1326 | set_ethernet_addr(pegasus); |
1379 | fill_skb_pool(pegasus); | ||
1380 | if (pegasus->features & PEGASUS_II) { | 1327 | if (pegasus->features & PEGASUS_II) { |
1381 | dev_info(&intf->dev, "setup Pegasus II specific registers\n"); | 1328 | dev_info(&intf->dev, "setup Pegasus II specific registers\n"); |
1382 | setup_pegasus_II(pegasus); | 1329 | setup_pegasus_II(pegasus); |
@@ -1404,7 +1351,6 @@ static int pegasus_probe(struct usb_interface *intf, | |||
1404 | 1351 | ||
1405 | out3: | 1352 | out3: |
1406 | usb_set_intfdata(intf, NULL); | 1353 | usb_set_intfdata(intf, NULL); |
1407 | free_skb_pool(pegasus); | ||
1408 | out2: | 1354 | out2: |
1409 | free_all_urbs(pegasus); | 1355 | free_all_urbs(pegasus); |
1410 | out1: | 1356 | out1: |
@@ -1429,7 +1375,6 @@ static void pegasus_disconnect(struct usb_interface *intf) | |||
1429 | unregister_netdev(pegasus->net); | 1375 | unregister_netdev(pegasus->net); |
1430 | unlink_all_urbs(pegasus); | 1376 | unlink_all_urbs(pegasus); |
1431 | free_all_urbs(pegasus); | 1377 | free_all_urbs(pegasus); |
1432 | free_skb_pool(pegasus); | ||
1433 | if (pegasus->rx_skb != NULL) { | 1378 | if (pegasus->rx_skb != NULL) { |
1434 | dev_kfree_skb(pegasus->rx_skb); | 1379 | dev_kfree_skb(pegasus->rx_skb); |
1435 | pegasus->rx_skb = NULL; | 1380 | pegasus->rx_skb = NULL; |
diff --git a/drivers/net/usb/pegasus.h b/drivers/net/usb/pegasus.h index 65b78b35b73c..00d44e3ff744 100644 --- a/drivers/net/usb/pegasus.h +++ b/drivers/net/usb/pegasus.h | |||
@@ -13,7 +13,6 @@ | |||
13 | #define HAS_HOME_PNA 0x40000000 | 13 | #define HAS_HOME_PNA 0x40000000 |
14 | 14 | ||
15 | #define PEGASUS_MTU 1536 | 15 | #define PEGASUS_MTU 1536 |
16 | #define RX_SKBS 4 | ||
17 | 16 | ||
18 | #define EPROM_WRITE 0x01 | 17 | #define EPROM_WRITE 0x01 |
19 | #define EPROM_READ 0x02 | 18 | #define EPROM_READ 0x02 |
@@ -97,11 +96,9 @@ typedef struct pegasus { | |||
97 | struct tasklet_struct rx_tl; | 96 | struct tasklet_struct rx_tl; |
98 | struct delayed_work carrier_check; | 97 | struct delayed_work carrier_check; |
99 | struct urb *ctrl_urb, *rx_urb, *tx_urb, *intr_urb; | 98 | struct urb *ctrl_urb, *rx_urb, *tx_urb, *intr_urb; |
100 | struct sk_buff *rx_pool[RX_SKBS]; | ||
101 | struct sk_buff *rx_skb; | 99 | struct sk_buff *rx_skb; |
102 | struct usb_ctrlrequest dr; | 100 | struct usb_ctrlrequest dr; |
103 | wait_queue_head_t ctrl_wait; | 101 | wait_queue_head_t ctrl_wait; |
104 | spinlock_t rx_pool_lock; | ||
105 | int chip; | 102 | int chip; |
106 | unsigned char intr_buff[8]; | 103 | unsigned char intr_buff[8]; |
107 | __u8 tx_buff[PEGASUS_MTU]; | 104 | __u8 tx_buff[PEGASUS_MTU]; |