Now that the proc0 wakeup(9) is gone we can retry the other part of
the uvm_meter() patch.

uvm_meter() is meant to run every 5 seconds, but for historical
reasons it is called from schedcpu() and it is scheduled against the
UTC clock.  schedcpu() and uvm_meter() have different periods, so
uvm_meter() ought to be a separate timeout.  uvm_meter() is started
alongside schedcpu() so the two will still run in sync.

v1: https://marc.info/?l=openbsd-tech&m=168710929409153&w=2

ok?

Index: sys/uvm/uvm_meter.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_meter.c,v
retrieving revision 1.46
diff -u -p -r1.46 uvm_meter.c
--- sys/uvm/uvm_meter.c 2 Aug 2023 13:54:45 -0000       1.46
+++ sys/uvm/uvm_meter.c 2 Aug 2023 15:13:49 -0000
@@ -85,10 +85,12 @@ void uvmexp_read(struct uvmexp *);
  * uvm_meter: calculate load average
  */
 void
-uvm_meter(void)
+uvm_meter(void *unused)
 {
-       if ((gettime() % 5) == 0)
-               uvm_loadav(&averunnable);
+       static struct timeout to = TIMEOUT_INITIALIZER(uvm_meter, NULL);
+
+       timeout_add_sec(&to, 5);
+       uvm_loadav(&averunnable);
 }
 
 /*
Index: sys/uvm/uvm_extern.h
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_extern.h,v
retrieving revision 1.170
diff -u -p -r1.170 uvm_extern.h
--- sys/uvm/uvm_extern.h        21 Jun 2023 21:16:21 -0000      1.170
+++ sys/uvm/uvm_extern.h        2 Aug 2023 15:13:49 -0000
@@ -414,7 +414,7 @@ void                        uvmspace_free(struct vmspace *);
 struct vmspace         *uvmspace_share(struct process *);
 int                    uvm_share(vm_map_t, vaddr_t, vm_prot_t,
                            vm_map_t, vaddr_t, vsize_t);
-void                   uvm_meter(void);
+void                   uvm_meter(void *);
 int                    uvm_sysctl(int *, u_int, void *, size_t *, 
                            void *, size_t, struct proc *);
 struct vm_page         *uvm_pagealloc(struct uvm_object *,
Index: sys/kern/sched_bsd.c
===================================================================
RCS file: /cvs/src/sys/kern/sched_bsd.c,v
retrieving revision 1.78
diff -u -p -r1.78 sched_bsd.c
--- sys/kern/sched_bsd.c        25 Jul 2023 18:16:19 -0000      1.78
+++ sys/kern/sched_bsd.c        2 Aug 2023 15:13:50 -0000
@@ -235,7 +235,6 @@ schedcpu(void *arg)
                }
                SCHED_UNLOCK(s);
        }
-       uvm_meter();
        wakeup(&lbolt);
        timeout_add_sec(to, 1);
 }
@@ -688,6 +687,7 @@ scheduler_start(void)
 
        rrticks_init = hz / 10;
        schedcpu(&schedcpu_to);
+       uvm_meter(NULL);
 
 #ifndef SMALL_KERNEL
        if (perfpolicy == PERFPOL_AUTO)
Index: share/man/man9/uvm_init.9
===================================================================
RCS file: /cvs/src/share/man/man9/uvm_init.9,v
retrieving revision 1.7
diff -u -p -r1.7 uvm_init.9
--- share/man/man9/uvm_init.9   21 Jun 2023 21:16:21 -0000      1.7
+++ share/man/man9/uvm_init.9   2 Aug 2023 15:13:50 -0000
@@ -168,7 +168,7 @@ argument is ignored.
 .Ft void
 .Fn uvm_kernacc "caddr_t addr" "size_t len" "int rw"
 .Ft void
-.Fn uvm_meter
+.Fn uvm_meter "void *arg"
 .Ft int
 .Fn uvm_sysctl "int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" 
"void *newp " "size_t newlen" "struct proc *p"
 .Ft int
@@ -212,7 +212,7 @@ access, in the kernel address space.
 .Pp
 The
 .Fn uvm_meter
-function calculates the load average and wakes up the swapper if necessary.
+timeout updates system load averages every five seconds.
 .Pp
 The
 .Fn uvm_sysctl

Reply via email to