Index | Thread | Search

From:
Mike Larkin <mlarkin@nested.page>
Subject:
Re: retire wbinvd_on_all_cpus_acked()
To:
tech@openbsd.org
Date:
Tue, 11 Nov 2025 09:02:01 -0800

Download raw body.

Thread
On Tue, Nov 11, 2025 at 01:45:11PM +0100, hshoexer wrote:
> Hi,
>
> having replaced wbinvd_on_all_cpus_acked() with cpu_xcall(9) in
> psp(4), that function can be retired now.
>
> ok?

ok


>
> Take care,
> HJ.
> ---------
> diff --git a/sys/arch/amd64/amd64/cpu.c b/sys/arch/amd64/amd64/cpu.c
> index 8ac783d7b9c..1052c7d9407 100644
> --- a/sys/arch/amd64/amd64/cpu.c
> +++ b/sys/arch/amd64/amd64/cpu.c
> @@ -1479,46 +1479,6 @@ wbinvd_on_all_cpus(void)
>  	wbinvd();
>  	return 0;
>  }
> -
> -volatile long wbinvd_wait __attribute__((section(".kudata")));
> -
> -void
> -wbinvd_on_all_cpus_acked(void)
> -{
> -	struct cpu_info *ci, *self = curcpu();;
> -	CPU_INFO_ITERATOR cii;
> -	long wait = 0;
> -	u_int64_t mask = 0;
> -	int s;
> -
> -	CPU_INFO_FOREACH(cii, ci) {
> -		if (ci == self || !(ci->ci_flags & CPUF_RUNNING))
> -			continue;
> -		mask |= (1ULL << ci->ci_cpuid);
> -		wait++;
> -	}
> -
> -	if (wait > 0) {
> -		s = splvm();
> -		while (atomic_cas_ulong(&wbinvd_wait, 0 , wait) != 0) {
> -			while (wbinvd_wait != 0)
> -				CPU_BUSY_CYCLE();
> -		}
> -
> -		CPU_INFO_FOREACH(cii, ci) {
> -			if ((mask & (1ULL << ci->ci_cpuid)) == 0)
> -				continue;
> -			if (x86_fast_ipi(ci, LAPIC_IPI_WBINVD) != 0)
> -				panic("%s: ipi failed", __func__);
> -		}
> -		splx(s);
> -	}
> -
> -	wbinvd();
> -
> -	while (wbinvd_wait != 0)
> -		CPU_BUSY_CYCLE();
> -}
>  #endif /* MULTIPROCESSOR */
>
>  int cpu_suspended;
> diff --git a/sys/arch/amd64/amd64/lapic.c b/sys/arch/amd64/amd64/lapic.c
> index f7fdb81ccca..ccf743303f2 100644
> --- a/sys/arch/amd64/amd64/lapic.c
> +++ b/sys/arch/amd64/amd64/lapic.c
> @@ -364,8 +364,6 @@ lapic_boot_init(paddr_t lapic_base)
>  		idt_vec_set(LAPIC_IPI_INVLPG, Xipi_invlpg_pcid);
>  		idt_vec_set(LAPIC_IPI_INVLRANGE, Xipi_invlrange_pcid);
>  	}
> -	idt_allocmap[LAPIC_IPI_WBINVD] = 1;
> -	idt_vec_set(LAPIC_IPI_WBINVD, Xipi_wbinvd);
>  #if NVMM > 0
>  	idt_allocmap[LAPIC_IPI_INVEPT] = 1;
>  	idt_vec_set(LAPIC_IPI_INVEPT, Xipi_invept);
> diff --git a/sys/arch/amd64/amd64/vector.S b/sys/arch/amd64/amd64/vector.S
> index c77bfb1c72c..cfc6cc6ee66 100644
> --- a/sys/arch/amd64/amd64/vector.S
> +++ b/sys/arch/amd64/amd64/vector.S
> @@ -817,17 +817,6 @@ IDTVEC(ipi_invlrange_pcid)
>  	iretq
>  END(Xipi_invlrange_pcid)
>
> -IDTVEC(ipi_wbinvd)
> -	ioapic_asm_ack()
> -
> -	wbinvd
> -
> -	lock
> -	decq	wbinvd_wait
> -
> -	iretq
> -END(Xipi_wbinvd)
> -
>  #endif /* MULTIPROCESSOR */
>
>  	/*
> diff --git a/sys/arch/amd64/include/cpufunc.h b/sys/arch/amd64/include/cpufunc.h
> index 59837bca884..86c4722a34f 100644
> --- a/sys/arch/amd64/include/cpufunc.h
> +++ b/sys/arch/amd64/include/cpufunc.h
> @@ -304,7 +304,6 @@ wbinvd(void)
>
>  #ifdef MULTIPROCESSOR
>  int wbinvd_on_all_cpus(void);
> -void wbinvd_on_all_cpus_acked(void);
>  #else
>  static inline int
>  wbinvd_on_all_cpus(void)
> diff --git a/sys/arch/amd64/include/i82489var.h b/sys/arch/amd64/include/i82489var.h
> index 561efa3fbd7..95dfff5173d 100644
> --- a/sys/arch/amd64/include/i82489var.h
> +++ b/sys/arch/amd64/include/i82489var.h
> @@ -72,8 +72,7 @@ extern void Xresume_lapic_ipi(void);
>  #define LAPIC_IPI_INVLTLB			(LAPIC_IPI_OFFSET + 0)
>  #define LAPIC_IPI_INVLPG			(LAPIC_IPI_OFFSET + 1)
>  #define LAPIC_IPI_INVLRANGE			(LAPIC_IPI_OFFSET + 2)
> -#define LAPIC_IPI_WBINVD			(LAPIC_IPI_OFFSET + 3)
> -#define LAPIC_IPI_INVEPT			(LAPIC_IPI_OFFSET + 4)
> +#define LAPIC_IPI_INVEPT			(LAPIC_IPI_OFFSET + 3)
>
>  extern void Xipi_invltlb(void);
>  extern void Xipi_invltlb_pcid(void);
> @@ -81,7 +80,6 @@ extern void Xipi_invlpg(void);
>  extern void Xipi_invlpg_pcid(void);
>  extern void Xipi_invlrange(void);
>  extern void Xipi_invlrange_pcid(void);
> -extern void Xipi_wbinvd(void);
>  #if NVMM > 0
>  extern void Xipi_invept(void);
>  #endif /* NVMM > 0 */
>