From: Tom Zanussi <zanussi@comcast.net>
To: Martin Bligh <mbligh@google.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
prasad@linux.vnet.ibm.com,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Thomas Gleixner <tglx@linutronix.de>,
Mathieu Desnoyers <compudj@krystal.dyndns.org>,
Steven Rostedt <rostedt@goodmis.org>,
od@suse.com, "Frank Ch. Eigler" <fche@redhat.com>,
Andrew Morton <akpm@linux-foundation.org>,
hch@lst.de, David Wilder <dwilder@us.ibm.com>
Subject: [RFC PATCH 1/8] relay - Clean up relay_switch_subbuf() and make waking up consumers optional.
Date: Thu, 25 Sep 2008 01:07:18 -0500 [thread overview]
Message-ID: <1222322838.6435.56.camel@charm-linux> (raw)
In-Reply-To: <1222228215.7761.0.camel@charm-linux>
Clean up relay_switch_subbuf() and make waking up consumers optional.
Over time, relay_switch_subbuf() has accumulated some cruft - this
patch cleans it up and at the same time makes available some of it
available as common functions that any subbuf-switch implementor would
need (this is partially in preparation for the next patch, which makes
the subbuf-switch function completely replaceable). It also removes
the hard-coded reader wakeup and moves it into a replaceable callback
called notify_consumers(); this allows any given tracer to implement
consumer notification as it sees fit.
---
include/linux/relay.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++
kernel/relay.c | 43 +++++++++++++++++++++++------------------
2 files changed, 75 insertions(+), 19 deletions(-)
diff --git a/include/linux/relay.h b/include/linux/relay.h
index 953fc05..2242004 100644
--- a/include/linux/relay.h
+++ b/include/linux/relay.h
@@ -159,6 +159,15 @@ struct rchan_callbacks
* The callback should return 0 if successful, negative if not.
*/
int (*remove_buf_file)(struct dentry *dentry);
+
+ /*
+ * wakeup_readers - sub-buffer was switched, let readers know
+ * @buf: the channel buffer
+ *
+ * Called during sub-buffer switch. Users who don't want any
+ * wakeups should implement an empty version.
+ */
+ void (*wakeup_readers)(struct rchan_buf *buf);
};
/*
@@ -186,6 +195,48 @@ extern size_t relay_switch_subbuf(struct rchan_buf *buf,
size_t length);
/**
+ * relay_event_toobig - is event too big to fit in a sub-buffer?
+ * @buf: relay channel buffer
+ * @length: length of event
+ *
+ * Returns 1 if too big, 0 otherwise.
+ *
+ * switch_subbuf() helper function
+ */
+static inline int relay_event_toobig(struct rchan_buf *buf, size_t length)
+{
+ return length > buf->chan->subbuf_size;
+}
+
+/**
+ * relay_update_filesize - add to filesize of relay file
+ * @buf: relay channel buffer
+ * @length: length to add
+ *
+ * switch_subbuf() helper function
+ */
+static inline void relay_update_filesize(struct rchan_buf *buf, size_t length)
+{
+ if (buf->dentry)
+ buf->dentry->d_inode->i_size += length;
+ else
+ buf->early_bytes += length;
+
+ smp_mb();
+}
+
+/**
+ * relay_inc_produced - add 1 to buf->produced
+ * @buf: relay channel buffer
+ *
+ * switch_subbuf() helper function
+ */
+static inline void relay_inc_produced(struct rchan_buf *buf)
+{
+ buf->subbufs_produced++;
+}
+
+/**
* relay_write - write data into the channel
* @chan: relay channel
* @data: data to be written
diff --git a/kernel/relay.c b/kernel/relay.c
index 8d13a78..7d588fe 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -324,6 +324,21 @@ static int remove_buf_file_default_callback(struct dentry *dentry)
return -EINVAL;
}
+/*
+ * wakeup_readers() default callback.
+ */
+static void wakeup_readers_default_callback(struct rchan_buf *buf)
+{
+ if (waitqueue_active(&buf->read_wait))
+ /*
+ * Calling wake_up_interruptible() from here
+ * will deadlock if we happen to be logging
+ * from the scheduler (trying to re-grab
+ * rq->lock), so defer it.
+ */
+ __mod_timer(&buf->timer, jiffies + 1);
+}
+
/* relay channel default callbacks */
static struct rchan_callbacks default_channel_callbacks = {
.subbuf_start = subbuf_start_default_callback,
@@ -331,6 +346,7 @@ static struct rchan_callbacks default_channel_callbacks = {
.buf_unmapped = buf_unmapped_default_callback,
.create_buf_file = create_buf_file_default_callback,
.remove_buf_file = remove_buf_file_default_callback,
+ .wakeup_readers = wakeup_readers_default_callback,
};
/**
@@ -508,6 +524,8 @@ static void setup_callbacks(struct rchan *chan,
cb->create_buf_file = create_buf_file_default_callback;
if (!cb->remove_buf_file)
cb->remove_buf_file = remove_buf_file_default_callback;
+ if (!cb->wakeup_readers)
+ cb->wakeup_readers = wakeup_readers_default_callback;
chan->cb = cb;
}
@@ -726,30 +744,17 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)
void *old, *new;
size_t old_subbuf, new_subbuf;
- if (unlikely(length > buf->chan->subbuf_size))
+ if (unlikely(relay_event_toobig(buf, length)))
goto toobig;
if (buf->offset != buf->chan->subbuf_size + 1) {
buf->prev_padding = buf->chan->subbuf_size - buf->offset;
old_subbuf = buf->subbufs_produced % buf->chan->n_subbufs;
buf->padding[old_subbuf] = buf->prev_padding;
- buf->subbufs_produced++;
- if (buf->dentry)
- buf->dentry->d_inode->i_size +=
- buf->chan->subbuf_size -
- buf->padding[old_subbuf];
- else
- buf->early_bytes += buf->chan->subbuf_size -
- buf->padding[old_subbuf];
- smp_mb();
- if (waitqueue_active(&buf->read_wait))
- /*
- * Calling wake_up_interruptible() from here
- * will deadlock if we happen to be logging
- * from the scheduler (trying to re-grab
- * rq->lock), so defer it.
- */
- __mod_timer(&buf->timer, jiffies + 1);
+ relay_inc_produced(buf);
+ relay_update_filesize(buf, buf->chan->subbuf_size -
+ buf->padding[old_subbuf]);
+ buf->chan->cb->wakeup_readers(buf);
}
old = buf->data;
@@ -763,7 +768,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)
buf->data = new;
buf->padding[new_subbuf] = 0;
- if (unlikely(length + buf->offset > buf->chan->subbuf_size))
+ if (unlikely(relay_event_toobig(buf, length + buf->offset)))
goto toobig;
return length;
--
1.5.3.5
next prev parent reply other threads:[~2008-09-25 6:07 UTC|newest]
Thread overview: 125+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-19 21:33 Unified tracing buffer Martin Bligh
2008-09-19 21:42 ` Randy Dunlap
2008-09-19 21:57 ` Martin Bligh
2008-09-19 22:41 ` Olaf Dabrunz
2008-09-19 22:19 ` Martin Bligh
2008-09-20 8:10 ` Olaf Dabrunz
2008-09-20 8:29 ` Steven Rostedt
2008-09-20 11:40 ` Mathieu Desnoyers
2008-09-20 8:26 ` Steven Rostedt
2008-09-20 11:44 ` Mathieu Desnoyers
2008-09-19 22:28 ` Olaf Dabrunz
2008-09-19 22:09 ` Martin Bligh
2008-09-19 23:18 ` Frank Ch. Eigler
2008-09-20 8:50 ` Steven Rostedt
2008-09-20 13:37 ` Mathieu Desnoyers
2008-09-20 13:51 ` Steven Rostedt
2008-09-20 14:54 ` Steven Rostedt
2008-09-22 18:45 ` Mathieu Desnoyers
2008-09-22 21:39 ` Steven Rostedt
2008-09-23 3:27 ` Mathieu Desnoyers
2008-09-20 0:07 ` Peter Zijlstra
2008-09-22 14:07 ` K.Prasad
2008-09-22 14:45 ` Peter Zijlstra
2008-09-22 16:29 ` Martin Bligh
2008-09-22 16:36 ` Peter Zijlstra
2008-09-22 20:50 ` Masami Hiramatsu
2008-09-23 3:05 ` Mathieu Desnoyers
2008-09-23 2:49 ` Mathieu Desnoyers
2008-09-23 5:25 ` Tom Zanussi
2008-09-23 9:31 ` Peter Zijlstra
2008-09-23 18:13 ` Mathieu Desnoyers
2008-09-23 18:13 ` Mathieu Desnoyers
2008-09-23 18:33 ` Christoph Lameter
2008-09-23 18:33 ` Christoph Lameter
2008-09-23 18:56 ` Linus Torvalds
2008-09-23 18:56 ` Linus Torvalds
2008-09-23 13:50 ` Mathieu Desnoyers
2008-09-23 14:00 ` Martin Bligh
2008-09-23 17:55 ` K.Prasad
2008-09-23 18:27 ` Martin Bligh
2008-09-24 3:50 ` Tom Zanussi
2008-09-24 5:42 ` K.Prasad
2008-09-25 6:07 ` [RFC PATCH 0/8] current relay cleanup patchset Tom Zanussi
2008-09-25 6:07 ` Tom Zanussi [this message]
2008-09-25 6:07 ` [RFC PATCH 2/8] relay - Make the relay sub-buffer switch code replaceable Tom Zanussi
2008-09-25 6:07 ` [RFC PATCH 3/8] relay - Add channel flags to relay, remove global callback param Tom Zanussi
2008-09-25 6:07 ` [RFC PATCH 4/8] relay - Add reserved param to switch-subbuf, in preparation for non-pad write/reserve Tom Zanussi
2008-09-25 6:07 ` [RFC PATCH 5/8] relay - Map the first sub-buffer at the end of the buffer, for temporary convenience Tom Zanussi
2008-09-25 6:07 ` [RFC PATCH 6/8] relay - Replace relay_reserve/relay_write with non-padded versions Tom Zanussi
2008-09-25 6:07 ` [RFC PATCH 7/8] relay - Remove padding-related code from relay_read()/relay_splice_read() et al Tom Zanussi
2008-09-25 6:08 ` [RFC PATCH 8/8] relay - Clean up remaining padding-related junk Tom Zanussi
2008-09-23 5:27 ` [PATCH 1/3] relay - clean up subbuf switch Tom Zanussi
2008-09-23 20:15 ` Andrew Morton
2008-09-23 5:27 ` [PATCH 2/3] relay - make subbuf switch replaceable Tom Zanussi
2008-09-23 20:17 ` Andrew Morton
2008-09-23 5:27 ` [PATCH 3/3] relay - add channel flags Tom Zanussi
2008-09-23 20:20 ` Andrew Morton
2008-09-24 3:57 ` Tom Zanussi
2008-09-20 0:26 ` Unified tracing buffer Marcel Holtmann
2008-09-20 9:03 ` Steven Rostedt
2008-09-20 13:55 ` Mathieu Desnoyers
2008-09-20 14:12 ` Arjan van de Ven
2008-09-22 18:52 ` Mathieu Desnoyers
2008-10-02 15:28 ` Jason Baron
2008-10-03 16:11 ` Mathieu Desnoyers
2008-10-03 18:37 ` Jason Baron
2008-10-03 19:10 ` Mathieu Desnoyers
2008-10-03 19:25 ` Jason Baron
2008-10-03 19:56 ` Mathieu Desnoyers
2008-10-03 20:25 ` Jason Baron
2008-10-03 21:52 ` Frank Ch. Eigler
2008-09-22 3:09 ` KOSAKI Motohiro
2008-09-22 9:57 ` Peter Zijlstra
2008-09-23 2:36 ` Mathieu Desnoyers
2008-09-22 13:57 ` K.Prasad
2008-09-22 19:45 ` Masami Hiramatsu
2008-09-22 20:13 ` Martin Bligh
2008-09-22 22:25 ` Masami Hiramatsu
2008-09-22 23:11 ` Darren Hart
2008-09-23 0:04 ` Masami Hiramatsu
2008-09-22 23:16 ` Martin Bligh
2008-09-23 0:05 ` Masami Hiramatsu
2008-09-23 0:12 ` Martin Bligh
2008-09-23 14:49 ` Masami Hiramatsu
2008-09-23 15:04 ` Mathieu Desnoyers
2008-09-23 15:30 ` Masami Hiramatsu
2008-09-23 16:01 ` Linus Torvalds
2008-09-23 17:04 ` Masami Hiramatsu
2008-09-23 17:30 ` Thomas Gleixner
2008-09-23 18:59 ` Masami Hiramatsu
2008-09-23 19:36 ` Thomas Gleixner
2008-09-23 19:38 ` Martin Bligh
2008-09-23 19:41 ` Thomas Gleixner
2008-09-23 19:50 ` Martin Bligh
2008-09-23 20:03 ` Thomas Gleixner
2008-09-23 21:02 ` Martin Bligh
2008-09-23 20:03 ` Masami Hiramatsu
2008-09-23 20:08 ` Thomas Gleixner
2008-09-23 15:46 ` Linus Torvalds
2008-09-23 0:39 ` Linus Torvalds
2008-09-23 1:26 ` Roland Dreier
2008-09-23 1:39 ` Steven Rostedt
2008-09-23 2:02 ` Mathieu Desnoyers
2008-09-23 2:26 ` Darren Hart
2008-09-23 2:31 ` Mathieu Desnoyers
2008-09-23 3:26 ` Linus Torvalds
2008-09-23 3:36 ` Mathieu Desnoyers
2008-09-23 4:05 ` Linus Torvalds
2008-09-23 3:43 ` Steven Rostedt
2008-09-23 4:10 ` Masami Hiramatsu
2008-09-23 4:17 ` Martin Bligh
2008-09-23 15:23 ` Masami Hiramatsu
2008-09-23 10:53 ` Steven Rostedt
2008-09-23 4:19 ` Linus Torvalds
2008-09-23 14:12 ` Mathieu Desnoyers
2008-09-23 2:30 ` Mathieu Desnoyers
2008-09-23 3:06 ` Masami Hiramatsu
2008-09-23 14:36 ` KOSAKI Motohiro
2008-09-23 15:02 ` Frank Ch. Eigler
2008-09-23 15:21 ` Masami Hiramatsu
2008-09-23 17:59 ` KOSAKI Motohiro
2008-09-23 18:28 ` Martin Bligh
2008-09-23 3:33 ` Andi Kleen
2008-09-23 3:47 ` Martin Bligh
2008-09-23 5:04 ` Andi Kleen
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=1222322838.6435.56.camel@charm-linux \
--to=zanussi@comcast.net \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=compudj@krystal.dyndns.org \
--cc=dwilder@us.ibm.com \
--cc=fche@redhat.com \
--cc=hch@lst.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mbligh@google.com \
--cc=od@suse.com \
--cc=prasad@linux.vnet.ibm.com \
--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.