epoll timeout and syscall return types ...

epoll timeout and syscall return types ...

Post by Davide Libenz » Tue, 11 Feb 2003 23:50:11



Changes :

*) Timeout overflow check

*) Ceil()ing of ms->jif conversion

*) Syscalls return type int->long

- Davide

fs/eventpoll.c            |   20 +++++++++++---------
include/linux/eventpoll.h |    8 ++++----
2 files changed, 15 insertions, 13 deletions

diff -Nru linux-2.5.59.vanilla/fs/eventpoll.c linux-2.5.59.epoll/fs/eventpoll.c
--- linux-2.5.59.vanilla/fs/eventpoll.c Thu Jan 16 18:22:02 2003

                          struct epoll_event *events);
 static int ep_events_transfer(struct eventpoll *ep, struct epoll_event *events, int maxevents);
 static int ep_poll(struct eventpoll *ep, struct epoll_event *events, int maxevents,
-                  int timeout);
+                  long timeout);
 static int eventpollfs_delete_dentry(struct dentry *dentry);
 static struct inode *ep_eventpoll_inode(void);

  * file descriptors inside the epoll interface. It is the kernel part of
  * the userspace epoll_create(2).
  */
-asmlinkage int sys_epoll_create(int size)
+asmlinkage long sys_epoll_create(int size)
 {
        int error, fd;

  * file that enable the insertion/removal/change of file descriptors inside
  * the interest set. It rapresents the kernel part of the user spcae epoll_ctl(2).
  */
-asmlinkage int sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
+asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
 {
        int error;

  * Implement the event wait interface for the eventpoll file. It is the kernel
  * part of the user space epoll_wait(2).
  */
-asmlinkage int sys_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
-                             int timeout)
+asmlinkage long sys_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
+                              int timeout)
 {
        int error;

 static int ep_poll(struct eventpoll *ep, struct epoll_event *events, int maxevents,
-                  int timeout)
+                  long timeout)
 {
        int res, eavail;

        wait_queue_t wait;

        /*
-        * Calculate the timeout by checking for the "infinite" value ( -1 ).
-        * The passed timeout is in milliseconds, that why (t * HZ) / 1000.
+        * Calculate the timeout by checking for the "infinite" value ( -1 )
+        * and the overflow condition. The passed timeout is in milliseconds,
+        * that why (t * HZ) / 1000.
         */
-       jtimeout = timeout == -1 ? MAX_SCHEDULE_TIMEOUT: (timeout * HZ) / 1000;
+       jtimeout = timeout == -1 || timeout > (MAX_SCHEDULE_TIMEOUT - 1000) / HZ ?
+               MAX_SCHEDULE_TIMEOUT: (timeout * HZ + 999) / 1000;

 retry:
        write_lock_irqsave(&ep->lock, flags);
diff -Nru linux-2.5.59.vanilla/include/linux/eventpoll.h linux-2.5.59.epoll/include/linux/eventpoll.h
--- linux-2.5.59.vanilla/include/linux/eventpoll.h      Thu Jan 16 18:22:05 2003

 /* Kernel space functions implementing the user space "epoll" API */
-asmlinkage int sys_epoll_create(int size);
-asmlinkage int sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
-asmlinkage int sys_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
-                             int timeout);
+asmlinkage long sys_epoll_create(int size);
+asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
+asmlinkage long sys_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
+                              int timeout);

 /* Used to initialize the epoll bits inside the "struct file" */
 void eventpoll_init_file(struct file *file);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in

More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/