Commit 86dacd96 authored by Rohan McLure's avatar Rohan McLure Committed by Michael Ellerman
Browse files

powerpc: Mark writes registering ipi to host cpu through kvm and polling



Mark writes to hypervisor ipi state so that KCSAN recognises these
asynchronous issue of kvmppc_{set,clear}_host_ipi to be intended, with
atomic writes. Mark asynchronous polls to this variable in
kvm_ppc_read_one_intr().

Signed-off-by: default avatarRohan McLure <rmclure@linux.ibm.com>
Reviewed-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230510033117.1395895-9-rmclure@linux.ibm.com
parent 8608f14b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -548,12 +548,12 @@ static inline void kvmppc_set_host_ipi(int cpu)
	 * pairs with the barrier in kvmppc_clear_host_ipi()
	 */
	smp_mb();
	paca_ptrs[cpu]->kvm_hstate.host_ipi = 1;
	WRITE_ONCE(paca_ptrs[cpu]->kvm_hstate.host_ipi, 1);
}

static inline void kvmppc_clear_host_ipi(int cpu)
{
	paca_ptrs[cpu]->kvm_hstate.host_ipi = 0;
	WRITE_ONCE(paca_ptrs[cpu]->kvm_hstate.host_ipi, 0);
	/*
	 * order clearing of host_ipi flag vs. processing of IPI messages
	 *
+2 −2
Original line number Diff line number Diff line
@@ -406,7 +406,7 @@ static long kvmppc_read_one_intr(bool *again)
		return 1;

	/* see if a host IPI is pending */
	host_ipi = local_paca->kvm_hstate.host_ipi;
	host_ipi = READ_ONCE(local_paca->kvm_hstate.host_ipi);
	if (host_ipi)
		return 1;

@@ -466,7 +466,7 @@ static long kvmppc_read_one_intr(bool *again)
		 * meantime. If it's clear, we bounce the interrupt to the
		 * guest
		 */
		host_ipi = local_paca->kvm_hstate.host_ipi;
		host_ipi = READ_ONCE(local_paca->kvm_hstate.host_ipi);
		if (unlikely(host_ipi != 0)) {
			/* We raced with the host,
			 * we need to resend that IPI, bummer