Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Mar 2017 10:48:10 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r315856 - in head/sys/compat/linuxkpi/common: include/linux src
Message-ID:  <201703231048.v2NAmAFU056867@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201703231048.v2NAmAFU056867>