Index: sys/uvm/uvm_fault.c =================================================================== RCS file: /home/netbsd/src/sys/uvm/uvm_fault.c,v retrieving revision 1.227 diff -p -u -r1.227 uvm_fault.c --- sys/uvm/uvm_fault.c 17 May 2020 19:38:17 -0000 1.227 +++ sys/uvm/uvm_fault.c 30 Jun 2020 06:29:50 -0000 @@ -152,17 +152,7 @@ struct uvm_advice { int nforw; }; -/* - * page range array: - * note: index in array must match "advice" value - * XXX: borrowed numbers from freebsd. do they work well for us? - */ - -static const struct uvm_advice uvmadvice[] = { - { UVM_ADV_NORMAL, 3, 4 }, - { UVM_ADV_RANDOM, 0, 0 }, - { UVM_ADV_SEQUENTIAL, 8, 7}, -}; +static struct uvm_advice uvmadvice[3]; #define UVM_MAXRANGE 16 /* must be MAX() of nback+nforw+1 */ @@ -206,9 +196,63 @@ uvmfault_anonflush(struct vm_anon **anon } /* + * uvmfault_rescale_advice: rescale # of pages around fault address to be + * resolved on fault. + */ + +static int +uvmfault_rescale_advice(int n) +{ + + /* + * n is # of pages for 4k pages. If page size is smaller than 4k, + * i.e., mc68010, do not increase pages for safety. + */ + if (uvmexp.pagesize <= 4096) + return n; + + /* + * Rescale # of pages so that amount of memory resolved is + * approximately same as that for 4k pages. + */ + n = (n + 1) * 4096 / uvmexp.pagesize; + return n == 0 ? 0 : (n - 1); +} + +/* * normal functions */ +void +uvmfault_init(void) +{ + + /* + * page range array: + * note: index in array must match "advice" value + * XXX: borrowed numbers from freebsd. do they work well for us? + */ + + CTASSERT(__arraycount(uvmadvice) == UVM_ADV_SEQUENTIAL + 1); + +#define INIT_ADVICE(a, b, f) \ + do { \ + uvmadvice[a].advice = a; \ + uvmadvice[a].nback = uvmfault_rescale_advice(b); \ + uvmadvice[a].nforw = uvmfault_rescale_advice(f); \ + printf("%s: advice %d nback %d nforw %d\n", __func__, \ + uvmadvice[a].advice, \ + uvmadvice[a].nback, \ + uvmadvice[a].nforw); \ + } while (0 /* CONSTCOND */) + + INIT_ADVICE(UVM_ADV_NORMAL, 3, 4); + INIT_ADVICE(UVM_ADV_RANDOM, 0, 0); + INIT_ADVICE(UVM_ADV_SEQUENTIAL, 8, 7); + +#undef INIT_ADVICE +} + /* * uvmfault_amapcopy: clear "needs_copy" in a map. * Index: sys/uvm/uvm_fault.h =================================================================== RCS file: /home/netbsd/src/sys/uvm/uvm_fault.h,v retrieving revision 1.20 diff -p -u -r1.20 uvm_fault.h --- sys/uvm/uvm_fault.h 2 Feb 2011 15:13:34 -0000 1.20 +++ sys/uvm/uvm_fault.h 28 Jun 2020 12:38:23 -0000 @@ -52,6 +52,8 @@ struct uvm_faultinfo { #ifdef _KERNEL +void uvmfault_init(void); + /* * fault prototypes */ Index: sys/uvm/uvm_init.c =================================================================== RCS file: /home/netbsd/src/sys/uvm/uvm_init.c,v retrieving revision 1.53 diff -p -u -r1.53 uvm_init.c --- sys/uvm/uvm_init.c 6 Mar 2020 20:46:12 -0000 1.53 +++ sys/uvm/uvm_init.c 28 Jun 2020 12:38:23 -0000 @@ -185,4 +185,6 @@ uvm_init(void) */ uvm_ra_init(); + + uvmfault_init(); }