The build of xtensa allmodconfig gives warning of:
In function 'get_ports.isra.0':
warning: the frame size of 1040 bytes is larger than 1024 bytes

Allocate memory for 'struct rocket_ports' dynamically to reduce the
stack usage, as an added benifit we can remove the memset by using
kzalloc while allocating memory.

Signed-off-by: Sudip Mukherjee <sudipm.mukher...@gmail.com>
---
 drivers/tty/rocket.c | 29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c
index 5ba6816ebf81..cc1424b9a1e5 100644
--- a/drivers/tty/rocket.c
+++ b/drivers/tty/rocket.c
@@ -1222,22 +1222,25 @@ static int set_config(struct tty_struct *tty, struct 
r_port *info,
  */
 static int get_ports(struct r_port *info, struct rocket_ports __user *retports)
 {
-       struct rocket_ports tmp;
-       int board;
+       struct rocket_ports *tmp;
+       int board, ret = 0;
 
-       memset(&tmp, 0, sizeof (tmp));
-       tmp.tty_major = rocket_driver->major;
+       tmp = kzalloc(sizeof(*tmp), GFP_KERNEL);
+       tmp->tty_major = rocket_driver->major;
 
        for (board = 0; board < 4; board++) {
-               tmp.rocketModel[board].model = rocketModel[board].model;
-               strcpy(tmp.rocketModel[board].modelString, 
rocketModel[board].modelString);
-               tmp.rocketModel[board].numPorts = rocketModel[board].numPorts;
-               tmp.rocketModel[board].loadrm2 = rocketModel[board].loadrm2;
-               tmp.rocketModel[board].startingPortNumber = 
rocketModel[board].startingPortNumber;
-       }
-       if (copy_to_user(retports, &tmp, sizeof (*retports)))
-               return -EFAULT;
-       return 0;
+               tmp->rocketModel[board].model = rocketModel[board].model;
+               strcpy(tmp->rocketModel[board].modelString,
+                      rocketModel[board].modelString);
+               tmp->rocketModel[board].numPorts = rocketModel[board].numPorts;
+               tmp->rocketModel[board].loadrm2 = rocketModel[board].loadrm2;
+               tmp->rocketModel[board].startingPortNumber =
+                       rocketModel[board].startingPortNumber;
+       }
+       if (copy_to_user(retports, tmp, sizeof(*retports)))
+               ret = -EFAULT;
+       kfree(tmp);
+       return ret;
 }
 
 static int reset_rm2(struct r_port *info, void __user *arg)
-- 
2.11.0

Reply via email to