On Tue, Jun 20, 2023 at 11:47:10AM +0200, Claudio Jeker wrote:
> On Mon, Jun 19, 2023 at 04:45:03PM -0500, Scott Cheloha wrote:
> 
> [...]
> 
> > Index: uvm/uvm_meter.c
> > ===================================================================
> > RCS file: /cvs/src/sys/uvm/uvm_meter.c,v
> > retrieving revision 1.42
> > diff -u -p -r1.42 uvm_meter.c
> > --- uvm/uvm_meter.c 28 Dec 2020 14:01:23 -0000      1.42
> > +++ uvm/uvm_meter.c 19 Jun 2023 21:35:22 -0000
> > @@ -42,6 +42,7 @@
> >  #include <sys/percpu.h>
> >  #include <sys/proc.h>
> >  #include <sys/sysctl.h>
> > +#include <sys/timeout.h>
> >  #include <sys/vmmeter.h>
> >  #include <uvm/uvm.h>
> >  #include <uvm/uvm_ddb.h>
> > @@ -65,6 +66,9 @@
> >  int maxslp = MAXSLP;       /* patchable ... */
> >  struct loadavg averunnable;
> >  
> > +/* Update load averages every five seconds. */
> > +#define UVM_METER_INTVL    5
> > +
> >  /*
> >   * constants for averages over 1, 5, and 15 minutes when sampling at
> >   * 5 second intervals.
> > @@ -78,17 +82,29 @@ static fixpt_t cexp[3] = {
> >  
> >  
> >  static void uvm_loadav(struct loadavg *);
> > +void uvm_meter(void *);
> >  void uvm_total(struct vmtotal *);
> >  void uvmexp_read(struct uvmexp *);
> >  
> > +void
> > +uvm_meter_start(void)
> > +{
> > +   static struct timeout to = TIMEOUT_INITIALIZER(uvm_meter, &to);
> > +
> > +   uvm_meter(&to);
> > +}
> > +
> >  /*
> >   * uvm_meter: calculate load average and wake up the swapper (if needed)
> >   */
> >  void
> > -uvm_meter(void)
> > +uvm_meter(void *arg)
> >  {
> > -   if ((gettime() % 5) == 0)
> > -           uvm_loadav(&averunnable);
> > +   struct timeout *to = arg;
> > +
> > +   timeout_add_sec(to, UVM_METER_INTVL);
> > +
> > +   uvm_loadav(&averunnable);
> >     if (proc0.p_slptime > (maxslp / 2))
> >             wakeup(&proc0);
> >  }
> 
> Why add uvm_meter_start() using a static global value and then pass that
> value around. This code could just be:
> 
> struct timeout uvm_meter_to = TIMEOUT_INITIALIZER(uvm_meter, NULL);
> 
> void
> uvm_meter(void *arg)
> {
>       timeout_add_sec(&uvm_meter_to, UVM_METER_INTVL);
>       uvm_loadav(&averunnable);
> }
> 
> and then just call uvm_meter() once in scheduler_start().
> I don't understand why all extra this indirection is needed it does not
> make the code better..
> 
> Apart from that and the fact that the proc0 wakeup and go I'm OK with this
> diff.

I like that better.  I'll commit the attached tomorrow unless I hear
otherwise.

Index: share/man/man9/uvm_init.9
===================================================================
RCS file: /cvs/src/share/man/man9/uvm_init.9,v
retrieving revision 1.5
diff -u -p -r1.5 uvm_init.9
--- share/man/man9/uvm_init.9   21 May 2023 05:11:38 -0000      1.5
+++ share/man/man9/uvm_init.9   20 Jun 2023 15:20:59 -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 *"
 .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.
+function periodically recomputes the load average.
 .Pp
 The
 .Fn uvm_sysctl
Index: sys/kern/sched_bsd.c
===================================================================
RCS file: /cvs/src/sys/kern/sched_bsd.c,v
retrieving revision 1.74
diff -u -p -r1.74 sched_bsd.c
--- sys/kern/sched_bsd.c        4 Feb 2023 19:33:03 -0000       1.74
+++ sys/kern/sched_bsd.c        20 Jun 2023 15:20:59 -0000
@@ -234,7 +234,6 @@ schedcpu(void *arg)
                }
                SCHED_UNLOCK(s);
        }
-       uvm_meter();
        wakeup(&lbolt);
        timeout_add_sec(to, 1);
 }
@@ -669,6 +668,7 @@ scheduler_start(void)
 
        rrticks_init = hz / 10;
        schedcpu(&schedcpu_to);
+       uvm_meter(NULL);
 
 #ifndef SMALL_KERNEL
        if (perfpolicy == PERFPOL_AUTO)
Index: sys/uvm/uvm_meter.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_meter.c,v
retrieving revision 1.42
diff -u -p -r1.42 uvm_meter.c
--- sys/uvm/uvm_meter.c 28 Dec 2020 14:01:23 -0000      1.42
+++ sys/uvm/uvm_meter.c 20 Jun 2023 15:20:59 -0000
@@ -65,6 +65,9 @@
 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.
@@ -82,15 +85,13 @@ void uvm_total(struct vmtotal *);
 void uvmexp_read(struct uvmexp *);
 
 /*
- * uvm_meter: calculate load average and wake up the swapper (if needed)
+ * uvm_meter: recompute load averages
  */
 void
-uvm_meter(void)
+uvm_meter(void *unused)
 {
-       if ((gettime() % 5) == 0)
-               uvm_loadav(&averunnable);
-       if (proc0.p_slptime > (maxslp / 2))
-               wakeup(&proc0);
+       timeout_add_sec(&uvm_meter_to, UVM_METER_INTVL);
+       uvm_loadav(&averunnable);
 }
 
 /*
Index: sys/uvm/uvm_extern.h
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_extern.h,v
retrieving revision 1.168
diff -u -p -r1.168 uvm_extern.h
--- sys/uvm/uvm_extern.h        30 May 2023 08:30:01 -0000      1.168
+++ sys/uvm/uvm_extern.h        20 Jun 2023 15:20:59 -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 *,

Reply via email to