Module Name:    src
Committed By:   rin
Date:           Sat Jul  4 04:39:21 UTC 2020

Modified Files:
        src/sys/arch/aarch64/aarch64: cpufunc.c

Log Message:
Fix uvmexp.ncolors for some big.LITTLE configuration; it is uncertain
which CPU is used as primary, and as a result, secondary CPUs can
require larger number of colors.

In order to solve this problem, update uvmexp.ncolors via
uvm_page_recolor(9) when secondary CPUs are attached, as done for
other ports like x86.

Pointed out by jmcneill@, and discussed on port-arm@:
http://mail-index.netbsd.org/port-arm/2020/07/03/msg006837.html

Tested and OK'd by ryo@.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/aarch64/aarch64/cpufunc.c

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/aarch64/aarch64/cpufunc.c
diff -u src/sys/arch/aarch64/aarch64/cpufunc.c:1.21 src/sys/arch/aarch64/aarch64/cpufunc.c:1.22
--- src/sys/arch/aarch64/aarch64/cpufunc.c:1.21	Wed Jul  1 07:59:16 2020
+++ src/sys/arch/aarch64/aarch64/cpufunc.c	Sat Jul  4 04:39:20 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.c,v 1.21 2020/07/01 07:59:16 ryo Exp $	*/
+/*	$NetBSD: cpufunc.c,v 1.22 2020/07/04 04:39:20 rin Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <[email protected]>
@@ -30,13 +30,15 @@
 #include "opt_multiprocessor.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.21 2020/07/01 07:59:16 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.22 2020/07/04 04:39:20 rin Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/kmem.h>
 #include <sys/cpu.h>
 
+#include <uvm/uvm_page.h>
+
 #include <aarch64/cpufunc.h>
 
 u_int cputype;			/* compat arm */
@@ -102,6 +104,7 @@ aarch64_getcacheinfo(int unit)
 {
 	struct cpu_info * const ci = curcpu();
 	uint32_t clidr, ctr;
+	u_int vindexsize;
 	int level, cachetype;
 	struct aarch64_cache_info *cinfo = NULL;
 
@@ -215,14 +218,20 @@ aarch64_getcacheinfo(int unit)
 	    ((cinfo[0].cacheable == CACHE_CACHEABLE_ICACHE) ||
 	     (cinfo[0].cacheable == CACHE_CACHEABLE_IDCACHE))) {
 
-		aarch64_cache_vindexsize =
+		vindexsize =
 		    cinfo[0].icache.cache_size /
 		    cinfo[0].icache.cache_ways;
 
-		KASSERT(aarch64_cache_vindexsize != 0);
-		aarch64_cache_prefer_mask = aarch64_cache_vindexsize - 1;
+		KASSERT(vindexsize != 0);
 	} else {
-		aarch64_cache_vindexsize = 0;
+		vindexsize = 0;
+	}
+
+	if (vindexsize > aarch64_cache_vindexsize) {
+		aarch64_cache_vindexsize = vindexsize;
+		aarch64_cache_prefer_mask = vindexsize - 1;
+		if (uvm.page_init_done)
+			uvm_page_recolor(vindexsize / PAGE_SIZE);
 	}
 }
 

Reply via email to