Revert "schedcpu, uvm_meter(9): make uvm_meter() an independent timeout"
authorcheloha <cheloha@openbsd.org>
Wed, 21 Jun 2023 21:16:21 +0000 (21:16 +0000)
committercheloha <cheloha@openbsd.org>
Wed, 21 Jun 2023 21:16:21 +0000 (21:16 +0000)
Sometimes causes boot hang after mounting root partition.

Thread 1: https://marc.info/?l=openbsd-misc&m=168736497407357&w=2
Thread 2: https://marc.info/?l=openbsd-misc&m=168737429214370&w=2

share/man/man9/uvm_init.9
sys/kern/sched_bsd.c
sys/uvm/uvm_extern.h
sys/uvm/uvm_meter.c

index 636a16a..a8493cd 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $OpenBSD: uvm_init.9,v 1.6 2023/06/20 16:30:30 cheloha Exp $
+.\"    $OpenBSD: uvm_init.9,v 1.7 2023/06/21 21:16:21 cheloha Exp $
 .\"    $NetBSD: uvm.9,v 1.14 2000/06/29 06:08:44 mrg Exp $
 .\"
 .\" Copyright (c) 1998 Matthew R. Green
@@ -28,7 +28,7 @@
 .\" XXX this manual sets nS to 1 or 0 in the description, to obtain
 .\" synopsis-like function prototypes.  any better way?
 .\"
-.Dd $Mdocdate: June 20 2023 $
+.Dd $Mdocdate: June 21 2023 $
 .Dt UVM_INIT 9
 .Os
 .Sh NAME
@@ -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 "void *"
+.Fn uvm_meter
 .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 periodically recomputes the load average.
+function calculates the load average and wakes up the swapper if necessary.
 .Pp
 The
 .Fn uvm_sysctl
index 3a82cca..753edae 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: sched_bsd.c,v 1.75 2023/06/20 16:30:30 cheloha Exp $  */
+/*     $OpenBSD: sched_bsd.c,v 1.76 2023/06/21 21:16:21 cheloha Exp $  */
 /*     $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */
 
 /*-
@@ -234,6 +234,7 @@ schedcpu(void *arg)
                }
                SCHED_UNLOCK(s);
        }
+       uvm_meter();
        wakeup(&lbolt);
        timeout_add_sec(to, 1);
 }
@@ -668,7 +669,6 @@ scheduler_start(void)
 
        rrticks_init = hz / 10;
        schedcpu(&schedcpu_to);
-       uvm_meter(NULL);
 
 #ifndef SMALL_KERNEL
        if (perfpolicy == PERFPOL_AUTO)
index 85124bd..a6fc5f0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uvm_extern.h,v 1.169 2023/06/20 16:30:30 cheloha Exp $        */
+/*     $OpenBSD: uvm_extern.h,v 1.170 2023/06/21 21:16:21 cheloha Exp $        */
 /*     $NetBSD: uvm_extern.h,v 1.57 2001/03/09 01:02:12 chs Exp $      */
 
 /*
@@ -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 8fc7c10..cd0efee 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uvm_meter.c,v 1.43 2023/06/20 16:30:30 cheloha Exp $  */
+/*     $OpenBSD: uvm_meter.c,v 1.44 2023/06/21 21:16:21 cheloha Exp $  */
 /*     $NetBSD: uvm_meter.c,v 1.21 2001/07/14 06:36:03 matt Exp $      */
 
 /*
@@ -65,9 +65,6 @@
 int maxslp = MAXSLP;   /* patchable ... */
 struct loadavg averunnable;
 
-#define UVM_METER_INTVL        5
-struct timeout uvm_meter_to = TIMEOUT_INITIALIZER(uvm_meter, NULL);
-
 /*
  * constants for averages over 1, 5, and 15 minutes when sampling at
  * 5 second intervals.
@@ -85,13 +82,15 @@ void uvm_total(struct vmtotal *);
 void uvmexp_read(struct uvmexp *);
 
 /*
- * uvm_meter: recompute load averages
+ * uvm_meter: calculate load average and wake up the swapper (if needed)
  */
 void
-uvm_meter(void *unused)
+uvm_meter(void)
 {
-       timeout_add_sec(&uvm_meter_to, UVM_METER_INTVL);
-       uvm_loadav(&averunnable);
+       if ((gettime() % 5) == 0)
+               uvm_loadav(&averunnable);
+       if (proc0.p_slptime > (maxslp / 2))
+               wakeup(&proc0);
 }
 
 /*