Commit 1f688548 authored by Manfred Spraul's avatar Manfred Spraul Committed by Linus Torvalds

[PATCH] additional cleanup for f_op->poll

This splits poll_table into one structure used by f_op->poll and one
structure used by the implemenation of sys_poll/sys_select: poll_table
contains just the callback function pointer.  struct poll_wrapper
additionally contains err and table, i.e.  the members used by the poll
implementation.

Changes:
- split poll_table into 2 structures
- reorder the declarations in <linux/poll.h> accordingly
- uninline poll_initwait().
parent 5f4eb633
......@@ -651,10 +651,11 @@ int timod_getmsg(unsigned int fd, char *ctl_buf, int ctl_maxlen, s32 *ctl_len,
SOLD("LISTEN done");
}
if (!(filp->f_flags & O_NONBLOCK)) {
poll_table wait_table, *wait;
struct poll_wqueues wait_table;
poll_table *wait;
poll_initwait(&wait_table);
wait = &wait_table;
wait = &wait_table.pt;
for(;;) {
SOLD("loop");
set_current_state(TASK_INTERRUPTIBLE);
......
......@@ -853,7 +853,7 @@ static int ep_insert(struct eventpoll *ep, struct pollfd *pfd, struct file *tfil
/* Initialize the poll table using the queue callback */
epq.dpi = dpi;
poll_initwait_ex(&epq.pt, ep_ptable_queue_proc, NULL);
init_poll_funcptr(&epq.pt, ep_ptable_queue_proc);
/*
* Attach the item to the poll hooks and get current event bits.
......@@ -862,8 +862,6 @@ static int ep_insert(struct eventpoll *ep, struct pollfd *pfd, struct file *tfil
*/
revents = tfile->f_op->poll(tfile, &epq.pt);
poll_freewait(&epq.pt);
/* We have to drop the new item inside our item list to keep track of it */
write_lock_irqsave(&ep->lock, flags);
......
......@@ -53,10 +53,18 @@ struct poll_table_page {
* as all select/poll functions have to call it to add an entry to the
* poll table.
*/
void __pollwait(struct file *filp, wait_queue_head_t *wait_address, poll_table *p);
void __pollfreewait(poll_table* pt)
void poll_initwait(struct poll_wqueues *pwq)
{
struct poll_table_page * p = pt->table;
init_poll_funcptr(&pwq->pt, __pollwait);
pwq->error = 0;
pwq->table = NULL;
}
void poll_freewait(struct poll_wqueues *pwq)
{
struct poll_table_page * p = pwq->table;
while (p) {
struct poll_table_entry * entry;
struct poll_table_page *old;
......@@ -73,8 +81,9 @@ void __pollfreewait(poll_table* pt)
}
}
void __pollwait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
void __pollwait(struct file *filp, wait_queue_head_t *wait_address, poll_table *_p)
{
struct poll_wqueues *p = container_of(_p, struct poll_wqueues, pt);
struct poll_table_page *table = p->table;
if (!table || POLL_TABLE_FULL(table)) {
......@@ -165,7 +174,8 @@ static int max_select_fd(unsigned long n, fd_set_bits *fds)
int do_select(int n, fd_set_bits *fds, long *timeout)
{
poll_table table, *wait;
struct poll_wqueues table;
poll_table *wait;
int retval, i, off;
long __timeout = *timeout;
......@@ -178,7 +188,7 @@ int do_select(int n, fd_set_bits *fds, long *timeout)
n = retval;
poll_initwait(&table);
wait = &table;
wait = &table.pt;
if (!__timeout)
wait = NULL;
retval = 0;
......@@ -385,10 +395,10 @@ static void do_pollfd(unsigned int num, struct pollfd * fdpage,
}
static int do_poll(unsigned int nfds, unsigned int nchunks, unsigned int nleft,
struct pollfd *fds[], poll_table *wait, long timeout)
struct pollfd *fds[], struct poll_wqueues *wait, long timeout)
{
int count;
poll_table* pt = wait;
poll_table* pt = &wait->pt;
for (;;) {
unsigned int i;
......@@ -415,7 +425,7 @@ asmlinkage long sys_poll(struct pollfd * ufds, unsigned int nfds, long timeout)
{
int i, j, fdcount, err;
struct pollfd **fds;
poll_table table, *wait;
struct poll_wqueues table, *wait;
int nchunks, nleft;
/* Do a sanity check on nfds ... */
......
......@@ -10,49 +10,39 @@
#include <linux/mm.h>
#include <asm/uaccess.h>
struct poll_table_page;
struct poll_table_struct;
/*
* structures and helpers for f_op->poll implementations
*/
typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *);
typedef void (*poll_free_proc)(struct poll_table_struct *);
typedef struct poll_table_struct {
poll_queue_proc qproc;
poll_free_proc fproc;
int error;
struct poll_table_page * table;
} poll_table;
extern void __pollwait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p);
extern void __pollfreewait(poll_table* pt);
static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
{
if (p && wait_address)
p->qproc(filp, wait_address, p);
}
static inline void poll_initwait_ex(poll_table* pt, poll_queue_proc qproc, poll_free_proc fproc)
static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc)
{
pt->qproc = qproc;
pt->fproc = fproc;
pt->error = 0;
pt->table = NULL;
}
static inline void poll_initwait(poll_table* pt)
{
poll_initwait_ex(pt, __pollwait, __pollfreewait);
}
static inline void poll_freewait(poll_table* pt)
{
if (pt && pt->fproc)
pt->fproc(pt);
}
/*
* Structures and helpers for sys_poll/sys_poll
*/
struct poll_wqueues {
poll_table pt;
struct poll_table_page * table;
int error;
};
extern void poll_initwait(struct poll_wqueues *pwq);
extern void poll_freewait(struct poll_wqueues *pwq);
/*
* Scaleable version of the fd_set.
......
......@@ -269,8 +269,8 @@ EXPORT_SYMBOL(generic_fillattr);
EXPORT_SYMBOL(generic_file_llseek);
EXPORT_SYMBOL(remote_llseek);
EXPORT_SYMBOL(no_llseek);
EXPORT_SYMBOL(__pollwait);
EXPORT_SYMBOL(__pollfreewait);
EXPORT_SYMBOL(poll_initwait);
EXPORT_SYMBOL(poll_freewait);
EXPORT_SYMBOL(ROOT_DEV);
EXPORT_SYMBOL(find_get_page);
EXPORT_SYMBOL(find_lock_page);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment