Module Name:    src
Committed By:   thorpej
Date:           Fri Sep  4 01:57:29 UTC 2020

Modified Files:
        src/sys/arch/alpha/include: cpu.h

Log Message:
Shuffle fields in cpu_info for better cache behavior.
XXX More changes to come after curlwp is overhauled.


To generate a diff of this commit:
cvs rdiff -u -r1.91 -r1.92 src/sys/arch/alpha/include/cpu.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/alpha/include/cpu.h
diff -u src/sys/arch/alpha/include/cpu.h:1.91 src/sys/arch/alpha/include/cpu.h:1.92
--- src/sys/arch/alpha/include/cpu.h:1.91	Thu Sep  3 14:27:47 2020
+++ src/sys/arch/alpha/include/cpu.h	Fri Sep  4 01:57:29 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.91 2020/09/03 14:27:47 thorpej Exp $ */
+/* $NetBSD: cpu.h,v 1.92 2020/09/04 01:57:29 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -84,10 +84,8 @@
 
 #if defined(_KERNEL) || defined(_KMEMUSER)
 #include <sys/cpu_data.h>
-#ifndef _KMEMUSER
 #include <sys/cctr.h>
 #include <machine/frame.h>
-#endif
 
 /*
  * Machine check information.
@@ -97,42 +95,51 @@ struct mchkinfo {
 	volatile int mc_received;	/* machine check was received */
 };
 
+/*
+ * Per-cpu information.  Data accessed by MI code is marked [MI].
+ */
 struct cpu_info {
-	/*
-	 * Public members.
-	 */
-	struct lwp *ci_curlwp;		/* current owner of the processor */
-	struct lwp *ci_onproc;		/* current user LWP / kthread */
-	struct cpu_data ci_data;	/* MI per-cpu data */
-#if !defined(_KMEMUSER)
-	struct cctr_state ci_cc;	/* cycle counter state */
-	struct cpu_info *ci_next;	/* next cpu_info structure */
-	int ci_mtx_count;
-	int ci_mtx_oldspl;
+	struct lwp *ci_curlwp;		/* [MI] current owner of the cpu */
+	struct lwp *ci_onproc;		/* [MI] current user LWP / kthread */
+	struct cpu_data ci_data;	/* [MI] general per-cpu data */
+	struct cctr_state ci_cc;	/* [MI] cycle counter state */
+
+	volatile int ci_mtx_count;	/* [MI] neg count of spin mutexes */
+	volatile int ci_mtx_oldspl;	/* [MI] for spin mutex splx() */
 
-	/*
-	 * Private members.
-	 */
-	struct mchkinfo ci_mcinfo;	/* machine check info */
-	cpuid_t ci_cpuid;		/* our CPU ID */
-	struct cpu_softc *ci_softc;	/* pointer to our device */
-	u_int ci_want_resched;		/* preempt current process */
-	u_int ci_unused;		/* unused */
 	u_long ci_intrdepth;		/* interrupt trap depth */
-	struct trapframe *ci_db_regs;	/* registers for debuggers */
-	uint64_t ci_pcc_freq;		/* cpu cycles/second */
+	struct cpu_softc *ci_softc;	/* pointer to our device */
 
 	struct pmap *ci_pmap;		/* currently-activated pmap */
 	u_int ci_next_asn;		/* next ASN to assign */
 	u_long ci_asn_gen;		/* current ASN generation */
 
-#if defined(MULTIPROCESSOR)
+	struct mchkinfo ci_mcinfo;	/* machine check info */
+
+	/*
+	 * The following must be in their own cache line, as they are
+	 * stored to regularly by remote CPUs.
+	 */
+	volatile u_long ci_ipis		/* interprocessor interrupts pending */
+			__aligned(64);
+	u_int	ci_want_resched;	/* [MI] preempt current process */
+
+	/*
+	 * These are largely static, and will frequently be fetched
+	 * by other CPUs.  For that reason, they get their own cache
+	 * line, too.
+	 */
+	struct cpu_info *ci_next	/* next cpu_info structure */
+			__aligned(64);
+	cpuid_t ci_cpuid;		/* [MI] our CPU ID */
 	volatile u_long ci_flags;	/* flags; see below */
-	volatile u_long ci_ipis;	/* interprocessor interrupts pending */
-#endif
-#endif /* !_KMEMUSER */
+	uint64_t ci_pcc_freq;		/* cpu cycles/second */
+	struct trapframe *ci_db_regs;	/* registers for debuggers */
 };
 
+/* Ensure cpu_info::ci_curlwp is within the signed 16-bit displacement. */
+__CTASSERT(offsetof(struct cpu_info, ci_curlwp) <= 0x7ff0);
+
 #endif /* _KERNEL || _KMEMUSER */
 
 #if defined(_KERNEL)
@@ -141,7 +148,6 @@ struct cpu_info {
 #define	CPUF_PRESENT	0x02		/* CPU is present */
 #define	CPUF_RUNNING	0x04		/* CPU is running */
 #define	CPUF_PAUSED	0x08		/* CPU is paused */
-#define	CPUF_FPUSAVE	0x10		/* CPU is currently in fpusave_cpu() */
 
 extern	struct cpu_info cpu_info_primary;
 extern	struct cpu_info *cpu_info_list;

Reply via email to