Author: hselasky
Date: Thu Mar 23 10:48:10 2017
New Revision: 315856
URL: https://svnweb.freebsd.org/changeset/base/315856

Log:
  Add support for ratelimited printouts in the LinuxKPI.
  
  MFC after:            1 week
  Sponsored by:         Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/include/linux/device.h
  head/sys/compat/linuxkpi/common/include/linux/kernel.h
  head/sys/compat/linuxkpi/common/src/linux_compat.c

Modified: head/sys/compat/linuxkpi/common/include/linux/device.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/device.h      Thu Mar 23 
10:43:29 2017        (r315855)
+++ head/sys/compat/linuxkpi/common/include/linux/device.h      Thu Mar 23 
10:48:10 2017        (r315856)
@@ -144,6 +144,18 @@ show_class_attr_string(struct class *cla
 #define        dev_printk(lvl, dev, fmt, ...)                                  
\
            device_printf((dev)->bsddev, fmt, ##__VA_ARGS__)
 
+#define        dev_err_ratelimited(dev, ...) do {      \
+       static time_t __ratelimited;            \
+       if (linux_ratelimited(&__ratelimited))  \
+               dev_err(dev, __VA_ARGS__);      \
+} while (0)
+
+#define        dev_warn_ratelimited(dev, ...) do {     \
+       static time_t __ratelimited;            \
+       if (linux_ratelimited(&__ratelimited))  \
+               dev_warn(dev, __VA_ARGS__);     \
+} while (0)
+
 static inline void *
 dev_get_drvdata(const struct device *dev)
 {

Modified: head/sys/compat/linuxkpi/common/include/linux/kernel.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/kernel.h      Thu Mar 23 
10:43:29 2017        (r315855)
+++ head/sys/compat/linuxkpi/common/include/linux/kernel.h      Thu Mar 23 
10:48:10 2017        (r315856)
@@ -224,6 +224,11 @@ scnprintf(char *buf, size_t size, const 
        log_once(LOG_INFO, pr_fmt(fmt), ##__VA_ARGS__)
 #define pr_cont(fmt, ...) \
        printk(KERN_CONT fmt, ##__VA_ARGS__)
+#define        pr_warn_ratelimited(...) do {           \
+       static time_t __ratelimited;            \
+       if (linux_ratelimited(&__ratelimited))  \
+               pr_warning(__VA_ARGS__);        \
+} while (0)
 
 #ifndef WARN
 #define        WARN(condition, ...) ({                 \
@@ -331,4 +336,6 @@ abs64(int64_t x)
        return (x < 0 ? -x : x);
 }
 
+extern bool linux_ratelimited(time_t *);
+
 #endif /* _LINUX_KERNEL_H_ */

Modified: head/sys/compat/linuxkpi/common/src/linux_compat.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_compat.c  Thu Mar 23 10:43:29 
2017        (r315855)
+++ head/sys/compat/linuxkpi/common/src/linux_compat.c  Thu Mar 23 10:48:10 
2017        (r315856)
@@ -1484,6 +1484,20 @@ __unregister_chrdev(unsigned int major, 
 bool linux_cpu_has_clflush;
 #endif
 
+bool
+linux_ratelimited(time_t *ptime)
+{
+       /* make sure uptime is not zero by OR'ing bit 31 */
+       time_t curr = time_uptime | (1U << 31);
+
+       /* check if one or more seconds have passed */
+       if (*ptime != curr) {
+               *ptime = curr;
+               return (1);
+       }
+       return (0);
+}
+
 static void
 linux_compat_init(void *arg)
 {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to