summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/transport/ChangeLog17
-rw-r--r--runtime/transport/Makefile2
-rw-r--r--runtime/transport/transport.c49
-rw-r--r--runtime/transport/transport.h9
4 files changed, 58 insertions, 19 deletions
diff --git a/runtime/transport/ChangeLog b/runtime/transport/ChangeLog
new file mode 100644
index 00000000..d76b4aa3
--- /dev/null
+++ b/runtime/transport/ChangeLog
@@ -0,0 +1,17 @@
+2005-05-16 Martin Hunt <hunt@redhat.com>
+
+ * transport.c (_stp_cmd_handler): For STP_EXIT, schedule a
+ work queue to do the exit functions.
+ (_stp_transport_close): Call work queue for STP_EXIT.
+ (_stp_transport_send): Call _stp_ctrl_send() like before, except
+ when in probe_exit(). In that case, keep retrying on send errors
+ until we succeed.
+
+ * transport.h (_stp_transport_write): Change to call
+ _stp_transport_send() for NETLINK_ONLY.
+
+ * Makefile (KDIR): set to /lib/modules/... instead of
+ /usr/local/src/...
+
+
+
diff --git a/runtime/transport/Makefile b/runtime/transport/Makefile
index 37268a2a..e27569be 100644
--- a/runtime/transport/Makefile
+++ b/runtime/transport/Makefile
@@ -1,7 +1,7 @@
# Makes stp-control.ko
PWD := $(shell pwd)
-KDIR := /usr/local/src/linux-$(shell uname -r)
+KDIR := /lib/modules/$(shell uname -r)/build include
stp-control-objs := control.o netlink.o
diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c
index 080469a2..7142237f 100644
--- a/runtime/transport/transport.c
+++ b/runtime/transport/transport.c
@@ -61,16 +61,29 @@ static void _stp_handle_subbufs_consumed(int pid, struct consumed_info *info)
relay_subbufs_consumed(t->chan, info->cpu, info->consumed);
}
-/**
- * _stp_handle_exit - handle exit command
- */
-static void _stp_handle_exit(int pid)
+int _stp_exit_called = 0;
+
+static int global_pid;
+static void stp_exit_helper (void *data);
+static DECLARE_WORK(stp_exit, stp_exit_helper, &global_pid);
+
+extern atomic_t _stp_transport_failures;
+static void stp_exit_helper (void *data)
{
- BUG_ON(!t);
- probe_exit();
- _stp_transport_flush();
- _stp_ctrl_send(STP_EXIT, __this_module.name,
- strlen(__this_module.name) + 1, pid);
+ int err, pid = *(int *)data;
+
+ if (_stp_exit_called == 0) {
+ _stp_exit_called = 1;
+ probe_exit();
+ _stp_transport_flush();
+ }
+
+ //printk("stp_handle_exit: sending STP_EXIT. pid=%d\n",(int)pid);
+ while ((err =_stp_ctrl_send(STP_EXIT, __this_module.name,
+ strlen(__this_module.name) + 1, pid)) < 0) {
+ //printk("stp_handle_exit: sent STP_EXIT. err=%d\n", err);
+ msleep (5);
+ }
}
/**
@@ -94,7 +107,7 @@ static int _stp_cmd_handler(int pid, int cmd, void *data)
_stp_handle_subbufs_consumed(pid, data);
break;
case STP_EXIT:
- _stp_handle_exit(pid);
+ schedule_work (&stp_exit);
break;
default:
err = -1;
@@ -119,9 +132,7 @@ void _stp_transport_close()
if (!_stp_streaming())
_stp_relayfs_close(t->chan, t->dir);
- /* in case the module has been manually removed */
- _stp_ctrl_send(STP_EXIT, __this_module.name,
- strlen(__this_module.name) + 1, t->pid);
+ schedule_work (&stp_exit);
kfree(t);
}
@@ -147,6 +158,7 @@ int _stp_transport_open(unsigned n_subbufs, unsigned subbuf_size, int pid)
return -ENOMEM;
t->pid = pid;
+ global_pid = pid;
_stp_ctrl_register(t->pid, _stp_cmd_handler);
if (_stp_streaming())
@@ -162,5 +174,16 @@ int _stp_transport_open(unsigned n_subbufs, unsigned subbuf_size, int pid)
return 0;
}
+int _stp_transport_send (int pid, void *data, int len)
+{
+ int err = _stp_ctrl_send(STP_REALTIME_DATA, data, len, pid);
+ if (err < 0 && _stp_exit_called) {
+ do {
+ msleep (5);
+ err = _stp_ctrl_send(STP_REALTIME_DATA, data, len, pid);
+ } while (err < 0);
+ }
+ return err;
+}
/** @} */
#endif /* _TRANSPORT_C_ */
diff --git a/runtime/transport/transport.h b/runtime/transport/transport.h
index 6e0550b3..a20ba8d8 100644
--- a/runtime/transport/transport.h
+++ b/runtime/transport/transport.h
@@ -31,6 +31,7 @@ struct consumed_info
unsigned consumed;
};
+
/**
* _stp_transport_write - write data to the transport
* @t: the transport struct
@@ -38,11 +39,9 @@ struct consumed_info
* @len: length of the data to send
*/
#ifdef STP_NETLINK_ONLY
-#define _stp_transport_write(t, data, len) \
- _stp_ctrl_send(STP_REALTIME_DATA, data, len, t->pid)
+#define _stp_transport_write(t, data, len) _stp_transport_send (t->pid, data, len)
#else
-#define _stp_transport_write(t, data, len) \
- relay_write(t->chan, data, len)
+#define _stp_transport_write(t, data, len) relay_write(t->chan, data, len)
#endif
/**
@@ -71,5 +70,5 @@ static inline void _stp_transport_flush(void)
extern int _stp_transport_open(unsigned n_subbufs, unsigned subbuf_size,
int pid);
extern void _stp_transport_close(void);
-
+extern int _stp_transport_send (int pid, void *data, int len);
#endif /* _TRANSPORT_TRANSPORT_H_ */