summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortrz <trz>2005-10-14 21:53:51 +0000
committertrz <trz>2005-10-14 21:53:51 +0000
commit08b40d88c111a077b1069babb6a51a2b68aef1a6 (patch)
treefbfb0d0149af6afd4be71240d39918732e0ac0aa
parent20b1a57d555b30478e224eec7c358ee3f7c7a6e9 (diff)
downloadsystemtap-steved-08b40d88c111a077b1069babb6a51a2b68aef1a6.tar.gz
systemtap-steved-08b40d88c111a077b1069babb6a51a2b68aef1a6.tar.xz
systemtap-steved-08b40d88c111a077b1069babb6a51a2b68aef1a6.zip
Added #ifdef'ed support for kernels containing the recent relayfs API changes
-rw-r--r--runtime/transport/ChangeLog16
-rw-r--r--runtime/transport/procfs.c5
-rw-r--r--runtime/transport/relayfs.c33
-rw-r--r--runtime/transport/relayfs.h4
-rw-r--r--runtime/transport/transport.c6
5 files changed, 64 insertions, 0 deletions
diff --git a/runtime/transport/ChangeLog b/runtime/transport/ChangeLog
index 1c94b0e4..f2a8c54d 100644
--- a/runtime/transport/ChangeLog
+++ b/runtime/transport/ChangeLog
@@ -1,3 +1,19 @@
+2005-10-14 Tom Zanussi <zanussi@us.ibm.com>
+
+ * relayfs.h: Add ifdef'ed relayfs_fs.h include for mainline
+ relayfs version. If you're running a kernel with a version
+ of relayfs >= 4 (the version # can be found in
+ /include/linux/relayfs_fs.h) configured in, adding a
+ #define RELAYFS_VERSION_GE_4 at the top of transport/relayfs.h
+ will make systemtap use it instead of the packaged version.
+
+ * relayfs.c: Add ifdef'ed relayfs callback functions for
+ mainline relayfs version.
+ (_stp_relayfs_open): Add ifdef'ed code for mainline
+ relayfs version.
+ * procfs.c (_stp_proc_read): Ditto.
+ * transport.c (_handle_buf_info): Ditto.
+
2005-10-05 Tom Zanussi <zanussi@us.ibm.com>
* transport.c (_stp_transport_open): Add kbug message.
diff --git a/runtime/transport/procfs.c b/runtime/transport/procfs.c
index f22be8fa..7bba3033 100644
--- a/runtime/transport/procfs.c
+++ b/runtime/transport/procfs.c
@@ -31,8 +31,13 @@ _stp_proc_read (struct file *file, char __user *buf, size_t count, loff_t *ppos)
return -EINVAL;
out.cpu = cpu;
+#ifdef RELAYFS_VERSION_GE_4
+ out.produced = _stp_chan->buf[cpu]->subbufs_produced;
+ out.consumed = _stp_chan->buf[cpu]->subbufs_consumed;
+#else
out.produced = atomic_read(&_stp_chan->buf[cpu]->subbufs_produced);
out.consumed = atomic_read(&_stp_chan->buf[cpu]->subbufs_consumed);
+#endif /* RELAYFS_VERSION_GE_4 */
num = sizeof(out);
if (copy_to_user(buf, &out, num))
diff --git a/runtime/transport/relayfs.c b/runtime/transport/relayfs.c
index 181a130e..0754d320 100644
--- a/runtime/transport/relayfs.c
+++ b/runtime/transport/relayfs.c
@@ -20,6 +20,29 @@
#include "relayfs.h"
+#ifdef RELAYFS_VERSION_GE_4
+
+/**
+ * _stp_subbuf_start - subbuf_start() relayfs callback implementation
+ */
+static int _stp_subbuf_start(struct rchan_buf *buf,
+ void *subbuf,
+ void *prev_subbuf,
+ unsigned int prev_padding)
+{
+ if (relay_buf_full(buf))
+ return 0;
+
+ if (prev_subbuf)
+ *((unsigned *)prev_subbuf) = prev_padding;
+
+ subbuf_start_reserve(buf, sizeof(prev_padding));
+
+ return 1;
+}
+
+#else
+
/**
* _stp_subbuf_start - subbuf_start() relayfs callback implementation
*/
@@ -46,11 +69,15 @@ static void _stp_buf_full(struct rchan_buf *buf,
*((unsigned *)subbuf) = padding;
}
+#endif /* RELAYFS_VERSION_GE_4 */
+
/* relayfs callback functions */
static struct rchan_callbacks stp_rchan_callbacks =
{
.subbuf_start = _stp_subbuf_start,
+#ifndef RELAYFS_VERSION_GE_4
.buf_full = _stp_buf_full,
+#endif /* RELAYFS_VERSION_GE_4 */
};
/**
@@ -97,8 +124,14 @@ struct rchan *_stp_relayfs_open(unsigned n_subbufs,
return NULL;
}
+#ifdef RELAYFS_VERSION_GE_4
+ chan = relay_open("cpu", dir, subbuf_size,
+ n_subbufs, &stp_rchan_callbacks);
+#else
chan = relay_open("cpu", dir, subbuf_size,
n_subbufs, 0, &stp_rchan_callbacks);
+#endif /* RELAYFS_VERSION_GE_4 */
+
if (!chan) {
printk("STP: couldn't create relayfs channel.\n");
if (dir)
diff --git a/runtime/transport/relayfs.h b/runtime/transport/relayfs.h
index 2f30138c..5ca174e4 100644
--- a/runtime/transport/relayfs.h
+++ b/runtime/transport/relayfs.h
@@ -5,7 +5,11 @@
* @brief Header file for relayfs transport
*/
+#ifdef RELAYFS_VERSION_GE_4
#include <linux/relayfs_fs.h>
+#else
+#include "../relayfs/linux/relayfs_fs.h"
+#endif /* RELAYFS_VERSION_GE_4 */
struct rchan *_stp_relayfs_open(unsigned n_subbufs,
unsigned subbuf_size,
diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c
index e8d2112d..89c90c96 100644
--- a/runtime/transport/transport.c
+++ b/runtime/transport/transport.c
@@ -75,9 +75,15 @@ int _stp_transport_write (void *data, int len)
static void _stp_handle_buf_info(int *cpuptr)
{
struct buf_info out;
+
out.cpu = *cpuptr;
+#ifdef RELAYFS_VERSION_GE_4
+ out.produced = _stp_chan->buf[*cpuptr]->subbufs_produced;
+ out.consumed = _stp_chan->buf[*cpuptr]->subbufs_consumed;
+#else
out.produced = atomic_read(&_stp_chan->buf[*cpuptr]->subbufs_produced);
out.consumed = atomic_read(&_stp_chan->buf[*cpuptr]->subbufs_consumed);
+#endif /* RELAYFS_VERSION_GE_4 */
_stp_transport_send(STP_BUF_INFO, &out, sizeof(out));
}