Module: xenomai-gch Branch: for-forge Commit: 23ce6f3502d36b32d65ac827e66a1c077aa48e36 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=23ce6f3502d36b32d65ac827e66a1c077aa48e36
Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org> Date: Thu Oct 1 02:10:29 2015 +0200 rtnet/rtcfg: adapt to RTDM task management changes Move timer tasks creation and deletion to RTPC callbacks called from secondary mode, ask rtdm_task_init/rtdm_task_destroy can no longer be called from primary mode. Remove useless calls to rtdm_task_join_nrt. --- .../drivers/net/stack/include/rtcfg/rtcfg_event.h | 3 ++ .../drivers/net/stack/rtcfg/rtcfg_client_event.c | 19 +++----- kernel/drivers/net/stack/rtcfg/rtcfg_event.c | 46 ++++++++++---------- kernel/drivers/net/stack/rtcfg/rtcfg_frame.c | 4 +- kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c | 32 ++++++++++++-- kernel/drivers/net/stack/rtcfg/rtcfg_timer.c | 15 ++++--- 6 files changed, 70 insertions(+), 49 deletions(-) diff --git a/kernel/drivers/net/stack/include/rtcfg/rtcfg_event.h b/kernel/drivers/net/stack/include/rtcfg/rtcfg_event.h index 44c9bbb..f34ddc5 100644 --- a/kernel/drivers/net/stack/include/rtcfg/rtcfg_event.h +++ b/kernel/drivers/net/stack/include/rtcfg/rtcfg_event.h @@ -117,4 +117,7 @@ void rtcfg_reset_device(int ifindex); void rtcfg_init_state_machines(void); void rtcfg_cleanup_state_machines(void); +int rtcfg_server_start_timer(int ifindex, long period); +void rtcfg_server_stop_timer(int ifindex); + #endif /* __RTCFG_EVENT_H_ */ diff --git a/kernel/drivers/net/stack/rtcfg/rtcfg_client_event.c b/kernel/drivers/net/stack/rtcfg/rtcfg_client_event.c index 561fef2..a09b167 100644 --- a/kernel/drivers/net/stack/rtcfg/rtcfg_client_event.c +++ b/kernel/drivers/net/stack/rtcfg/rtcfg_client_event.c @@ -39,7 +39,6 @@ static int rtcfg_client_recv_ready(int ifindex, struct rtskb *rtskb); static void rtcfg_client_recv_dead_station(int ifindex, struct rtskb *rtskb); static void rtcfg_client_update_server(int ifindex, struct rtskb *rtskb); - /*** Client States ***/ int rtcfg_main_state_client_0(int ifindex, RTCFG_EVENT event_id, @@ -547,11 +546,6 @@ static void rtcfg_client_detach(int ifindex, struct rt_proc_call *call) rtpc_complete_call(call, -ENODEV); } - if (rtcfg_dev->flags & FLAG_TIMER_STARTED) { - /* It's safe to kill the task, it either waits for dev_mutex or the - next period. */ - rtdm_task_destroy(&rtcfg_dev->timer_task); - } rtcfg_reset_device(ifindex); rtcfg_next_main_state(cmd_event->internal.data.ifindex, RTCFG_MAIN_OFF); @@ -879,13 +873,12 @@ static void rtcfg_client_recv_stage_2_cfg(int ifindex, struct rtskb *rtskb) __rtskb_pull(rtskb, sizeof(struct rtcfg_frm_stage_2_cfg)); if (stage_2_cfg->heartbeat_period) { - ret = rtdm_task_init(&rtcfg_dev->timer_task, "rtcfg-timer", - rtcfg_timer, (void *)(long)ifindex, - RTDM_TASK_LOWEST_PRIORITY, - (nanosecs_rel_t)ntohs(stage_2_cfg->heartbeat_period) * - 1000000); - if (ret < 0) - /*ERRMSG*/rtdm_printk("RTcfg: unable to create timer task\n"); + ret = rtdm_task_set_period(&rtcfg_dev->timer_task, + XN_INFINITE, + (nanosecs_rel_t) + ntohs(stage_2_cfg->heartbeat_period) * 1000000); + if (ret < 0) + /*ERRMSG*/rtdm_printk("RTcfg: unable to create timer task\n"); else rtcfg_dev->flags |= FLAG_TIMER_STARTED; } diff --git a/kernel/drivers/net/stack/rtcfg/rtcfg_event.c b/kernel/drivers/net/stack/rtcfg/rtcfg_event.c index f60fc52..c93bf12 100644 --- a/kernel/drivers/net/stack/rtcfg/rtcfg_event.c +++ b/kernel/drivers/net/stack/rtcfg/rtcfg_event.c @@ -107,8 +107,6 @@ static int rtcfg_server_recv_ack(int ifindex, struct rtskb *rtskb); static int rtcfg_server_recv_simple_frame(int ifindex, RTCFG_EVENT event_id, struct rtskb *rtskb); - - int rtcfg_do_main_event(int ifindex, RTCFG_EVENT event_id, void* event_data) { int main_state; @@ -141,23 +139,13 @@ static int rtcfg_main_state_off(int ifindex, RTCFG_EVENT event_id, struct rtcfg_device *rtcfg_dev = &device[ifindex]; struct rt_proc_call *call = (struct rt_proc_call *)event_data; struct rtcfg_cmd *cmd_event; - int ret; cmd_event = rtpc_get_priv(call, struct rtcfg_cmd); switch (event_id) { case RTCFG_CMD_SERVER: INIT_LIST_HEAD(&rtcfg_dev->spec.srv.conn_list); - ret = rtdm_task_init(&rtcfg_dev->timer_task, "rtcfg-timer", - rtcfg_timer, (void *)(long)ifindex, - RTDM_TASK_LOWEST_PRIORITY, - ((nanosecs_rel_t)cmd_event->args.server.period)*1000000); - if (ret < 0) { - rtdm_mutex_unlock(&rtcfg_dev->dev_mutex); - return ret; - } - - rtcfg_dev->flags = FLAG_TIMER_STARTED | + rtcfg_dev->flags = (cmd_event->args.server.flags & RTCFG_FLAG_READY); rtcfg_dev->burstrate = cmd_event->args.server.burstrate; @@ -200,7 +188,27 @@ static int rtcfg_main_state_off(int ifindex, RTCFG_EVENT event_id, return 0; } +int rtcfg_server_start_timer(int ifindex, long period) +{ + struct rtcfg_device *rtcfg_dev = &device[ifindex]; + int ret; + + ret = rtdm_task_init(&rtcfg_dev->timer_task, "rtcfg-timer", + rtcfg_timer, rtcfg_dev, + RTDM_TASK_LOWEST_PRIORITY, + (nanosecs_rel_t)period*1000000); + if (ret < 0) + rtcfg_server_detach(ifindex, NULL); + + return ret; +} + +void rtcfg_server_stop_timer(int ifindex) +{ + struct rtcfg_device *rtcfg_dev = &device[ifindex]; + rtdm_task_destroy(&rtcfg_dev->timer_task); +} /*** Server States ***/ @@ -482,11 +490,6 @@ static int rtcfg_server_detach(int ifindex, struct rtcfg_cmd *cmd_event) return -EAGAIN; } - if (rtcfg_dev->flags & FLAG_TIMER_STARTED) { - /* It's safe to kill the task, it either waits for dev_mutex or the - next period. */ - rtdm_task_destroy(&rtcfg_dev->timer_task); - } rtcfg_reset_device(ifindex); rtcfg_next_main_state(ifindex, RTCFG_MAIN_OFF); @@ -737,11 +740,8 @@ void rtcfg_cleanup_state_machines(void) for (i = 0; i < MAX_RT_DEVICES; i++) { rtcfg_dev = &device[i]; - if (rtcfg_dev->flags & FLAG_TIMER_STARTED) { - rtcfg_dev->flags |= FLAG_TIMER_SHUTDOWN; - rtdm_task_unblock(&rtcfg_dev->timer_task); - rtdm_task_join_nrt(&rtcfg_dev->timer_task, 100); - } + if (rtcfg_dev->state != RTCFG_MAIN_OFF) + rtdm_task_destroy(&rtcfg_dev->timer_task); rtdm_mutex_destroy(&rtcfg_dev->dev_mutex); diff --git a/kernel/drivers/net/stack/rtcfg/rtcfg_frame.c b/kernel/drivers/net/stack/rtcfg/rtcfg_frame.c index 4725a01..49513ae 100644 --- a/kernel/drivers/net/stack/rtcfg/rtcfg_frame.c +++ b/kernel/drivers/net/stack/rtcfg/rtcfg_frame.c @@ -557,7 +557,7 @@ int __init rtcfg_init_frames(void) error2: rtdm_event_destroy(&rx_event); - rtdm_task_join_nrt(&rx_task, 100); + rtdm_task_destroy(&rx_task); error1: rtskb_pool_release(&rtcfg_pool); @@ -575,7 +575,7 @@ void rtcfg_cleanup_frames(void) rtdev_remove_pack(&rtcfg_packet_type); rtdm_event_destroy(&rx_event); - rtdm_task_join_nrt(&rx_task, 100); + rtdm_task_destroy(&rx_task); while ((rtskb = rtskb_dequeue(&rx_queue)) != NULL) { kfree_rtskb(rtskb); diff --git a/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c b/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c index 16d5446..98a98cf 100644 --- a/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c +++ b/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c @@ -44,7 +44,21 @@ int rtcfg_event_handler(struct rt_proc_call *call) cmd_event->internal.data.event_id, call); } +void rtcfg_server_created(struct rt_proc_call *call, void *priv_data) +{ + struct rtcfg_cmd *cmd; + int res; + + cmd = rtpc_get_priv(call, struct rtcfg_cmd); + + res = rtpc_get_result(call); + if (res != 0) + return; + res = rtcfg_server_start_timer(cmd->internal.data.ifindex, + cmd->args.server.period); + rtpc_set_result(call, res); +} void keep_cmd_add(struct rt_proc_call *call, void *priv_data) { @@ -120,12 +134,21 @@ void copy_stage_1_data(struct rt_proc_call *call, void *priv_data) if (result <= 0) return; + result = rtcfg_server_start_timer(cmd->internal.data.ifindex, 5000); + if (result < 0) { + rtpc_set_result(call, result); + return; + } + cmd = rtpc_get_priv(call, struct rtcfg_cmd); - if (cmd->args.client.buffer_size < (size_t)result) + if (cmd->args.client.buffer_size < (size_t)result) { rtpc_set_result(call, -ENOSPC); - else if (copy_to_user(cmd->args.client.buffer, - cmd->args.client.rtskb->data, result) != 0) + return; + } + + if (copy_to_user(cmd->args.client.buffer, + cmd->args.client.rtskb->data, result) != 0) rtpc_set_result(call, -EFAULT); } @@ -197,6 +220,7 @@ void cleanup_cmd_detach(void *priv_data) struct rtcfg_cmd *cmd = (struct rtcfg_cmd *)priv_data; void *buf; + rtcfg_server_stop_timer(cmd->internal.data.ifindex); /* unlock proc and update directory structure */ rtcfg_unlockwr_proc(cmd->internal.data.ifindex); @@ -369,7 +393,7 @@ int rtcfg_ioctl(struct rtnet_device *rtdev, unsigned int request, unsigned long switch (request) { case RTCFG_IOC_SERVER: ret = rtpc_dispatch_call(rtcfg_event_handler, 0, &cmd, - sizeof(cmd), NULL, NULL); + sizeof(cmd), rtcfg_server_created, NULL); break; case RTCFG_IOC_ADD: diff --git a/kernel/drivers/net/stack/rtcfg/rtcfg_timer.c b/kernel/drivers/net/stack/rtcfg/rtcfg_timer.c index 5b9ab5d..73a40c5 100644 --- a/kernel/drivers/net/stack/rtcfg/rtcfg_timer.c +++ b/kernel/drivers/net/stack/rtcfg/rtcfg_timer.c @@ -32,19 +32,21 @@ #include <rtcfg/rtcfg_frame.h> -void rtcfg_timer(int ifindex) +void rtcfg_timer(void *arg) { - struct rtcfg_device *rtcfg_dev = &device[ifindex]; + struct rtcfg_device *rtcfg_dev = arg; struct list_head *entry; struct rtcfg_connection *conn; int last_stage_1 = -1; int burst_credit; + int ifindex = rtcfg_dev - device; int index; int ret; - while (!(rtcfg_dev->flags & FLAG_TIMER_SHUTDOWN)) { - rtdm_mutex_lock(&rtcfg_dev->dev_mutex); + while (!rtdm_task_should_stop()) { + + rtdm_mutex_lock(&rtcfg_dev->dev_mutex); if (rtcfg_dev->state == RTCFG_MAIN_SERVER_RUNNING) { index = 0; @@ -76,13 +78,12 @@ void rtcfg_timer(int ifindex) /* handle pointer overrun of the last stage 1 transmission */ if (last_stage_1 == (index-1)) last_stage_1 = -1; - } else if (rtcfg_dev->state == RTCFG_MAIN_CLIENT_READY) + } else if (rtcfg_dev->state == RTCFG_MAIN_CLIENT_READY + && (rtcfg_dev->flags & FLAG_TIMER_STARTED)) rtcfg_send_heartbeat(ifindex); rtdm_mutex_unlock(&rtcfg_dev->dev_mutex); rtdm_task_wait_period(NULL); } - - rtcfg_dev->flags &= ~FLAG_TIMER_STARTED; } _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://xenomai.org/mailman/listinfo/xenomai-git