BNX2X: disables TPA
[akaros.git] / kern / src / taskqueue.c
1 /* Copyright (c) 2015 Google Inc
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Hacked BSD taskqueues.  In lieu of actually running a kproc or something that
6  * sleeps on a queue of tasks, we'll just blast out a kmsg.  We can always
7  * change the implementation if we need more control. */
8
9 #include <taskqueue.h>
10 #include <trap.h>
11 #include <kthread.h>
12
13 /* BSD Taskqueue wrappers. */
14 static void __tq_wrapper(uint32_t srcid, long a0, long a1, long a2)
15 {
16         task_fn_t tq_fn = (task_fn_t)a0;
17         void *tq_arg = (void*)a1;
18         tq_fn(tq_arg, 0);
19 }
20
21 int taskqueue_enqueue(struct taskqueue *queue, struct task *task)
22 {
23         send_kernel_message(core_id(), __tq_wrapper, (long)task->ta_func,
24                             (long)task->ta_context, 0, KMSG_ROUTINE);
25         return 0;
26 }
27
28
29 /* Linux workqueue wrappers */
30 void flush_workqueue(struct workqueue_struct *wq)
31 {
32 }
33
34 void destroy_workqueue(struct workqueue_struct *wq)
35 {
36 }
37
38 struct workqueue_struct *create_singlethread_workqueue(char *name)
39 {
40         /* Non-canonical addr on AMD64.  No one should be derefing this. */
41         return (void*)0xf0f0f0f0f0f0f0f0;
42 }
43
44 static void __wq_wrapper(uint32_t srcid, long a0, long a1, long a2)
45 {
46         struct work_struct *work = (struct work_struct*)a0;
47         work->func(work);
48 }
49
50 static void __wq_wrapper_delay(uint32_t srcid, long a0, long a1, long a2)
51 {
52         struct work_struct *work = (struct work_struct*)a0;
53         unsigned long delay = (unsigned long)a1;
54         kthread_usleep(delay * 10000);
55         work->func(work);
56 }
57
58 static void send_work(int coreid, struct work_struct *work)
59 {
60         send_kernel_message(coreid, __wq_wrapper, (long)work, 0, 0, KMSG_ROUTINE);
61 }
62
63 static void send_work_delay(int coreid, struct delayed_work *work,
64                             unsigned long delay)
65 {
66         send_kernel_message(coreid, __wq_wrapper_delay, (long)work, (long)delay, 0,
67                             KMSG_ROUTINE);
68 }
69
70 bool queue_work(struct workqueue_struct *wq, struct work_struct *work)
71 {
72         send_work(core_id(), work);
73         return TRUE;
74 }
75
76 bool schedule_work(struct work_struct *work)
77 {
78         send_work(0, work);
79         return TRUE;
80 }
81
82 bool cancel_work(struct work_struct *dwork)
83 {
84         return FALSE;
85 }
86
87 bool cancel_work_sync(struct work_struct *dwork)
88 {
89         return FALSE;
90 }
91
92 bool queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork,
93                         unsigned long delay)
94 {
95         send_work_delay(core_id(), dwork, delay);
96         return TRUE;
97 }
98
99 bool schedule_delayed_work(struct delayed_work *dwork, unsigned long delay)
100 {
101         send_work_delay(0, dwork, delay);
102         return TRUE;
103 }
104
105 bool cancel_delayed_work(struct delayed_work *dwork)
106 {
107         return FALSE;
108 }
109
110 bool cancel_delayed_work_sync(struct delayed_work *dwork)
111 {
112         return FALSE;
113 }