Statistics
| Branch: | Tag: | Revision:

root / xseg / drivers / kernel / xseg_posix.c @ 7ce25cf6

History | View | Annotate | Download (2.5 kB)

1 6e0a3771 Georgios D. Tsoukalas
/* xseg_posix.c
2 6e0a3771 Georgios D. Tsoukalas
 * kernel driver for posix peers
3 6e0a3771 Georgios D. Tsoukalas
 */
4 6e0a3771 Georgios D. Tsoukalas
5 6e0a3771 Georgios D. Tsoukalas
#include <linux/module.h>
6 6e0a3771 Georgios D. Tsoukalas
#include <linux/moduleparam.h>
7 6e0a3771 Georgios D. Tsoukalas
#include <linux/init.h>
8 6e0a3771 Georgios D. Tsoukalas
#include <linux/sched.h>
9 6e0a3771 Georgios D. Tsoukalas
#include <linux/kernel.h>
10 6e0a3771 Georgios D. Tsoukalas
#include <linux/slab.h>
11 6e0a3771 Georgios D. Tsoukalas
#include <linux/fs.h>
12 6e0a3771 Georgios D. Tsoukalas
#include <linux/errno.h>
13 6e0a3771 Georgios D. Tsoukalas
#include <linux/timer.h>
14 6e0a3771 Georgios D. Tsoukalas
#include <linux/types.h>
15 6e0a3771 Georgios D. Tsoukalas
#include <linux/vmalloc.h>
16 6e0a3771 Georgios D. Tsoukalas
#include <linux/genhd.h>
17 6e0a3771 Georgios D. Tsoukalas
#include <linux/blkdev.h>
18 6e0a3771 Georgios D. Tsoukalas
#include <linux/bio.h>
19 6e0a3771 Georgios D. Tsoukalas
#include <linux/device.h>
20 6e0a3771 Georgios D. Tsoukalas
#include <linux/completion.h>
21 6e0a3771 Georgios D. Tsoukalas
22 6e0a3771 Georgios D. Tsoukalas
MODULE_DESCRIPTION("xseg_posix");
23 6e0a3771 Georgios D. Tsoukalas
MODULE_AUTHOR("XSEG");
24 6e0a3771 Georgios D. Tsoukalas
MODULE_LICENSE("GPL");
25 6e0a3771 Georgios D. Tsoukalas
26 6e0a3771 Georgios D. Tsoukalas
static int posix_signal_init(void)
27 6e0a3771 Georgios D. Tsoukalas
{
28 6e0a3771 Georgios D. Tsoukalas
        return 0;
29 6e0a3771 Georgios D. Tsoukalas
}
30 6e0a3771 Georgios D. Tsoukalas
31 6e0a3771 Georgios D. Tsoukalas
static void posix_signal_quit(void)
32 6e0a3771 Georgios D. Tsoukalas
{
33 6e0a3771 Georgios D. Tsoukalas
        return;
34 6e0a3771 Georgios D. Tsoukalas
}
35 6e0a3771 Georgios D. Tsoukalas
36 6e0a3771 Georgios D. Tsoukalas
static int posix_prepare_wait(struct xseg *xseg, uint32_t portno)
37 6e0a3771 Georgios D. Tsoukalas
{
38 6e0a3771 Georgios D. Tsoukalas
        return -1;
39 6e0a3771 Georgios D. Tsoukalas
}
40 6e0a3771 Georgios D. Tsoukalas
41 6e0a3771 Georgios D. Tsoukalas
static int posix_cancel_wait(struct xseg *xseg, uint32_t portno)
42 6e0a3771 Georgios D. Tsoukalas
{
43 6e0a3771 Georgios D. Tsoukalas
        return -1;
44 6e0a3771 Georgios D. Tsoukalas
}
45 6e0a3771 Georgios D. Tsoukalas
46 6e0a3771 Georgios D. Tsoukalas
static int posix_wait_signal(struct xseg *xseg, uint32_t timeout)
47 6e0a3771 Georgios D. Tsoukalas
{
48 6e0a3771 Georgios D. Tsoukalas
        return -1;
49 6e0a3771 Georgios D. Tsoukalas
}
50 6e0a3771 Georgios D. Tsoukalas
51 6e0a3771 Georgios D. Tsoukalas
static int posix_signal(struct xseg *xseg, uint32_t portno)
52 6e0a3771 Georgios D. Tsoukalas
{
53 6e0a3771 Georgios D. Tsoukalas
        struct pid *pid;
54 6e0a3771 Georgios D. Tsoukalas
        struct xseg_port *port = &xseg->ports[portno];
55 6e0a3771 Georgios D. Tsoukalas
        struct task_struct *task;
56 6e0a3771 Georgios D. Tsoukalas
        int ret = -ENOENT;
57 6e0a3771 Georgios D. Tsoukalas
58 6e0a3771 Georgios D. Tsoukalas
        rcu_read_lock();
59 6e0a3771 Georgios D. Tsoukalas
        /* XXX Security: xseg peers can kill anyone */
60 6e0a3771 Georgios D. Tsoukalas
        pid = find_vpid((pid_t)port->waitcue);
61 6e0a3771 Georgios D. Tsoukalas
        if (!pid)
62 6e0a3771 Georgios D. Tsoukalas
                goto out;
63 6e0a3771 Georgios D. Tsoukalas
        task = pid_task(pid, PIDTYPE_PID);
64 6e0a3771 Georgios D. Tsoukalas
        if (!task)
65 6e0a3771 Georgios D. Tsoukalas
                goto out;
66 6e0a3771 Georgios D. Tsoukalas
67 6e0a3771 Georgios D. Tsoukalas
        ret = send_sig(SIGIO, task, 1);
68 6e0a3771 Georgios D. Tsoukalas
out:
69 6e0a3771 Georgios D. Tsoukalas
        rcu_read_unlock();
70 6e0a3771 Georgios D. Tsoukalas
        return ret;
71 6e0a3771 Georgios D. Tsoukalas
}
72 6e0a3771 Georgios D. Tsoukalas
73 6e0a3771 Georgios D. Tsoukalas
static void *posix_malloc(uint64_t size)
74 6e0a3771 Georgios D. Tsoukalas
{
75 6e0a3771 Georgios D. Tsoukalas
        return NULL;
76 6e0a3771 Georgios D. Tsoukalas
}
77 6e0a3771 Georgios D. Tsoukalas
78 6e0a3771 Georgios D. Tsoukalas
static void *posix_realloc(void *mem, uint64_t size)
79 6e0a3771 Georgios D. Tsoukalas
{
80 6e0a3771 Georgios D. Tsoukalas
        return NULL;
81 6e0a3771 Georgios D. Tsoukalas
}
82 6e0a3771 Georgios D. Tsoukalas
83 6e0a3771 Georgios D. Tsoukalas
static void posix_mfree(void *mem) { }
84 6e0a3771 Georgios D. Tsoukalas
85 6e0a3771 Georgios D. Tsoukalas
static struct xseg_peer xseg_peer_posix = {
86 6e0a3771 Georgios D. Tsoukalas
        /* xseg signal operations */
87 6e0a3771 Georgios D. Tsoukalas
        {
88 6e0a3771 Georgios D. Tsoukalas
                .signal_init = posix_signal_init,
89 6e0a3771 Georgios D. Tsoukalas
                .signal_quit = posix_signal_quit,
90 6e0a3771 Georgios D. Tsoukalas
                .cancel_wait = posix_cancel_wait,
91 6e0a3771 Georgios D. Tsoukalas
                .prepare_wait = posix_prepare_wait,
92 6e0a3771 Georgios D. Tsoukalas
                .wait_signal = posix_wait_signal,
93 6e0a3771 Georgios D. Tsoukalas
                .signal = posix_signal,
94 6e0a3771 Georgios D. Tsoukalas
                .malloc = posix_malloc,
95 6e0a3771 Georgios D. Tsoukalas
                .realloc = posix_realloc,
96 6e0a3771 Georgios D. Tsoukalas
                .mfree = posix_mfree
97 6e0a3771 Georgios D. Tsoukalas
        },
98 6e0a3771 Georgios D. Tsoukalas
        /* name */
99 6e0a3771 Georgios D. Tsoukalas
        "posix"
100 6e0a3771 Georgios D. Tsoukalas
};
101 6e0a3771 Georgios D. Tsoukalas
102 6e0a3771 Georgios D. Tsoukalas
static int posix_init(void)
103 6e0a3771 Georgios D. Tsoukalas
{
104 6e0a3771 Georgios D. Tsoukalas
        int r;
105 6e0a3771 Georgios D. Tsoukalas
106 6e0a3771 Georgios D. Tsoukalas
        XSEGLOG("registering xseg types");
107 6e0a3771 Georgios D. Tsoukalas
108 6e0a3771 Georgios D. Tsoukalas
        r = xseg_register_peer(&xseg_peer_posix);
109 6e0a3771 Georgios D. Tsoukalas
110 6e0a3771 Georgios D. Tsoukalas
        return r;
111 6e0a3771 Georgios D. Tsoukalas
}
112 6e0a3771 Georgios D. Tsoukalas
113 6e0a3771 Georgios D. Tsoukalas
static int posix_quit(void)
114 6e0a3771 Georgios D. Tsoukalas
{
115 6e0a3771 Georgios D. Tsoukalas
        xseg_unregister_peer(xseg_peer_posix.name);
116 6e0a3771 Georgios D. Tsoukalas
        return 0;
117 6e0a3771 Georgios D. Tsoukalas
}
118 6e0a3771 Georgios D. Tsoukalas
119 6e0a3771 Georgios D. Tsoukalas
/* *************************** */
120 6e0a3771 Georgios D. Tsoukalas
/* ** Module Initialization ** */
121 6e0a3771 Georgios D. Tsoukalas
/* *************************** */
122 6e0a3771 Georgios D. Tsoukalas
123 6e0a3771 Georgios D. Tsoukalas
static int __init xseg_posix_init(void)
124 6e0a3771 Georgios D. Tsoukalas
{
125 6e0a3771 Georgios D. Tsoukalas
        int ret = -ENOSYS;
126 6e0a3771 Georgios D. Tsoukalas
127 6e0a3771 Georgios D. Tsoukalas
        ret = posix_init();
128 6e0a3771 Georgios D. Tsoukalas
        if (ret)
129 6e0a3771 Georgios D. Tsoukalas
                goto out;
130 6e0a3771 Georgios D. Tsoukalas
131 6e0a3771 Georgios D. Tsoukalas
        XSEGLOG("initialization complete");
132 6e0a3771 Georgios D. Tsoukalas
out:
133 6e0a3771 Georgios D. Tsoukalas
        return ret;
134 6e0a3771 Georgios D. Tsoukalas
}
135 6e0a3771 Georgios D. Tsoukalas
136 6e0a3771 Georgios D. Tsoukalas
static void __exit xseg_posix_exit(void)
137 6e0a3771 Georgios D. Tsoukalas
{
138 6e0a3771 Georgios D. Tsoukalas
        posix_quit();
139 6e0a3771 Georgios D. Tsoukalas
}
140 6e0a3771 Georgios D. Tsoukalas
141 6e0a3771 Georgios D. Tsoukalas
module_init(xseg_posix_init);
142 6e0a3771 Georgios D. Tsoukalas
module_exit(xseg_posix_exit);