diff options
author | Dan Aloni <da-x@monatomic.org> | 2007-03-02 23:44:51 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-03-02 23:44:51 -0500 |
commit | 5c15bdec5c38f4ccf73ef2585fc80a6164de9554 (patch) | |
tree | c99084e96238eb9ce40e8d9d90e0097c4e92111d /drivers/s390/net/qeth_main.c | |
parent | b5284e5aa94be2f88dc92b29e97aff3da0c45f9f (diff) |
[VLAN]: Avoid a 4-order allocation.
This patch splits the vlan_group struct into a multi-allocated struct. On
x86_64, the size of the original struct is a little more than 32KB, causing
a 4-order allocation, which is prune to problems caused by buddy-system
external fragmentation conditions.
I couldn't just use vmalloc() because vfree() cannot be called in the
softirq context of the RCU callback.
Signed-off-by: Dan Aloni <da-x@monatomic.org>
Acked-by: Jeff Garzik <jeff@garzik.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/s390/net/qeth_main.c')
-rw-r--r-- | drivers/s390/net/qeth_main.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 2257e45594b3..d8a86f5af379 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c | |||
@@ -3654,7 +3654,7 @@ qeth_verify_vlan_dev(struct net_device *dev, struct qeth_card *card) | |||
3654 | return rc; | 3654 | return rc; |
3655 | 3655 | ||
3656 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++){ | 3656 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++){ |
3657 | if (vg->vlan_devices[i] == dev){ | 3657 | if (vlan_group_get_device(vg, i) == dev){ |
3658 | rc = QETH_VLAN_CARD; | 3658 | rc = QETH_VLAN_CARD; |
3659 | break; | 3659 | break; |
3660 | } | 3660 | } |
@@ -5261,7 +5261,7 @@ qeth_free_vlan_addresses4(struct qeth_card *card, unsigned short vid) | |||
5261 | QETH_DBF_TEXT(trace, 4, "frvaddr4"); | 5261 | QETH_DBF_TEXT(trace, 4, "frvaddr4"); |
5262 | 5262 | ||
5263 | rcu_read_lock(); | 5263 | rcu_read_lock(); |
5264 | in_dev = __in_dev_get_rcu(card->vlangrp->vlan_devices[vid]); | 5264 | in_dev = __in_dev_get_rcu(vlan_group_get_device(card->vlangrp, vid)); |
5265 | if (!in_dev) | 5265 | if (!in_dev) |
5266 | goto out; | 5266 | goto out; |
5267 | for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { | 5267 | for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { |
@@ -5288,7 +5288,7 @@ qeth_free_vlan_addresses6(struct qeth_card *card, unsigned short vid) | |||
5288 | 5288 | ||
5289 | QETH_DBF_TEXT(trace, 4, "frvaddr6"); | 5289 | QETH_DBF_TEXT(trace, 4, "frvaddr6"); |
5290 | 5290 | ||
5291 | in6_dev = in6_dev_get(card->vlangrp->vlan_devices[vid]); | 5291 | in6_dev = in6_dev_get(vlan_group_get_device(card->vlangrp, vid)); |
5292 | if (!in6_dev) | 5292 | if (!in6_dev) |
5293 | return; | 5293 | return; |
5294 | for (ifa = in6_dev->addr_list; ifa; ifa = ifa->lst_next){ | 5294 | for (ifa = in6_dev->addr_list; ifa; ifa = ifa->lst_next){ |
@@ -5360,7 +5360,7 @@ qeth_layer2_process_vlans(struct qeth_card *card, int clear) | |||
5360 | if (!card->vlangrp) | 5360 | if (!card->vlangrp) |
5361 | return; | 5361 | return; |
5362 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 5362 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
5363 | if (card->vlangrp->vlan_devices[i] == NULL) | 5363 | if (vlan_group_get_device(card->vlangrp, i) == NULL) |
5364 | continue; | 5364 | continue; |
5365 | if (clear) | 5365 | if (clear) |
5366 | qeth_layer2_send_setdelvlan(card, i, IPA_CMD_DELVLAN); | 5366 | qeth_layer2_send_setdelvlan(card, i, IPA_CMD_DELVLAN); |
@@ -5398,8 +5398,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
5398 | spin_lock_irqsave(&card->vlanlock, flags); | 5398 | spin_lock_irqsave(&card->vlanlock, flags); |
5399 | /* unregister IP addresses of vlan device */ | 5399 | /* unregister IP addresses of vlan device */ |
5400 | qeth_free_vlan_addresses(card, vid); | 5400 | qeth_free_vlan_addresses(card, vid); |
5401 | if (card->vlangrp) | 5401 | vlan_group_set_device(card->vlangrp, vid, NULL); |
5402 | card->vlangrp->vlan_devices[vid] = NULL; | ||
5403 | spin_unlock_irqrestore(&card->vlanlock, flags); | 5402 | spin_unlock_irqrestore(&card->vlanlock, flags); |
5404 | if (card->options.layer2) | 5403 | if (card->options.layer2) |
5405 | qeth_layer2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); | 5404 | qeth_layer2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); |
@@ -5662,10 +5661,11 @@ qeth_add_vlan_mc(struct qeth_card *card) | |||
5662 | 5661 | ||
5663 | vg = card->vlangrp; | 5662 | vg = card->vlangrp; |
5664 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 5663 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
5665 | if (vg->vlan_devices[i] == NULL || | 5664 | struct net_device *netdev = vlan_group_get_device(vg, i); |
5666 | !(vg->vlan_devices[i]->flags & IFF_UP)) | 5665 | if (netdev == NULL || |
5666 | !(netdev->flags & IFF_UP)) | ||
5667 | continue; | 5667 | continue; |
5668 | in_dev = in_dev_get(vg->vlan_devices[i]); | 5668 | in_dev = in_dev_get(netdev); |
5669 | if (!in_dev) | 5669 | if (!in_dev) |
5670 | continue; | 5670 | continue; |
5671 | read_lock(&in_dev->mc_list_lock); | 5671 | read_lock(&in_dev->mc_list_lock); |
@@ -5749,10 +5749,11 @@ qeth_add_vlan_mc6(struct qeth_card *card) | |||
5749 | 5749 | ||
5750 | vg = card->vlangrp; | 5750 | vg = card->vlangrp; |
5751 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 5751 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
5752 | if (vg->vlan_devices[i] == NULL || | 5752 | struct net_device *netdev = vlan_group_get_device(vg, i); |
5753 | !(vg->vlan_devices[i]->flags & IFF_UP)) | 5753 | if (netdev == NULL || |
5754 | !(netdev->flags & IFF_UP)) | ||
5754 | continue; | 5755 | continue; |
5755 | in_dev = in6_dev_get(vg->vlan_devices[i]); | 5756 | in_dev = in6_dev_get(netdev); |
5756 | if (!in_dev) | 5757 | if (!in_dev) |
5757 | continue; | 5758 | continue; |
5758 | read_lock(&in_dev->lock); | 5759 | read_lock(&in_dev->lock); |