From: Borislav Petkov <bp@alien8.de>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Jiri Kosina <jkosina@suse.cz>,
Andrew Morton <akpm@linux-foundation.org>,
Mateusz Guzik <mguzik@redhat.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Steven Rostedt <rostedt@goodmis.org>,
LKML <linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@kernel.org>,
Mel Gorman <mgorman@suse.de>, Kay Sievers <kay@vrfy.org>
Subject: Re: [RFC PATCH] cmdline: Hide "debug" from /proc/cmdline
Date: Wed, 23 Apr 2014 22:44:11 +0200 [thread overview]
Message-ID: <20140423204411.GG25378@pd.tnic> (raw)
In-Reply-To: <20140423151507.GA31689@pd.tnic>
On Wed, Apr 23, 2014 at 05:15:07PM +0200, Borislav Petkov wrote:
> Ok, here's a dirty hack that issues ratelimit messages at release
> time. I probably should wrap it nicely in ratelimit_*() accessors
> instead of poking directly at ratelimit_state. Yeah, maybe a
> ratelimit_exit() wrapper which does all the fun automatically.
I.e., something like that:
---
fs/fat/inode.c | 2 +-
include/linux/ratelimit.h | 28 ++++++++++++++++++++++------
kernel/printk/printk.c | 32 ++++++++++++++++++++++----------
lib/ratelimit.c | 6 ++++--
4 files changed, 49 insertions(+), 19 deletions(-)
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index 0062da21dd8b..33550f4d6ae8 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -1277,7 +1277,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
sb->s_export_op = &fat_export_ops;
mutex_init(&sbi->nfs_build_inode_lock);
ratelimit_state_init(&sbi->ratelimit, DEFAULT_RATELIMIT_INTERVAL,
- DEFAULT_RATELIMIT_BURST);
+ DEFAULT_RATELIMIT_BURST, 0);
error = parse_options(sb, data, isvfat, silent, &debug, &sbi->options);
if (error)
diff --git a/include/linux/ratelimit.h b/include/linux/ratelimit.h
index 0a260d8a18bf..fb4cf72fcfc7 100644
--- a/include/linux/ratelimit.h
+++ b/include/linux/ratelimit.h
@@ -2,11 +2,15 @@
#define _LINUX_RATELIMIT_H
#include <linux/param.h>
+#include <linux/sched.h>
#include <linux/spinlock.h>
+
#define DEFAULT_RATELIMIT_INTERVAL (5 * HZ)
#define DEFAULT_RATELIMIT_BURST 10
+#define RATELIMIT_MSG_ON_RELEASE BIT(0)
+
struct ratelimit_state {
raw_spinlock_t lock; /* protect the state */
@@ -15,6 +19,7 @@ struct ratelimit_state {
int printed;
int missed;
unsigned long begin;
+ unsigned long flags;
};
#define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init) \
@@ -26,14 +31,25 @@ struct ratelimit_state {
}
static inline void ratelimit_state_init(struct ratelimit_state *rs,
- int interval, int burst)
+ int interval, int burst,
+ unsigned long flags)
{
+ memset(rs, 0, sizeof(*rs));
+
raw_spin_lock_init(&rs->lock);
- rs->interval = interval;
- rs->burst = burst;
- rs->printed = 0;
- rs->missed = 0;
- rs->begin = 0;
+ rs->interval = interval;
+ rs->burst = burst;
+ rs->flags = flags;
+}
+
+static inline void ratelimit_state_exit(struct ratelimit_state *rs)
+{
+ if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE))
+ return;
+
+ if (rs->missed)
+ printk(KERN_WARNING "%s: %d callbacks suppressed\n",
+ current->comm, rs->missed);
}
extern struct ratelimit_state printk_ratelimit_state;
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 5b5fdd8eeb75..195f7733e6bb 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -450,6 +450,7 @@ struct devkmsg_user {
u64 seq;
u32 idx;
enum log_flags prev;
+ struct ratelimit_state rs;
struct mutex lock;
char buf[8192];
};
@@ -461,11 +462,17 @@ static ssize_t devkmsg_writev(struct kiocb *iocb, const struct iovec *iv,
int i;
int level = default_message_loglevel;
int facility = 1; /* LOG_USER */
+ struct file *file = iocb->ki_filp;
+ struct devkmsg_user *user = file->private_data;
size_t len = iov_length(iv, count);
ssize_t ret = len;
- if (len > LOG_LINE_MAX)
+ if (!user || len > LOG_LINE_MAX)
return -EINVAL;
+
+ if (!___ratelimit(&user->rs, current->comm))
+ return ret;
+
buf = kmalloc(len+1, GFP_KERNEL);
if (buf == NULL)
return -ENOMEM;
@@ -696,21 +703,24 @@ static unsigned int devkmsg_poll(struct file *file, poll_table *wait)
static int devkmsg_open(struct inode *inode, struct file *file)
{
struct devkmsg_user *user;
- int err;
- /* write-only does not need any file context */
- if ((file->f_flags & O_ACCMODE) == O_WRONLY)
- return 0;
-
- err = check_syslog_permissions(SYSLOG_ACTION_READ_ALL,
- SYSLOG_FROM_READER);
- if (err)
- return err;
+ /* write-only does not need to check read permissions */
+ if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
+ int err = check_syslog_permissions(SYSLOG_ACTION_READ_ALL,
+ SYSLOG_FROM_READER);
+ if (err)
+ return err;
+ }
user = kmalloc(sizeof(struct devkmsg_user), GFP_KERNEL);
if (!user)
return -ENOMEM;
+ /* Configurable? */
+ ratelimit_state_init(&user->rs, DEFAULT_RATELIMIT_INTERVAL,
+ DEFAULT_RATELIMIT_BURST,
+ RATELIMIT_MSG_ON_RELEASE);
+
mutex_init(&user->lock);
raw_spin_lock_irq(&logbuf_lock);
@@ -729,6 +739,8 @@ static int devkmsg_release(struct inode *inode, struct file *file)
if (!user)
return 0;
+ ratelimit_state_exit(&user->rs);
+
mutex_destroy(&user->lock);
kfree(user);
return 0;
diff --git a/lib/ratelimit.c b/lib/ratelimit.c
index 40e03ea2a967..b4763cb10d8f 100644
--- a/lib/ratelimit.c
+++ b/lib/ratelimit.c
@@ -46,12 +46,14 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func)
rs->begin = jiffies;
if (time_is_before_jiffies(rs->begin + rs->interval)) {
- if (rs->missed)
+ if (rs->missed && !(rs->flags & RATELIMIT_MSG_ON_RELEASE))
printk(KERN_WARNING "%s: %d callbacks suppressed\n",
func, rs->missed);
rs->begin = 0;
rs->printed = 0;
- rs->missed = 0;
+
+ if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE))
+ rs->missed = 0;
}
if (rs->burst && rs->burst > rs->printed) {
rs->printed++;
--
1.9.0
--
Regards/Gruss,
Boris.
Sent from a fat crate under my desk. Formatting is fine.
--
next prev parent reply other threads:[~2014-04-23 20:44 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-23 15:15 [RFC PATCH] cmdline: Hide "debug" from /proc/cmdline Borislav Petkov
2014-04-23 20:44 ` Borislav Petkov [this message]
-- strict thread matches above, loose matches on Subject: below --
2014-04-02 18:42 Steven Rostedt
2014-04-02 18:57 ` Linus Torvalds
2014-04-02 19:04 ` Andrew Morton
2014-04-02 19:05 ` Borislav Petkov
2014-04-02 19:08 ` Randy Dunlap
2014-04-02 19:50 ` Thomas Gleixner
2014-04-02 20:05 ` Richard Weinberger
2014-04-02 20:43 ` Thomas Gleixner
2014-04-02 22:18 ` Greg KH
2014-04-02 19:08 ` Borislav Petkov
2014-04-02 19:33 ` Steven Rostedt
2014-04-02 22:12 ` Mateusz Guzik
2014-04-02 22:30 ` David Daney
2014-04-02 22:37 ` Greg KH
2014-04-02 23:13 ` Linus Torvalds
2014-04-02 23:23 ` Jiri Kosina
2014-04-02 23:28 ` Andrew Morton
2014-04-02 23:42 ` Linus Torvalds
2014-04-02 23:47 ` Jiri Kosina
2014-04-02 23:52 ` Linus Torvalds
2014-04-02 23:57 ` Jiri Kosina
2014-04-03 1:38 ` Steven Rostedt
2014-04-03 1:47 ` Linus Torvalds
2014-04-03 9:03 ` Borislav Petkov
2014-04-03 10:43 ` Joerg Roedel
2014-04-03 17:05 ` Theodore Ts'o
2014-04-03 17:09 ` H. Peter Anvin
2014-04-03 17:18 ` Theodore Ts'o
2014-04-03 19:19 ` H. Peter Anvin
2014-04-04 18:21 ` Andy Lutomirski
2014-04-04 18:32 ` Linus Torvalds
2014-04-04 18:57 ` Andy Lutomirski
2014-04-04 19:09 ` Linus Torvalds
2014-04-04 21:17 ` John Stoffel
2014-04-04 23:17 ` Greg Kroah-Hartman
2014-04-05 14:37 ` John Stoffel
2014-04-05 23:23 ` Theodore Ts'o
2014-04-04 18:42 ` Linus Torvalds
2014-04-04 18:51 ` Andrew Morton
2014-04-04 18:57 ` Linus Torvalds
2014-04-06 20:49 ` David Timothy Strauss
2014-05-06 9:38 ` Felipe Contreras
2014-04-04 19:44 ` Steven Rostedt
2014-04-04 20:17 ` Theodore Ts'o
2014-04-04 22:45 ` Alexei Starovoitov
2014-04-04 22:48 ` Linus Torvalds
2014-04-04 19:00 ` Andy Lutomirski
2014-04-03 11:23 ` Borislav Petkov
2014-04-03 11:38 ` Ingo Molnar
2014-04-15 7:26 ` Borislav Petkov
2014-04-03 10:34 ` Måns Rullgård
2014-04-03 11:03 ` Borislav Petkov
2014-04-06 17:19 ` One Thousand Gnomes
2014-05-06 9:47 ` Felipe Contreras
2014-04-02 23:47 ` Joe Perches
2014-04-02 23:31 ` Linus Torvalds
2014-04-03 11:25 ` Måns Rullgård
2014-04-03 15:17 ` Tim Bird
2014-04-03 18:06 ` Greg Kroah-Hartman
2014-05-06 9:35 ` Felipe Contreras
2014-04-07 4:54 ` Rusty Russell
2014-05-02 22:34 ` Andrew Morton
2014-05-05 2:17 ` Rusty Russell
2014-05-05 13:15 ` Randy Dunlap
2014-05-06 0:57 ` Rusty Russell
2014-05-19 8:06 ` Diego Viola
2014-05-19 8:11 ` Diego Viola
2014-05-19 14:40 ` Randy Dunlap
2014-05-20 1:26 ` Rusty Russell
2014-05-20 6:26 ` Diego Viola
2014-05-21 1:52 ` Rusty Russell
2014-04-03 0:49 ` Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140423204411.GG25378@pd.tnic \
--to=bp@alien8.de \
--cc=akpm@linux-foundation.org \
--cc=gregkh@linuxfoundation.org \
--cc=hpa@zytor.com \
--cc=jkosina@suse.cz \
--cc=kay@vrfy.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mgorman@suse.de \
--cc=mguzik@redhat.com \
--cc=mingo@kernel.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox