提交 84e40dc1 编写于 作者: R Raghavendra Rao Ananta 提交者: Zheng Zengkai

selftests: KVM: Handle compiler optimizations in ucall

stable inclusion
from stable-v5.10.136
commit 50763f0ac0706e63c0ba550adccfca25eb3d0667
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5ZWNE

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=50763f0ac0706e63c0ba550adccfca25eb3d0667

--------------------------------

[ Upstream commit 9e2f6498 ]

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: NRicardo Koller <ricarkol@google.com>
Suggested-by: NReiji Watanabe <reijiw@google.com>
Signed-off-by: NRaghavendra Rao Ananta <rananta@google.com>
Message-Id: <20220615185706.1099208-1-rananta@google.com>
Reviewed-by: NAndrew Jones <drjones@redhat.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
Reviewed-by: NWei Li <liwei391@huawei.com>
上级 8ff1effb
...@@ -73,20 +73,19 @@ void ucall_uninit(struct kvm_vm *vm) ...@@ -73,20 +73,19 @@ void ucall_uninit(struct kvm_vm *vm)
void ucall(uint64_t cmd, int nargs, ...) void ucall(uint64_t cmd, int nargs, ...)
{ {
struct ucall uc = { struct ucall uc = {};
.cmd = cmd,
};
va_list va; va_list va;
int i; int i;
WRITE_ONCE(uc.cmd, cmd);
nargs = nargs <= UCALL_MAX_ARGS ? nargs : UCALL_MAX_ARGS; nargs = nargs <= UCALL_MAX_ARGS ? nargs : UCALL_MAX_ARGS;
va_start(va, nargs); va_start(va, nargs);
for (i = 0; i < nargs; ++i) 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); 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) uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册