]> sourceware.org Git - systemtap.git/commitdiff
2007-11-09 Masami Hiramatsu <mhiramat@redhat.com>
authorhiramatu <hiramatu>
Fri, 9 Nov 2007 18:12:06 +0000 (18:12 +0000)
committerhiramatu <hiramatu>
Fri, 9 Nov 2007 18:12:06 +0000 (18:12 +0000)
        PR3858
        * print.c: Add -DRELAY_HOST=<hostname> and -DRELAY_GUEST=<hostname>
        options support.
        (_stp_print_flush): Disable irqs if -DRELAY_* option is specified.
        * print_old.c: Export stp_print_flush to other modules if the
        -DRELAY_HOST option is specified.
        * print_new.c: Ditto.
        * transport.c (_stp_transport_init): Reduce relay buffer size to
        64KB*2 if -DRELAY_GUEST is specified.
        * systemtap.printf/sharedbuf.exp: New test for buffer sharing option.
        * systemtap.printf/sharedbuf.stp: Ditto.
        * systemtap.printf/hello.stp: Ditto.
        * systemtap.printf/hello2.stp: Ditto.

runtime/ChangeLog
runtime/print.c
runtime/print_new.c
runtime/print_old.c
runtime/transport/ChangeLog
runtime/transport/transport.c
testsuite/ChangeLog
testsuite/systemtap.printf/hello.stp [new file with mode: 0644]
testsuite/systemtap.printf/hello2.stp [new file with mode: 0644]
testsuite/systemtap.printf/sharedbuf.exp [new file with mode: 0644]
testsuite/systemtap.printf/sharedbuf.stp [new file with mode: 0644]

index 75272aa0662499b546613534e6d5a065e28219c4..e6079beab792dbbc684ac33e69212aa1d81397ab 100644 (file)
@@ -1,3 +1,13 @@
+2007-11-09  Masami Hiramatsu  <mhiramat@redhat.com>
+
+       PR3858
+       * print.c: Add -DRELAY_HOST=<hostname> and -DRELAY_GUEST=<hostname>
+       options support.
+       (_stp_print_flush): Disable irqs if -DRELAY_* option is specified.
+       * print_old.c: Export stp_print_flush to other modules if the
+       -DRELAY_HOST option is specified.
+       * print_new.c: Ditto.
+
 2007-10-25  Mike Mason <mmlnx@us.ibm.com>
 
        * stat-common.c: Allow histogram bucket elision to be turned off
index c100bbfed645e65ab627f8b796f38cd3ba917b19..326d67d576ed752d26c8eef08fdbda7460feb653 100644 (file)
@@ -72,6 +72,21 @@ void _stp_print_cleanup (void)
                free_percpu(Stp_lbuf);
 }
 
+#define __DEF_EXPORT_FN(fn, postfix) fn ## _ ## postfix
+#define DEF_EXPORT_FN(fn, postfix) __DEF_EXPORT_FN(fn, postfix)
+
+#if defined(RELAY_GUEST)
+#if defined(RELAY_HOST)
+        #error "Cannot specify both RELAY_HOST and RELAY_GUEST"
+#endif
+#define EXPORT_FN(fn) DEF_EXPORT_FN(fn, RELAY_GUEST)
+#elif defined(RELAY_HOST)
+#define EXPORT_FN(fn) DEF_EXPORT_FN(fn, RELAY_HOST)
+#else /* defined(RELAY_GUEST) || defined(RELAY_HOST) */
+#define EXPORT_FN(fn) fn
+#endif
+
+#if !defined(RELAY_GUEST)
 /* The relayfs API changed between 2.6.15 and 2.6.16. */
 /* Use the appropriate print flush function. */
 
@@ -80,6 +95,26 @@ void _stp_print_cleanup (void)
 #else
 #include "print_new.c"
 #endif
+#if defined(RELAY_HOST)
+EXPORT_SYMBOL_GPL(EXPORT_FN(stp_print_flush));
+#endif
+
+#endif /*!RELAY_GUEST*/
+
+#if defined(RELAY_GUEST) || defined(RELAY_HOST)
+/* Prohibit irqs to avoid racing on a relayfs */
+extern void EXPORT_FN(stp_print_flush) (_stp_pbuf *);
+static inline void _stp_print_flush(void)
+{
+       unsigned long flags;
+       local_irq_save(flags);
+       EXPORT_FN(stp_print_flush) (per_cpu_ptr(Stp_pbuf, smp_processor_id()));
+       local_irq_restore(flags);
+}
+#else
+#define _stp_print_flush() \
+       EXPORT_FN(stp_print_flush)(per_cpu_ptr(Stp_pbuf, smp_processor_id()))
+#endif
 
 #ifndef STP_MAXBINARYARGS
 #define STP_MAXBINARYARGS 127
index b34aad8a3361451ab2f016959ae4c2fc85e50b43..95a83a8d0d001ffd6738480fd4668eaa46a541d0 100644 (file)
@@ -17,9 +17,8 @@
  */
 spinlock_t _stp_print_lock = SPIN_LOCK_UNLOCKED;
 
