94142ff34f0f3db7739baa917c25d4e4b8ec4dda
[lttng-modules.git] / wrapper / poll.c
1 /*
2 * Copyright (C) 2011 Mathieu Desnoyers (mathieu.desnoyers@efficios.com)
3 *
4 * wrapper around poll_get_entry, implementing __pollwait with exclusive
5 * wakeups. Using KALLSYMS to get poll_get_entry address when available,
6 * else we need to have a kernel that exports this function to GPL
7 * modules.
8 *
9 * GPL v2 license.
10 */
11
12 #ifdef CONFIG_KALLSYMS
13
14 #include <linux/kallsyms.h>
15 #include <linux/poll.h>
16 #include <linux/wait.h>
17
18 struct poll_table_entry;
19 struct splice_pipe_desc;
20
21 static
22 int (*pollwake_sym)(wait_queue_t *wait, unsigned mode, int sync, void *key);
23 static
24 struct poll_table_entry *(*poll_get_entry_sym)(struct poll_wqueues *p);
25
26 /* Add a new entry */
27 static void __pollwait_exclusive(struct file *filp,
28 wait_queue_head_t *wait_address,
29 poll_table *p)
30 {
31 struct poll_wqueues *pwq = container_of(p, struct poll_wqueues, pt);
32 struct poll_table_entry *entry;
33
34 if (!poll_get_entry_sym)
35 poll_get_entry_sym = (void *) kallsyms_lookup_name("poll_get_entry");
36 if (!poll_get_entry_sym) {
37 printk(KERN_WARNING "LTTng: poll_get_entry_sym symbol lookup failed.\n");
38 return;
39 }
40
41 if (!pollwake_sym)
42 pollwake_sym = (void *) kallsyms_lookup_name("pollwake");
43 if (!pollwake_sym) {
44 printk(KERN_WARNING "LTTng: pollwake_sym symbol lookup failed.\n");
45 return;
46 }
47
48 entry = poll_get_entry_sym(pwq);
49
50 if (!entry)
51 return;
52 get_file(filp);
53 entry->filp = filp;
54 entry->wait_address = wait_address;
55 entry->key = p->key;
56 init_waitqueue_func_entry(&entry->wait, pollwake_sym);
57 entry->wait.private = pwq;
58 add_wait_queue_exclusive(wait_address, &entry->wait);
59 }
60
61 void wrapper_pollwait_exclusive(struct file *filp,
62 wait_queue_head_t *wait_address,
63 poll_table *p)
64
65 {
66 __pollwait_exclusive(filp, wait_address, p);
67 }
68
69 #else
70
71 #include <linux/poll.h>
72
73 ssize_t wrapper_pollwait_exclusive(struct file *filp,
74 wait_queue_head_t *wait_address,
75 poll_table *p)
76 {
77 return pollwait_exclusive(filp, wait_address, p);
78 }
79
80 #endif
This page took 0.061836 seconds and 3 git commands to generate.