]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
arm64/sme: Always exit sme_alloc() early with existing storage
authorMark Brown <broonie@kernel.org>
Mon, 15 Jan 2024 20:15:46 +0000 (20:15 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Feb 2024 00:21:01 +0000 (16:21 -0800)
commit dc7eb8755797ed41a0d1b5c0c39df3c8f401b3d9 upstream.

When sme_alloc() is called with existing storage and we are not flushing we
will always allocate new storage, both leaking the existing storage and
corrupting the state. Fix this by separating the checks for flushing and
for existing storage as we do for SVE.

Callers that reallocate (eg, due to changing the vector length) should
call sme_free() themselves.

Fixes: 5d0a8d2fba50 ("arm64/ptrace: Ensure that SME is set up for target when writing SSVE state")
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20240115-arm64-sme-flush-v1-1-7472bd3459b7@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm64/kernel/fpsimd.c

index 1559c706d32d1dd0a69fa74457cc5b34a4937c99..7363f2eb98e81d7f053a6c47b14b14f06660ac74 100644 (file)
@@ -1245,8 +1245,10 @@ void fpsimd_release_task(struct task_struct *dead_task)
  */
 void sme_alloc(struct task_struct *task, bool flush)
 {
-       if (task->thread.sme_state && flush) {
-               memset(task->thread.sme_state, 0, sme_state_size(task));
+       if (task->thread.sme_state) {
+               if (flush)
+                       memset(task->thread.sme_state, 0,
+                              sme_state_size(task));
                return;
        }