[PATCH v3 10/42] arm64/sve: Make sysctl interface for SVE reusable by SME

Will Deacon will at kernel.org
Thu Oct 21 02:55:51 PDT 2021


On Tue, Oct 19, 2021 at 06:22:15PM +0100, Mark Brown wrote:
> The vector length configuration for SME is very similar to that for SVE
> so in order to allow reuse refactor the SVE configuration so that it takes
> the vector type from the struct ctl_table. Since there's no dedicated space
> for this we repurpose the extra1 field to store the vector type, this is
> otherwise unused for integer sysctls.
> 
> Signed-off-by: Mark Brown <broonie at kernel.org>
> ---
>  arch/arm64/kernel/fpsimd.c | 28 +++++++++++++++++-----------
>  1 file changed, 17 insertions(+), 11 deletions(-)
> 
> diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
> index 3474122f9207..53462636b5cf 100644
> --- a/arch/arm64/kernel/fpsimd.c
> +++ b/arch/arm64/kernel/fpsimd.c
> @@ -15,6 +15,7 @@
>  #include <linux/compiler.h>
>  #include <linux/cpu.h>
>  #include <linux/cpu_pm.h>
> +#include <linux/ctype.h>
>  #include <linux/kernel.h>
>  #include <linux/linkage.h>
>  #include <linux/irqflags.h>
> @@ -155,11 +156,6 @@ static int get_default_vl(enum vec_type type)
>  	return READ_ONCE(vl_config[type].__default_vl);
>  }
>  
> -static int get_sve_default_vl(void)
> -{
> -	return get_default_vl(ARM64_VEC_SVE);
> -}
> -
>  #ifdef CONFIG_ARM64_SVE
>  
>  static void set_default_vl(enum vec_type type, int val)
> @@ -172,6 +168,11 @@ static void set_sve_default_vl(int val)
>  	set_default_vl(ARM64_VEC_SVE, val);
>  }
>  
> +static int get_sve_default_vl(void)
> +{
> +	return get_default_vl(ARM64_VEC_SVE);
> +}
> +
>  static void __percpu *efi_sve_state;
>  
>  #else /* ! CONFIG_ARM64_SVE */
> @@ -406,17 +407,21 @@ static unsigned int find_supported_vector_length(enum vec_type type,
>  
>  #if defined(CONFIG_ARM64_SVE) && defined(CONFIG_SYSCTL)
>  
> -static int sve_proc_do_default_vl(struct ctl_table *table, int write,
> +static int vec_proc_do_default_vl(struct ctl_table *table, int write,
>  				  void *buffer, size_t *lenp, loff_t *ppos)
>  {
> -	struct vl_info *info = &vl_info[ARM64_VEC_SVE];
> +	struct vl_info *info = table->extra1;
> +	enum vec_type type = info->type;
>  	int ret;
> -	int vl = get_sve_default_vl();
> +	int vl = get_default_vl(type);
>  	struct ctl_table tmp_table = {
>  		.data = &vl,
>  		.maxlen = sizeof(vl),
>  	};
>  
> +	if (!info)
> +		return -EINVAL;

Is this check actually needed? If so, you've already dereferenced the
pointer.

Will



More information about the linux-arm-kernel mailing list