[PATCH 04/11] staging: vchiq_arm: Clear VLA warning

Tobin C . Harding me at tobin.cc
Tue Apr 3 15:32:25 PDT 2018


On Sat, Mar 31, 2018 at 10:09:40PM +0200, Stefan Wahren wrote:
> The kernel would like to have all stack VLA usage removed[1]. The array
> here is fixed (declared with a const variable) but it appears like a VLA
> to the compiler. Also, currently we are putting 768 bytes on the
> stack. So save stack space and removes the VLA build warning by
> making it static.
> 
> [1]: https://lkml.org/lkml/2018/3/7/621
> 
> CC: Tobin C. Harding <me at tobin.cc>
> Signed-off-by: Stefan Wahren <stefan.wahren at i2se.com>
> ---
>  .../vc04_services/interface/vchiq_arm/vchiq_arm.c    | 20 ++++++++++----------
>  1 file changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> index 24d456b..f276437 100644
> --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> @@ -3414,13 +3414,18 @@ vchiq_release_service(VCHIQ_SERVICE_HANDLE_T handle)
>  	return ret;
>  }
>  
> +struct service_data_struct {
> +	int fourcc;
> +	int clientid;
> +	int use_count;
> +};
> +
>  void
>  vchiq_dump_service_use_state(VCHIQ_STATE_T *state)
>  {
>  	VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
> +	static struct service_data_struct service_data[64];
>  	int i, j = 0;
> -	/* Only dump 64 services */
> -	static const int local_max_services = 64;
>  	/* If there's more than 64 services, only dump ones with
>  	 * non-zero counts */
>  	int only_nonzero = 0;
> @@ -3431,11 +3436,6 @@ vchiq_dump_service_use_state(VCHIQ_STATE_T *state)
>  	int peer_count;
>  	int vc_use_count;
>  	int active_services;
> -	struct service_data_struct {
> -		int fourcc;
> -		int clientid;
> -		int use_count;
> -	} service_data[local_max_services];
>  
>  	if (!arm_state)
>  		return;
> @@ -3446,10 +3446,10 @@ vchiq_dump_service_use_state(VCHIQ_STATE_T *state)
>  	peer_count = arm_state->peer_use_count;
>  	vc_use_count = arm_state->videocore_use_count;
>  	active_services = state->unused_service;
> -	if (active_services > local_max_services)
> +	if (active_services > ARRAY_SIZE(service_data))
>  		only_nonzero = 1;
>  
> -	for (i = 0; (i < active_services) && (j < local_max_services); i++) {
> +	for (i = 0; (i < active_services) && (j < ARRAY_SIZE(service_data)); i++) {
>  		VCHIQ_SERVICE_T *service_ptr = state->services[i];
>  
>  		if (!service_ptr)
> @@ -3479,7 +3479,7 @@ vchiq_dump_service_use_state(VCHIQ_STATE_T *state)
>  		vchiq_log_warning(vchiq_susp_log_level, "Too many active "
>  			"services (%d).  Only dumping up to first %d services "
>  			"with non-zero use-count", active_services,
> -			local_max_services);
> +			ARRAY_SIZE(service_data));
>  
>  	for (i = 0; i < j; i++) {
>  		vchiq_log_warning(vchiq_susp_log_level,
> -- 
> 2.7.4
> 

On a previous attempt to fix this VLA Linus commented that 64 was too
big (it equates to 768 bytes on the stack).  Here is that email for your
reference

	https://lkml.org/lkml/2018/3/9/744

I didn't understand what he meant by 'just do the stack size limitation'


Hope this helps,
Tobin.



More information about the linux-rpi-kernel mailing list