diff options
author | Wang Shaoyan <wangshaoyan.pt@taobao.com> | 2011-08-11 13:07:25 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-08-13 21:00:33 -0400 |
commit | 588dc91151d99e9307c2f9a8468453274fe43ecd (patch) | |
tree | 62331a1de1d671522070796238942326c5842e77 /drivers/net | |
parent | 320f24e482e6b390c608c6afec253405f9ab7436 (diff) |
gianfar: reduce stack usage in gianfar_ethtool.c
drivers/net/gianfar_ethtool.c:765: warning: the frame size of 2048 bytes is larger than 1024 bytes
Signed-off-by: Wang Shaoyan <wangshaoyan.pt@taobao.com>
Reviewed-and-tested-by: Sebastian Pöhn <sebastian.poehn@belden.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/gianfar_ethtool.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c index 6e350692d118..25a8c2adb001 100644 --- a/drivers/net/gianfar_ethtool.c +++ b/drivers/net/gianfar_ethtool.c | |||
@@ -686,10 +686,21 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
686 | { | 686 | { |
687 | unsigned int last_rule_idx = priv->cur_filer_idx; | 687 | unsigned int last_rule_idx = priv->cur_filer_idx; |
688 | unsigned int cmp_rqfpr; | 688 | unsigned int cmp_rqfpr; |
689 | unsigned int local_rqfpr[MAX_FILER_IDX + 1]; | 689 | unsigned int *local_rqfpr; |
690 | unsigned int local_rqfcr[MAX_FILER_IDX + 1]; | 690 | unsigned int *local_rqfcr; |
691 | int i = 0x0, k = 0x0; | 691 | int i = 0x0, k = 0x0; |
692 | int j = MAX_FILER_IDX, l = 0x0; | 692 | int j = MAX_FILER_IDX, l = 0x0; |
693 | int ret = 1; | ||
694 | |||
695 | local_rqfpr = kmalloc(sizeof(unsigned int) * (MAX_FILER_IDX + 1), | ||
696 | GFP_KERNEL); | ||
697 | local_rqfcr = kmalloc(sizeof(unsigned int) * (MAX_FILER_IDX + 1), | ||
698 | GFP_KERNEL); | ||
699 | if (!local_rqfpr || !local_rqfcr) { | ||
700 | pr_err("Out of memory\n"); | ||
701 | ret = 0; | ||
702 | goto err; | ||
703 | } | ||
693 | 704 | ||
694 | switch (class) { | 705 | switch (class) { |
695 | case TCP_V4_FLOW: | 706 | case TCP_V4_FLOW: |
@@ -706,7 +717,8 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
706 | break; | 717 | break; |
707 | default: | 718 | default: |
708 | pr_err("Right now this class is not supported\n"); | 719 | pr_err("Right now this class is not supported\n"); |
709 | return 0; | 720 | ret = 0; |
721 | goto err; | ||
710 | } | 722 | } |
711 | 723 | ||
712 | for (i = 0; i < MAX_FILER_IDX + 1; i++) { | 724 | for (i = 0; i < MAX_FILER_IDX + 1; i++) { |
@@ -721,7 +733,8 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
721 | 733 | ||
722 | if (i == MAX_FILER_IDX + 1) { | 734 | if (i == MAX_FILER_IDX + 1) { |
723 | pr_err("No parse rule found, can't create hash rules\n"); | 735 | pr_err("No parse rule found, can't create hash rules\n"); |
724 | return 0; | 736 | ret = 0; |
737 | goto err; | ||
725 | } | 738 | } |
726 | 739 | ||
727 | /* If a match was found, then it begins the starting of a cluster rule | 740 | /* If a match was found, then it begins the starting of a cluster rule |
@@ -765,7 +778,10 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
765 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 778 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
766 | } | 779 | } |
767 | 780 | ||
768 | return 1; | 781 | err: |
782 | kfree(local_rqfcr); | ||
783 | kfree(local_rqfpr); | ||
784 | return ret; | ||
769 | } | 785 | } |
770 | 786 | ||
771 | static int gfar_set_hash_opts(struct gfar_private *priv, struct ethtool_rxnfc *cmd) | 787 | static int gfar_set_hash_opts(struct gfar_private *priv, struct ethtool_rxnfc *cmd) |