Module Name: src
Committed By: riastradh
Date: Sun Dec 19 00:59:17 UTC 2021
Modified Files:
src/sys/external/bsd/drm2/include/linux: ratelimit.h
Log Message:
Kludge up <linux/ratelimit.h> with ppsratecheck.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/include/linux/ratelimit.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/include/linux/ratelimit.h
diff -u src/sys/external/bsd/drm2/include/linux/ratelimit.h:1.2 src/sys/external/bsd/drm2/include/linux/ratelimit.h:1.3
--- src/sys/external/bsd/drm2/include/linux/ratelimit.h:1.2 Tue Mar 18 18:20:43 2014
+++ src/sys/external/bsd/drm2/include/linux/ratelimit.h Sun Dec 19 00:59:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ratelimit.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $ */
+/* $NetBSD: ratelimit.h,v 1.3 2021/12/19 00:59:17 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -32,4 +32,46 @@
#ifndef _LINUX_RATELIMIT_H_
#define _LINUX_RATELIMIT_H_
+#include <sys/atomic.h>
+#include <sys/stdbool.h>
+#include <sys/time.h>
+
+struct linux_ratelimit {
+ volatile unsigned rl_lock;
+ struct timeval rl_lasttime;
+ int rl_curpps;
+ unsigned rl_maxpps;
+};
+
+/*
+ * XXX Assumes hz=100 so this works in static initializers, and/or
+ * hopes the caller just uses DEFAULT_RATELIMIT_INTERVAL and doesn't
+ * mention hz.
+ */
+#define DEFAULT_RATELIMIT_INTERVAL (5*100)
+#define DEFAULT_RATELIMIT_BURST 10
+
+#define DEFINE_RATELIMIT_STATE(n, i, b) \
+ struct linux_ratelimit n = { \
+ .rl_lock = 0, \
+ .rl_lasttime = { .tv_sec = 0, .tv_usec = 0 }, \
+ .rl_curpps = 0, \
+ .rl_maxpps = (b)/((i)/100), \
+ }
+
+static inline bool
+__ratelimit(struct linux_ratelimit *r)
+{
+ int ok;
+
+ if (atomic_cas_uint(&r->rl_lock, 0, 1))
+ return false;
+ membar_enter();
+ ok = ppsratecheck(&r->rl_lasttime, &r->rl_curpps, r->rl_maxpps);
+ membar_exit();
+ r->rl_lock = 0;
+
+ return ok;
+}
+
#endif /* _LINUX_RATELIMIT_H_ */