Hi,

We have one comment that locking for ratecheck(9) is missing.  In
all other places locking status of the struct timeval *lasttime
is unclear.

The easiest fix is a global mutex for all lasttime in ratecheck().
This covers the usual usecase of the function.

Same for ppsratecheck(9), lasttime and curpps are protected.

Remove a useless #if 1 while there.

ok?

bluhm


Index: kern/kern_malloc.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/kern_malloc.c,v
retrieving revision 1.146
diff -u -p -r1.146 kern_malloc.c
--- kern/kern_malloc.c  16 May 2021 15:10:20 -0000      1.146
+++ kern/kern_malloc.c  3 May 2022 21:51:21 -0000
@@ -188,7 +188,6 @@ malloc(size_t size, int type, int flags)
        if (size > 65535 * PAGE_SIZE) {
                if (flags & M_CANFAIL) {
 #ifndef SMALL_KERNEL
-                       /* XXX lock */
                        if (ratecheck(&malloc_lasterr, &malloc_errintvl))
                                printf("malloc(): allocation too large, "
                                    "type = %d, size = %lu\n", type, size);
Index: kern/kern_time.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/kern_time.c,v
retrieving revision 1.154
diff -u -p -r1.154 kern_time.c
--- kern/kern_time.c    18 Jun 2021 15:59:14 -0000      1.154
+++ kern/kern_time.c    3 May 2022 21:51:21 -0000
@@ -782,11 +782,13 @@ itimerdecr(struct itimerspec *itp, long 
 int
 ratecheck(struct timeval *lasttime, const struct timeval *mininterval)
 {
+       static struct mutex mtx = MUTEX_INITIALIZER(IPL_HIGH);
        struct timeval tv, delta;
        int rv = 0;
 
        getmicrouptime(&tv);
 
+       mtx_enter(&mtx);
        timersub(&tv, lasttime, &delta);
 
        /*
@@ -798,6 +800,7 @@ ratecheck(struct timeval *lasttime, cons
                *lasttime = tv;
                rv = 1;
        }
+       mtx_leave(&mtx);
 
        return (rv);
 }
@@ -808,11 +811,13 @@ ratecheck(struct timeval *lasttime, cons
 int
 ppsratecheck(struct timeval *lasttime, int *curpps, int maxpps)
 {
+       static struct mutex mtx = MUTEX_INITIALIZER(IPL_HIGH);
        struct timeval tv, delta;
        int rv;
 
        microuptime(&tv);
 
+       mtx_enter(&mtx);
        timersub(&tv, lasttime, &delta);
 
        /*
@@ -837,20 +842,11 @@ ppsratecheck(struct timeval *lasttime, i
        else
                rv = 0;
 
-#if 1 /*DIAGNOSTIC?*/
        /* be careful about wrap-around */
        if (*curpps + 1 > *curpps)
                *curpps = *curpps + 1;
-#else
-       /*
-        * assume that there's not too many calls to this function.
-        * not sure if the assumption holds, as it depends on *caller's*
-        * behavior, not the behavior of this function.
-        * IMHO it is wrong to make assumption on the caller's behavior,
-        * so the above #if is #if 1, not #ifdef DIAGNOSTIC.
-        */
-       *curpps = *curpps + 1;
-#endif
+
+       mtx_leave(&mtx);
 
        return (rv);
 }

Reply via email to