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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.