handle case for sched
[ana-net.git] / src / sd_rr.c
blobdc4ca20cf1d875eedf36350dbc7dceb346834a7b
1 /*
2 * Lightweight Autonomic Network Architecture
4 * Round robin scheduler.
6 * Copyright 2011 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
7 * Swiss federal institute of technology (ETH Zurich)
8 * Subject to the GPL.
9 */
11 #include <linux/module.h>
12 #include <linux/kernel.h>
13 #include <linux/cache.h>
14 #include <linux/cpumask.h>
16 #include "xt_sched.h"
17 #include "xt_engine.h"
19 static volatile unsigned long cpu = 0;
20 static unsigned long cpu_max;
22 static int ppe_rr_init(void)
24 cpu_max = num_online_cpus();
25 return 0;
28 static int ppe_rr_sched(struct sk_buff *skb, enum path_type dir)
30 #ifdef __HIGHPERF
31 unsigned long ncpu = cpu++ & (cpu_max - 1);
32 while (ncpu == USERSPACECPU)
33 ncpu = cpu++ & (cpu_max - 1);
34 enqueue_on_engine(skb, ncpu, dir);
35 #else
36 enqueue_on_engine(skb, cpu++ & (cpu_max - 1), dir);
37 #endif
38 return PPE_SUCCESS;
41 static struct ppesched_discipline_ops ppe_rr_ops __read_mostly = {
42 .discipline_init = ppe_rr_init,
43 .discipline_sched = ppe_rr_sched,
46 static struct ppesched_discipline ppe_rr __read_mostly = {
47 .name = "roundrobin",
48 .ops = &ppe_rr_ops,
49 .owner = THIS_MODULE,
52 static int __init init_ppe_rr_module(void)
54 return ppesched_discipline_register(&ppe_rr);
57 static void __exit cleanup_ppe_rr_module(void)
59 return ppesched_discipline_unregister(&ppe_rr);
62 module_init(init_ppe_rr_module);
63 module_exit(cleanup_ppe_rr_module);
65 MODULE_LICENSE("GPL");
66 MODULE_AUTHOR("Daniel Borkmann <dborkma@tik.ee.ethz.ch>");
67 MODULE_DESCRIPTION("LANA round robin scheduler");