2 * Copyright (C) 2011 Mathieu Desnoyers (mathieu.desnoyers@efficios.com)
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
12 #ifdef CONFIG_KALLSYMS
14 #include <linux/kallsyms.h>
15 #include <linux/poll.h>
16 #include <linux/wait.h>
18 struct poll_table_entry
;
19 struct splice_pipe_desc
;
22 int (*pollwake_sym
)(wait_queue_t
*wait
, unsigned mode
, int sync
, void *key
);
24 struct poll_table_entry
*(*poll_get_entry_sym
)(struct poll_wqueues
*p
);
27 static void __pollwait_exclusive(struct file
*filp
,
28 wait_queue_head_t
*wait_address
,
31 struct poll_wqueues
*pwq
= container_of(p
, struct poll_wqueues
, pt
);
32 struct poll_table_entry
*entry
;
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");
42 pollwake_sym
= (void *) kallsyms_lookup_name("pollwake");
44 printk(KERN_WARNING
"LTTng: pollwake_sym symbol lookup failed.\n");
48 entry
= poll_get_entry_sym(pwq
);
54 entry
->wait_address
= wait_address
;
56 init_waitqueue_func_entry(&entry
->wait
, pollwake_sym
);
57 entry
->wait
.private = pwq
;
58 add_wait_queue_exclusive(wait_address
, &entry
->wait
);
61 void wrapper_pollwait_exclusive(struct file
*filp
,
62 wait_queue_head_t
*wait_address
,
66 __pollwait_exclusive(filp
, wait_address
, p
);
71 #include <linux/poll.h>
73 ssize_t
wrapper_pollwait_exclusive(struct file
*filp
,
74 wait_queue_head_t
*wait_address
,
77 return pollwait_exclusive(filp
, wait_address
, p
);
This page took 0.040044 seconds and 4 git commands to generate.