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@xxxxxxxxxx> > --- > 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