-void _stp_print_flush (void)
+void EXPORT_FN(stp_print_flush) (_stp_pbuf *pb)
 {
-       _stp_pbuf *pb = per_cpu_ptr(Stp_pbuf, smp_processor_id());
        uint32_t len = pb->len;
 
        /* check to see if there is anything in the buffer */
index 401d1af1b3d6c0a4e803e0ee574a64dd318a9ed8..5ee050b517682e38570c778a5545fbd14aa785db 100644 (file)
@@ -16,9 +16,8 @@
  * @note Preemption must be disabled to use this.
  */
 
-void _stp_print_flush (void)
+void EXPORT_FN(stp_print_flush) (_stp_pbuf *pb)
 {
-       _stp_pbuf *pb = per_cpu_ptr(Stp_pbuf, smp_processor_id());
        uint32_t len = pb->len;
 
        /* check to see if there is anything in the buffer */
index ee34ef19dffad4dd3c7e004dae19bd85cb649876..263a6bf8c1a1be52f5220fb8aefc59ea8a31bd9b 100644 (file)
@@ -1,3 +1,9 @@
+2007-11-09  Masami Hiramatsu  <mhiramat@redhat.com>
+
+       PR3858
+       * transport.c (_stp_transport_init): Reduce relay buffer size to
+       64KB*2 if -DRELAY_GUEST is specified.
+
 2007-11-09  Martin Hunt  <hunt@redhat.com>
        PR 5281
        * transport.c (_stp_detach, _stp_attach): Call utt_set_overwrite()
index 9aa26b794778477ee7708c3abfdd60888f8a6d41..2904cf2fc8d4de8ca3483befa3e76be8b7f237ac 100644 (file)
@@ -249,6 +249,12 @@ int _stp_transport_init(void)
        _stp_uid = current->uid;
        _stp_gid = current->gid;
 
+#ifdef RELAY_GUEST
+        /* Guest scripts use relay only for reporting warnings and errors */
+        _stp_subbuf_size = 65536;
+        _stp_nsubbufs = 2;
+#endif
+
        if (_stp_bufsize) {
                unsigned size = _stp_bufsize * 1024 * 1024;
                _stp_subbuf_size = ((size >> 2) + 1) * 65536;
index 3d71c5a43091edfdebf8e0b4af45870f889a8d24..58f0cc134eee26c4a596d53927ed2c271002ccd9 100644 (file)
@@ -1,3 +1,11 @@
+2007-11-09  Masami Hiramatsu  <mhiramat@redhat.com>
+
+       PR3858
+       * systemtap.printf/sharedbuf.exp: New test for buffer sharing option.
+       * systemtap.printf/sharedbuf.stp: Ditto.
+       * systemtap.printf/hello.stp: Ditto.
+       * systemtap.printf/hello2.stp: Ditto.
+
 2007-10-25  Martin Hunt  <hunt@redhat.com>
 
        * systemtap.printf/printd.exp: New.
diff --git a/testsuite/systemtap.printf/hello.stp b/testsuite/systemtap.printf/hello.stp
new file mode 100644 (file)
index 0000000..c061322
--- /dev/null
@@ -0,0 +1,6 @@
+probe begin
+{
+       printf("Hello");
+       printf("World");
+       exit()
+}
diff --git a/testsuite/systemtap.printf/hello2.stp b/testsuite/systemtap.printf/hello2.stp
new file mode 100644 (file)
index 0000000..aa0798f
--- /dev/null
@@ -0,0 +1,7 @@
+probe begin
+{
+       print("Print");
+       log("Systemtap");
+       warn("warning");
+       exit()
+}
diff --git a/testsuite/systemtap.printf/sharedbuf.exp b/testsuite/systemtap.printf/sharedbuf.exp
new file mode 100644 (file)
index 0000000..6a18271
--- /dev/null
@@ -0,0 +1,62 @@
+# Simple test that systemtap can share the buffer with other scripts.
+set test "sharedbuf"
+set TEST_NAME "$subdir/$test"
+
+if {![installtest_p]} { untested $TEST_NAME; return }
+
+set c1 0
+set c2 0
+
+# Load a host script
+spawn stap $srcdir/$subdir/$test.stp -DRELAY_HOST=test1
+
+expect {
+       -timeout 120
+       "Host: begin\r\n" {
+               pass "shared buffer hosting"
+               # Run a guest script which uses printf.
+               if {[catch {exec stap $srcdir/$subdir/hello.stp -DRELAY_GUEST=test1} res]} {
+                       fail "shared buffer guest"
+                       print $res
+               } else {
+                       incr c1
+                       exp_continue
+               }
+       }
+       "HelloWorld" {
+               if {$c1 == 1} {incr c1}
+               # Run a guest script which uses print, log and warn.
+               if {[catch {exec stap $srcdir/$subdir/hello2.stp -DRELAY_GUEST=test1} res]} {
+                       # check that the guest outputs a warning message.
+                       if {$res == "WARNING: warning"} {
+                               xfail "shared buffer guest2"
+                               incr c2
+                               exp_continue
+                       } else {
+                               fail "shared buffer guest2"
+                       }
+               } else {
+                       kpass "shared buffer guest2"
+                       incr c2
+                       exp_continue
+               }
+       }
+       "PrintSystemtap" {
+               if {$c2 == 1} {incr c2}
+               # Run a guest script which tries to use nonexist buffer.
+               if {[catch {exec stap $srcdir/$subdir/hello.stp -DRELAY_GUEST=test2} res]} {
+                       xfail "nonexist buffer sharing"
+               } else {
+                       fail "nonexist buffer sharing"
+               }
+       }
+       eof {fail "shared buffer hosting. unexpected EOF" }
+}
+send "\003"
+if {$c1 == 2 && $c2 == 2} {
+       pass "buffer sharing"
+} else {
+       fail "buffer sharing ($c1, $c2)"
+}
+close
+wait
diff --git a/testsuite/systemtap.printf/sharedbuf.stp b/testsuite/systemtap.printf/sharedbuf.stp
new file mode 100644 (file)
index 0000000..270e6bd
--- /dev/null
@@ -0,0 +1,3 @@
+probe begin {
+       printf("Host: begin\n")
+}
This page took 0.038838 seconds and 5 git commands to generate.