diff options
-rw-r--r-- | runtime/transport/ChangeLog | 17 | ||||
-rw-r--r-- | runtime/transport/Makefile | 2 | ||||
-rw-r--r-- | runtime/transport/transport.c | 49 | ||||
-rw-r--r-- | runtime/transport/transport.h | 9 |
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_ */ |