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);
}
}