diff --git a/init/demo.c b/init/demo.c new file mode 100644 index 0000000000000000000000000000000000000000..43649b5a96d8949c132d2556611bf17dbf13c235 --- /dev/null +++ b/init/demo.c @@ -0,0 +1,253 @@ + +/** + * This creates a number processing nodes in a processing network. + * Two special trackers are used for input and output. + */ + + +#include <kernel/kernel.h> +#include <kernel/kmem.h> +#include <kernel/kthread.h> + +#include <data_proc_task.h> +#include <data_proc_tracker.h> +#include <data_proc_net.h> + + +#define CRIT_LEVEL 10 + +#define OP_ADD 0x1234 +#define OP_SUB 0x1235 +#define OP_MUL 0x1236 + +#define STEPS 3 + + + +int op_output(unsigned long op_code, struct proc_task *t) +{ + ssize_t i; + ssize_t n; + + unsigned int *p = NULL; + + + n = pt_get_nmemb(t); + printk("OUT: op code %d, %d items\n", op_code, n); + + if (!n) + goto exit; + + + p = (unsigned int *) pt_get_data(t); + if (!p) + goto exit; + + + + for (i = 0; i < n; i++) { + printk("\t%d\n", p[i]); + } + +exit: + kfree(p); /* clean up our data buffer */ + + pt_destroy(t); + + return PN_TASK_SUCCESS; +} + + +int op_add(unsigned long op_code, struct proc_task *t) +{ + + ssize_t i; + ssize_t n; + + unsigned int *p; + + + n = pt_get_nmemb(t); + + if (!n) + return PN_TASK_SUCCESS; + + + p = (unsigned int *) pt_get_data(t); + + if (!p) /* we have elements but data is NULL, error*/ + return PN_TASK_DESTROY; + + printk("ADD: op code %d, %d items\n", op_code, n); + + for (i = 0; i < n; i++) { + p[i] += 10; + } + + + return PN_TASK_SUCCESS; +} + +int op_sub(unsigned long op_code, struct proc_task *t) +{ + + ssize_t i; + ssize_t n; + + unsigned int *p; + + + n = pt_get_nmemb(t); + + if (!n) + return PN_TASK_SUCCESS; + + + p = (unsigned int *) pt_get_data(t); + + if (!p) /* we have elements but data is NULL, error*/ + return PN_TASK_DESTROY; + + printk("SUB: op code %d, %d items\n", op_code, n); + + for (i = 0; i < n; i++) { + p[i] -= 2; + } + + + return PN_TASK_SUCCESS; +} + +int op_mul(unsigned long op_code, struct proc_task *t) +{ + + ssize_t i; + ssize_t n; + + unsigned int *p; + + + n = pt_get_nmemb(t); + + if (!n) + return PN_TASK_SUCCESS; + + + p = (unsigned int *) pt_get_data(t); + + if (!p) /* we have elements but data is NULL, error*/ + return PN_TASK_DESTROY; + + printk("MUL: op code %d, %d items\n", op_code, n); + + for (i = 0; i < n; i++) { + p[i] *= 3; + } + + + return PN_TASK_SUCCESS; +} + + +int pn_prepare_nodes(struct proc_net *pn) +{ + struct proc_tracker *pt; + + + /* create and add processing node trackers for the each operation */ + + pt = pt_track_create(op_add, OP_ADD, CRIT_LEVEL); + BUG_ON(!pt); + BUG_ON(pn_add_node(pn, pt)); + + pt = pt_track_create(op_sub, OP_SUB, CRIT_LEVEL); + BUG_ON(!pt); + BUG_ON(pn_add_node(pn, pt)); + + pt = pt_track_create(op_mul, OP_MUL, CRIT_LEVEL); + BUG_ON(!pt); + BUG_ON(pn_add_node(pn, pt)); + + BUG_ON(pn_create_output_node(pn, op_output)); + + return 0; +} + + + +void pn_new_input_task(struct proc_net *pn, size_t n) +{ + struct proc_task *t; + + static int seq; + + int i; + unsigned int *data; + + + t = pt_create(NULL, 0, STEPS, 0, seq++); + + BUG_ON(!t); + + BUG_ON(pt_add_step(t, OP_ADD, NULL)); + BUG_ON(pt_add_step(t, OP_SUB, NULL)); + BUG_ON(pt_add_step(t, OP_MUL, NULL)); + + + + data = kzalloc(sizeof(unsigned int) * n); + + for (i = 0; i < n; i++) + data[i] = i; + + pt_set_data(t, data, n * sizeof(unsigned int)); + pt_set_nmemb(t, n); + + + pn_input_task(pn, t); +} + + +int demo(void *p __attribute__((unused))) +{ + struct proc_net *pn; + + printk("DEMO STARTING\n"); + + pn = pn_create(); + + BUG_ON(!pn); + + pn_prepare_nodes(pn); + + + pn_new_input_task(pn, 5); + pn_new_input_task(pn, 0); + pn_new_input_task(pn, 3); + + pn_process_inputs(pn); + + while (pn_process_next(pn)); + + pn_process_outputs(pn); + + + printk("DEMO COMPLETE\n"); + + return 0; +} + + +void demo_start(void) +{ + struct task_struct *t; + + t = kthread_create(demo, NULL, KTHREAD_CPU_AFFINITY_NONE, "DEMO"); + + /* allocate 98% of the cpu */ + kthread_set_sched_edf(t, 100*1000, 99*1000, 98*1000); + + if (kthread_wake_up(t) < 0) + printk("---- IASW NOT SCHEDULABLE---\n"); +} + diff --git a/kernel/kthread.c b/kernel/kthread.c index c86697f0ec9b7478e047c0b0d0da67f0346ee8cf..113bbbd9519244da9f0c947602cd0bfd8aae40b7 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -100,7 +100,7 @@ int kthread_wake_up(struct task_struct *task) return -EINVAL; ret = sched_enqueue(task); - if(ret) + if (ret) return ret; flags = arch_local_irq_save(); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 0bc8ae5a653aa824cac5720a2335ea3711e62ca2..cbf692b93f9b55640b62584b092ccf7c001494f4 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -266,7 +266,9 @@ int sched_enqueue(struct task_struct *task) if (ret) return ret; - task->sched->enqueue_task(task); + ret = task->sched->enqueue_task(task); + if (ret) + return ret; return 0; }