[v2] tty: rocket: reduce stack usage
diff mbox series

Message ID 20191018161712.27807-1-sudipm.mukherjee@gmail.com
State Accepted
Commit 4d2c82b192e4b2037590343620329f2d88cc1135
Headers show
Series
  • [v2] tty: rocket: reduce stack usage
Related show

Commit Message

Sudip Mukherjee Oct. 18, 2019, 4:17 p.m. UTC
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

Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
---

v2: check faliure of kzalloc

 drivers/tty/rocket.c | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

Comments

Jiri Slaby Oct. 21, 2019, 5:59 a.m. UTC | #1
On 18. 10. 19, 18:17, Sudip Mukherjee wrote:
> 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
> 
> Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>

Acked-by: Jiri Slaby <jslaby@suse.cz>

Thanks.

> v2: check faliure of kzalloc
> 
>  drivers/tty/rocket.c | 32 +++++++++++++++++++-------------
>  1 file changed, 19 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c
> index 5ba6816ebf81..fbaa4ec85560 100644
> --- a/drivers/tty/rocket.c
> +++ b/drivers/tty/rocket.c
> @@ -1222,22 +1222,28 @@ 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);
> +	if (!tmp)
> +		return -ENOMEM;
> +
> +	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)
>

Patch
diff mbox series

diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c
index 5ba6816ebf81..fbaa4ec85560 100644
--- a/drivers/tty/rocket.c
+++ b/drivers/tty/rocket.c
@@ -1222,22 +1222,28 @@  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);
+	if (!tmp)
+		return -ENOMEM;
+
+	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)