summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfche <fche>2007-03-12 17:15:30 +0000
committerfche <fche>2007-03-12 17:15:30 +0000
commitcb43d90b37a7f9a066d56881b87067ef3254d95d (patch)
treebe93238d792dee6c1c1bf0f02a397cb8e48e984b
parent9b2f2790c0656bfa7cb7e1b4c09391a9e751d079 (diff)
downloadsystemtap-steved-cb43d90b37a7f9a066d56881b87067ef3254d95d.tar.gz
systemtap-steved-cb43d90b37a7f9a066d56881b87067ef3254d95d.tar.xz
systemtap-steved-cb43d90b37a7f9a066d56881b87067ef3254d95d.zip
2007-03-12 Frank Ch. Eigler <fche@redhat.com>
PR 4179. Based on patch from Vasily Averin <vvs@sw.ru>: * time.c (_stp_init_time): Recover from partial failures. 2007-03-12 Frank Ch. Eigler <fche@redhat.com> PR 4179. Based on patch from Vasily Averin <vvs@sw.ru>: * procfs.c (_stp_register_procfs): Recover from partial failures. * transport.c (_stp_transport_open): Ditto.
-rw-r--r--runtime/ChangeLog6
-rw-r--r--runtime/time.c3
-rw-r--r--runtime/transport/ChangeLog7
-rw-r--r--runtime/transport/procfs.c17
-rw-r--r--runtime/transport/transport.c32
5 files changed, 47 insertions, 18 deletions
diff --git a/runtime/ChangeLog b/runtime/ChangeLog
index f54c8998..56aa0add 100644
--- a/runtime/ChangeLog
+++ b/runtime/ChangeLog
@@ -1,3 +1,9 @@
+2007-03-12 Frank Ch. Eigler <fche@redhat.com>
+
+ PR 4179.
+ Based on patch from Vasily Averin <vvs@sw.ru>:
+ * time.c (_stp_init_time): Recover from partial failures.
+
2007-03-01 David Wilder <dwilder@us.ibm.com>
* loc2c-runtime.h: rewrote s390x version of __stp_put_asm
diff --git a/runtime/time.c b/runtime/time.c
index 7f9b5ffa..657b5e8c 100644
--- a/runtime/time.c
+++ b/runtime/time.c
@@ -212,7 +212,8 @@ _stp_init_time(void)
}
}
#endif
-
+ if (ret)
+ _stp_kill_time();
return ret;
}
diff --git a/runtime/transport/ChangeLog b/runtime/transport/ChangeLog
index e0c4f3d2..ff092a93 100644
--- a/runtime/transport/ChangeLog
+++ b/runtime/transport/ChangeLog
@@ -1,3 +1,10 @@
+2007-03-12 Frank Ch. Eigler <fche@redhat.com>
+
+ PR 4179.
+ Based on patch from Vasily Averin <vvs@sw.ru>:
+ * procfs.c (_stp_register_procfs): Recover from partial failures.
+ * transport.c (_stp_transport_open): Ditto.
+
2007-01-30 Martin Hunt <hunt@redhat.com>
* symbols.c: Comment out many debug lines.
diff --git a/runtime/transport/procfs.c b/runtime/transport/procfs.c
index 136c6d06..ca243035 100644
--- a/runtime/transport/procfs.c
+++ b/runtime/transport/procfs.c
@@ -1,7 +1,7 @@
/* -*- linux-c -*-
*
* /proc transport and control
- * Copyright (C) 2005, 2006, 2007 Red Hat Inc.
+ * Copyright (C) 2005-2007 Red Hat Inc.
*
* This file is part of systemtap, and is free software. You can
* redistribute it and/or modify it under the terms of the GNU General
@@ -318,7 +318,7 @@ static int _stp_register_procfs (void)
p = (struct list_head *)kmalloc(sizeof(struct _stp_buffer),STP_ALLOC_FLAGS);
// printk("allocated buffer at %lx\n", (long)p);
if (!p)
- goto err2;
+ goto err0;
_stp_allocated_net_memory += sizeof(struct _stp_buffer);
list_add (p, &_stp_pool_q);
}
@@ -368,12 +368,6 @@ static int _stp_register_procfs (void)
de->proc_fops = &_stp_proc_fops_cmd;
return 0;
-err2:
- list_for_each_safe(p, tmp, &_stp_pool_q) {
- list_del(p);
- kfree(p);
- }
-
err1:
#ifdef STP_RELAYFS
for (de = _stp_proc_mod->subdir; de; de = de->next)
@@ -388,6 +382,11 @@ err1:
#endif
remove_proc_entry (THIS_MODULE->name, _stp_proc_root);
err0:
+ list_for_each_safe(p, tmp, &_stp_pool_q) {
+ list_del(p);
+ kfree(p);
+ }
+
printk (KERN_ERR "Error creating systemtap /proc entries.\n");
return -1;
}
@@ -410,7 +409,7 @@ static void _stp_unregister_procfs (void)
}
#endif
remove_proc_entry ("cmd", _stp_proc_mod);
- remove_proc_entry (THIS_MODULE->name, _stp_proc_root);
+ remove_proc_entry (THIS_MODULE->name, _stp_proc_root); /* XXX: race condition */
/* free memory pools */
list_for_each_safe(p, tmp, &_stp_pool_q) {
diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c
index 5bd6eb16..de0e8c2d 100644
--- a/runtime/transport/transport.c
+++ b/runtime/transport/transport.c
@@ -2,7 +2,7 @@
* transport.c - stp transport functions
*
* Copyright (C) IBM Corporation, 2005
- * Copyright (C) Red Hat Inc, 2005, 2006
+ * Copyright (C) Red Hat Inc, 2005-2007
* Copyright (C) Intel Corporation, 2006
*
* This file is part of systemtap, and is free software. You can
@@ -315,25 +315,41 @@ int _stp_transport_open(struct _stp_transport_info *info)
*/
int _stp_transport_init(void)
{
+ int ret;
+
kbug("transport_init from %ld %ld\n", (long)_stp_pid, (long)current->pid);
/* create print buffers */
- if (_stp_print_init() < 0)
- return -1;
+ ret = _stp_print_init();
+ if (ret < 0)
+ goto out;
/* initialize timer code */
- if (_stp_init_time())
- return -1;
+ ret =_stp_init_time();
+ if (ret)
+ goto print_cleanup;
/* set up procfs communications */
- if (_stp_register_procfs() < 0)
- return -1;
+ ret = _stp_register_procfs();
+ if (ret < 0)
+ goto kill_time;
/* create workqueue of kernel threads */
_stp_wq = create_workqueue("systemtap");
+ if (!_stp_wq)
+ goto proc_cleanup;
queue_delayed_work(_stp_wq, &_stp_work, STP_WORK_TIMER);
+out:
+ return ret;
- return 0;
+proc_cleanup:
+ ret = -1;
+ _stp_unregister_procfs();
+kill_time:
+ _stp_kill_time();
+print_cleanup:
+ _stp_print_cleanup(); /* free print buffers */
+ goto out;
}