| From 3499e87ea0413ee5b2cc028f4c8ed4d424bc7f98 Mon Sep 17 00:00:00 2001 |
| From: Arnd Bergmann <arnd@arndb.de> |
| Date: Thu, 7 Mar 2019 16:58:35 +0100 |
| Subject: ethtool: reduce stack usage with clang |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| commit 3499e87ea0413ee5b2cc028f4c8ed4d424bc7f98 upstream. |
| |
| clang inlines the dev_ethtool() more aggressively than gcc does, leading |
| to a larger amount of used stack space: |
| |
| net/core/ethtool.c:2536:24: error: stack frame size of 1216 bytes in function 'dev_ethtool' [-Werror,-Wframe-larger-than=] |
| |
| Marking the sub-functions that require the most stack space as |
| noinline_for_stack gives us reasonable behavior on all compilers. |
| |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Reviewed-by: Michal Kubecek <mkubecek@suse.cz> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Miles Chen <miles.chen@mediatek.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| net/core/ethtool.c | 16 +++++++++------- |
| 1 file changed, 9 insertions(+), 7 deletions(-) |
| |
| --- a/net/core/ethtool.c |
| +++ b/net/core/ethtool.c |
| @@ -2332,9 +2332,10 @@ out: |
| return ret; |
| } |
| |
| -static int ethtool_get_per_queue_coalesce(struct net_device *dev, |
| - void __user *useraddr, |
| - struct ethtool_per_queue_op *per_queue_opt) |
| +static noinline_for_stack int |
| +ethtool_get_per_queue_coalesce(struct net_device *dev, |
| + void __user *useraddr, |
| + struct ethtool_per_queue_op *per_queue_opt) |
| { |
| u32 bit; |
| int ret; |
| @@ -2364,9 +2365,10 @@ static int ethtool_get_per_queue_coalesc |
| return 0; |
| } |
| |
| -static int ethtool_set_per_queue_coalesce(struct net_device *dev, |
| - void __user *useraddr, |
| - struct ethtool_per_queue_op *per_queue_opt) |
| +static noinline_for_stack int |
| +ethtool_set_per_queue_coalesce(struct net_device *dev, |
| + void __user *useraddr, |
| + struct ethtool_per_queue_op *per_queue_opt) |
| { |
| u32 bit; |
| int i, ret = 0; |
| @@ -2423,7 +2425,7 @@ roll_back: |
| return ret; |
| } |
| |
| -static int ethtool_set_per_queue(struct net_device *dev, |
| +static int noinline_for_stack ethtool_set_per_queue(struct net_device *dev, |
| void __user *useraddr, u32 sub_cmd) |
| { |
| struct ethtool_per_queue_op per_queue_opt; |