kselftest/arm64: Validate that changing one VL type does not affect another
authorMark Brown <broonie@kernel.org>
Thu, 20 Jul 2023 18:39:00 +0000 (19:39 +0100)
committerWill Deacon <will@kernel.org>
Thu, 27 Jul 2023 15:52:06 +0000 (16:52 +0100)
On a system with both SVE and SME when we change one of the VLs this should
not result in a change in the other VL. Add a check that this is in fact
the case to vec-syscfg.

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20230720-arm64-fix-sve-sme-vl-change-v2-3-8eea06b82d57@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
tools/testing/selftests/arm64/fp/vec-syscfg.c

index 58ea4bde5be75cdce60db425e93331fe53fe1655..5f648b97a06fea4df891e3e998c997b85bbc200a 100644 (file)
@@ -554,7 +554,8 @@ static void prctl_set_onexec(struct vec_data *data)
 /* For each VQ verify that setting via prctl() does the right thing */
 static void prctl_set_all_vqs(struct vec_data *data)
 {
-       int ret, vq, vl, new_vl;
+       int ret, vq, vl, new_vl, i;
+       int orig_vls[ARRAY_SIZE(vec_data)];
        int errors = 0;
 
        if (!data->min_vl || !data->max_vl) {
@@ -563,6 +564,9 @@ static void prctl_set_all_vqs(struct vec_data *data)
                return;
        }
 
+       for (i = 0; i < ARRAY_SIZE(vec_data); i++)
+               orig_vls[i] = vec_data[i].rdvl();
+
        for (vq = SVE_VQ_MIN; vq <= SVE_VQ_MAX; vq++) {
                vl = sve_vl_from_vq(vq);
 
@@ -585,6 +589,22 @@ static void prctl_set_all_vqs(struct vec_data *data)
                        errors++;
                }
 
+               /* Did any other VLs change? */
+               for (i = 0; i < ARRAY_SIZE(vec_data); i++) {
+                       if (&vec_data[i] == data)
+                               continue;
+
+                       if (!(getauxval(vec_data[i].hwcap_type) & vec_data[i].hwcap))
+                               continue;
+
+                       if (vec_data[i].rdvl() != orig_vls[i]) {
+                               ksft_print_msg("%s VL changed from %d to %d\n",
+                                              vec_data[i].name, orig_vls[i],
+                                              vec_data[i].rdvl());
+                               errors++;
+                       }
+               }
+
                /* Was that the VL we asked for? */
                if (new_vl == vl)
                        continue;