From: Jason Baron <jbaron@redhat.com>
To: Joe Perches <joe@perches.com>
Cc: Bart Van Assche <bvanassche@acm.org>,
gregkh@suse.de, jim.cromie@gmail.com,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 11/11 re-post] dynamic_debug: use a single printk() to emit msgs
Date: Fri, 15 Jul 2011 15:59:03 -0400 [thread overview]
Message-ID: <20110715195903.GA7470@redhat.com> (raw)
In-Reply-To: <1310746580.7582.50.camel@Joe-Laptop>
On Fri, Jul 15, 2011 at 09:16:20AM -0700, Joe Perches wrote:
> X-Scanned-By: MIMEDefang 2.68 on 10.5.110.19
>
> On Fri, 2011-07-15 at 18:10 +0200, Bart Van Assche wrote:
> > On Fri, Jul 15, 2011 at 6:04 PM, Jason Baron <jbaron@redhat.com> wrote:
> > > yes, but that approach uses 'KERN_CONT'. The point of patch 11/11 is to get rid
> > > of KERN_CONT, which is racy.
> > I know. What I'm trying to explain is that since patch 11/11 modifies
> > dynamic_emit_prefix() such that it writes its output to a buffer there
> > is no longer a need to write into that buffer with a single snprintf()
> > call. Using multiple snprintf() calls is also fine. Hence it is
> > possible to eliminate the two temporary arrays (tid[] and lineno[])
> > from dynamic_emit_prefix() without reintroducing these races.
>
> Ah, just so. It's so easy to be narrow minded.
>
> Jason, you are going to do this yes?
>
Yes. ok here's Bart's suggestion as re-post. It looks much cleaner to
me...
thanks,
-Jason
We were using KERN_CONT to combine msgs with their prefix. However,
KERN_CONT is not smp safe, in the sense that it can interleave messages.
This interleaving can result in printks coming out at the wrong loglevel.
With the high frequency of printks, that dynamic debug can produce, this
is not desirable.
Thus, make dynamic_emit_prefix(), fill a char buf[64], instead
of doing a printk directly. If we enable printing out of
function, module, line, or pid info, they are placed in this
64 byte buffer. In my testing 64 bytes was enough size to fulfill
all requests. Even if its not, we can match up the printk itself
to see where its from, so to me this is no big deal.
Signed-off-by: Jason Baron <jbaron@redhat.com>
---
lib/dynamic_debug.c | 66 +++++++++++++++++++++------------------------------
1 files changed, 27 insertions(+), 39 deletions(-)
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 198d2af..1f11978 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -422,52 +422,46 @@ static int ddebug_exec_query(char *query_string)
return 0;
}
-static int dynamic_emit_prefix(const struct _ddebug *descriptor)
+#define PREFIX_SIZE 64
+#define LEFT(wrote) ((PREFIX_SIZE - wrote) > 0) ? (PREFIX_SIZE - wrote) : 0
+
+static char *dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
{
- char tid[sizeof(int) + sizeof(int)/2 + 4];
- char lineno[sizeof(int) + sizeof(int)/2];
+ int pos = 0;
- if (descriptor->flags & _DPRINTK_FLAGS_INCL_TID) {
+ pos += snprintf(buf + pos, LEFT(pos), "%s", KERN_DEBUG);
+ if (desc->flags & _DPRINTK_FLAGS_INCL_TID) {
if (in_interrupt())
- snprintf(tid, sizeof(tid), "%s", "<intr> ");
+ pos += snprintf(buf + pos, LEFT(pos), "%s ",
+ "<intr>");
else
- snprintf(tid, sizeof(tid), "[%d] ",
- task_pid_vnr(current));
- } else {
- tid[0] = 0;
+ pos += snprintf(buf + pos, LEFT(pos), "[%d] ",
+ task_pid_vnr(current));
}
+ if (desc->flags & _DPRINTK_FLAGS_INCL_MODNAME)
+ pos += snprintf(buf + pos, LEFT(pos), "%s:", desc->modname);
+ if (desc->flags & _DPRINTK_FLAGS_INCL_FUNCNAME)
+ pos += snprintf(buf + pos, LEFT(pos), "%s:", desc->function);
+ if (desc->flags & _DPRINTK_FLAGS_INCL_LINENO)
+ pos += snprintf(buf + pos, LEFT(pos), "%d ", desc->lineno);
- if (descriptor->flags & _DPRINTK_FLAGS_INCL_LINENO)
- snprintf(lineno, sizeof(lineno), "%d", descriptor->lineno);
- else
- lineno[0] = 0;
-
- return printk(KERN_DEBUG "%s%s%s%s%s%s",
- tid,
- (descriptor->flags & _DPRINTK_FLAGS_INCL_MODNAME) ?
- descriptor->modname : "",
- (descriptor->flags & _DPRINTK_FLAGS_INCL_MODNAME) ?
- ":" : "",
- (descriptor->flags & _DPRINTK_FLAGS_INCL_FUNCNAME) ?
- descriptor->function : "",
- (descriptor->flags & _DPRINTK_FLAGS_INCL_FUNCNAME) ?
- ":" : "",
- lineno);
+ return buf;
}
int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)
{
va_list args;
int res;
+ struct va_format vaf;
+ char buf[PREFIX_SIZE];
BUG_ON(!descriptor);
BUG_ON(!fmt);
va_start(args, fmt);
-
- res = dynamic_emit_prefix(descriptor);
- res += vprintk(fmt, args);
-
+ vaf.fmt = fmt;
+ vaf.va = &args;
+ res = printk("%s%pV", dynamic_emit_prefix(descriptor, buf), &vaf);
va_end(args);
return res;
@@ -480,18 +474,15 @@ int __dynamic_dev_dbg(struct _ddebug *descriptor,
struct va_format vaf;
va_list args;
int res;
+ char buf[PREFIX_SIZE];
BUG_ON(!descriptor);
BUG_ON(!fmt);
va_start(args, fmt);
-
vaf.fmt = fmt;
vaf.va = &args;
-
- res = dynamic_emit_prefix(descriptor);
- res += __dev_printk(KERN_CONT, dev, &vaf);
-
+ res = __dev_printk(dynamic_emit_prefix(descriptor, buf), dev, &vaf);
va_end(args);
return res;
@@ -504,18 +495,15 @@ int __dynamic_netdev_dbg(struct _ddebug *descriptor,
struct va_format vaf;
va_list args;
int res;
+ char buf[PREFIX_SIZE];
BUG_ON(!descriptor);
BUG_ON(!fmt);
va_start(args, fmt);
-
vaf.fmt = fmt;
vaf.va = &args;
-
- res = dynamic_emit_prefix(descriptor);
- res += __netdev_printk(KERN_CONT, dev, &vaf);
-
+ res = __netdev_printk(dynamic_emit_prefix(descriptor, buf), dev, &vaf);
va_end(args);
return res;
--
1.7.5.4
next prev parent reply other threads:[~2011-07-15 19:59 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-14 16:09 [PATCH 00/11] various fixes v2 Jason Baron
2011-07-14 16:09 ` [PATCH 01/11] dynamic_debug: Add __dynamic_dev_dbg Jason Baron
2011-07-14 16:09 ` [PATCH 02/11] dynamic_debug: Consolidate prefix output to single routine Jason Baron
2011-07-14 16:09 ` [PATCH 03/11] dynamic_debug: Remove uses of KERN_CONT in dynamic_emit_prefix Jason Baron
2011-07-15 10:04 ` Bart Van Assche
2011-07-15 15:07 ` Jason Baron
2011-07-15 15:54 ` Joe Perches
2011-07-14 16:09 ` [PATCH 04/11] dynamic_debug: Convert printks to pr_<level> Jason Baron
2011-07-14 16:09 ` [PATCH 05/11] dynamic_debug: remove unused control variables Jason Baron
2011-07-14 16:09 ` [PATCH 06/11] dynamic_debug: add Jason Baron as maintainer Jason Baron
2011-07-14 16:09 ` [PATCH 07/11] dynamic_debug: make netdev_dbg() call __netdev_printk() Jason Baron
2011-07-14 16:09 ` [PATCH 08/11] dynamic_debug: make netif_dbg() " Jason Baron
2011-07-14 16:09 ` [PATCH 09/11] dynamic_debug: consolidate repetitive struct _ddebug descriptor definitions Jason Baron
2011-07-14 16:09 ` [PATCH 10/11] dynamic_debug: remove num_enabled accounting Jason Baron
2011-07-14 16:09 ` [PATCH 11/11] dynamic_debug: use a single printk() to emit msgs Jason Baron
2011-07-15 6:41 ` Joe Perches
2011-07-15 10:05 ` Bart Van Assche
2011-07-15 15:48 ` Joe Perches
2011-07-15 15:57 ` Bart Van Assche
2011-07-15 16:04 ` Jason Baron
2011-07-15 16:10 ` Joe Perches
2011-07-15 16:10 ` Bart Van Assche
2011-07-15 16:16 ` Joe Perches
2011-07-15 19:59 ` Jason Baron [this message]
2011-07-15 23:46 ` [PATCH 11/11 re-post] " Joe Perches
2011-07-18 14:30 ` Jason Baron
2011-07-18 14:50 ` Joe Perches
2011-07-15 16:08 ` [PATCH 11/11] " Joe Perches
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=20110715195903.GA7470@redhat.com \
--to=jbaron@redhat.com \
--cc=bvanassche@acm.org \
--cc=gregkh@suse.de \
--cc=jim.cromie@gmail.com \
--cc=joe@perches.com \
--cc=linux-kernel@vger.kernel.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.