Patch "selftests: KVM: Handle compiler optimizations in ucall" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    selftests: KVM: Handle compiler optimizations in ucall

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     selftests-kvm-handle-compiler-optimizations-in-ucall.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit c1014f3ca7b45c03403c6254b8c7ccaceb698781
Author: Raghavendra Rao Ananta <rananta@xxxxxxxxxx>
Date:   Wed Jun 15 18:57:06 2022 +0000

    selftests: KVM: Handle compiler optimizations in ucall
    
    [ Upstream commit 9e2f6498efbbc880d7caa7935839e682b64fe5a6 ]
    
    The selftests, when built with newer versions of clang, is found
    to have over optimized guests' ucall() function, and eliminating
    the stores for uc.cmd (perhaps due to no immediate readers). This
    resulted in the userspace side always reading a value of '0', and
    causing multiple test failures.
    
    As a result, prevent the compiler from optimizing the stores in
    ucall() with WRITE_ONCE().
    
    Suggested-by: Ricardo Koller <ricarkol@xxxxxxxxxx>
    Suggested-by: Reiji Watanabe <reijiw@xxxxxxxxxx>
    Signed-off-by: Raghavendra Rao Ananta <rananta@xxxxxxxxxx>
    Message-Id: <20220615185706.1099208-1-rananta@xxxxxxxxxx>
    Reviewed-by: Andrew Jones <drjones@xxxxxxxxxx>
    Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c
index 2f37b90ee1a9..f600311fdc6a 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c
@@ -73,20 +73,19 @@ void ucall_uninit(struct kvm_vm *vm)
 
 void ucall(uint64_t cmd, int nargs, ...)
 {
-	struct ucall uc = {
-		.cmd = cmd,
-	};
+	struct ucall uc = {};
 	va_list va;
 	int i;
 
+	WRITE_ONCE(uc.cmd, cmd);
 	nargs = nargs <= UCALL_MAX_ARGS ? nargs : UCALL_MAX_ARGS;
 
 	va_start(va, nargs);
 	for (i = 0; i < nargs; ++i)
-		uc.args[i] = va_arg(va, uint64_t);
+		WRITE_ONCE(uc.args[i], va_arg(va, uint64_t));
 	va_end(va);
 
-	*ucall_exit_mmio_addr = (vm_vaddr_t)&uc;
+	WRITE_ONCE(*ucall_exit_mmio_addr, (vm_vaddr_t)&uc);
 }
 
 uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux