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

Reply via email to