mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 16:38:31 +00:00 
			
		
		
		
	 9fe5ad9c8c
			
		
	
	
		9fe5ad9c8c
		
	
	
	
	
		
			
			Remove the size parameter from the new epoll_create syscall and renames the
syscall itself.  The updated test program follows.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <fcntl.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sys/syscall.h>
#ifndef __NR_epoll_create2
# ifdef __x86_64__
#  define __NR_epoll_create2 291
# elif defined __i386__
#  define __NR_epoll_create2 329
# else
#  error "need __NR_epoll_create2"
# endif
#endif
#define EPOLL_CLOEXEC O_CLOEXEC
int
main (void)
{
  int fd = syscall (__NR_epoll_create2, 0);
  if (fd == -1)
    {
      puts ("epoll_create2(0) failed");
      return 1;
    }
  int coe = fcntl (fd, F_GETFD);
  if (coe == -1)
    {
      puts ("fcntl failed");
      return 1;
    }
  if (coe & FD_CLOEXEC)
    {
      puts ("epoll_create2(0) set close-on-exec flag");
      return 1;
    }
  close (fd);
  fd = syscall (__NR_epoll_create2, EPOLL_CLOEXEC);
  if (fd == -1)
    {
      puts ("epoll_create2(EPOLL_CLOEXEC) failed");
      return 1;
    }
  coe = fcntl (fd, F_GETFD);
  if (coe == -1)
    {
      puts ("fcntl failed");
      return 1;
    }
  if ((coe & FD_CLOEXEC) == 0)
    {
      puts ("epoll_create2(EPOLL_CLOEXEC) set close-on-exec flag");
      return 1;
    }
  close (fd);
  puts ("OK");
  return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Signed-off-by: Ulrich Drepper <drepper@redhat.com>
Acked-by: Davide Libenzi <davidel@xmailserver.org>
Cc: Michael Kerrisk <mtk.manpages@googlemail.com>
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
	
			
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  include/linux/eventpoll.h ( Efficent event polling implementation )
 | |
|  *  Copyright (C) 2001,...,2006	 Davide Libenzi
 | |
|  *
 | |
|  *  This program is free software; you can redistribute it and/or modify
 | |
|  *  it under the terms of the GNU General Public License as published by
 | |
|  *  the Free Software Foundation; either version 2 of the License, or
 | |
|  *  (at your option) any later version.
 | |
|  *
 | |
|  *  Davide Libenzi <davidel@xmailserver.org>
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef _LINUX_EVENTPOLL_H
 | |
| #define _LINUX_EVENTPOLL_H
 | |
| 
 | |
| /* For O_CLOEXEC */
 | |
| #include <linux/fcntl.h>
 | |
| #include <linux/types.h>
 | |
| 
 | |
| /* Flags for epoll_create1.  */
 | |
| #define EPOLL_CLOEXEC O_CLOEXEC
 | |
| 
 | |
| /* Valid opcodes to issue to sys_epoll_ctl() */
 | |
| #define EPOLL_CTL_ADD 1
 | |
| #define EPOLL_CTL_DEL 2
 | |
| #define EPOLL_CTL_MOD 3
 | |
| 
 | |
| /* Set the One Shot behaviour for the target file descriptor */
 | |
| #define EPOLLONESHOT (1 << 30)
 | |
| 
 | |
| /* Set the Edge Triggered behaviour for the target file descriptor */
 | |
| #define EPOLLET (1 << 31)
 | |
| 
 | |
| /* 
 | |
|  * On x86-64 make the 64bit structure have the same alignment as the
 | |
|  * 32bit structure. This makes 32bit emulation easier.
 | |
|  *
 | |
|  * UML/x86_64 needs the same packing as x86_64
 | |
|  */
 | |
| #ifdef __x86_64__
 | |
| #define EPOLL_PACKED __attribute__((packed))
 | |
| #else
 | |
| #define EPOLL_PACKED
 | |
| #endif
 | |
| 
 | |
| struct epoll_event {
 | |
| 	__u32 events;
 | |
| 	__u64 data;
 | |
| } EPOLL_PACKED;
 | |
| 
 | |
| #ifdef __KERNEL__
 | |
| 
 | |
| /* Forward declarations to avoid compiler errors */
 | |
| struct file;
 | |
| 
 | |
| 
 | |
| #ifdef CONFIG_EPOLL
 | |
| 
 | |
| /* Used to initialize the epoll bits inside the "struct file" */
 | |
| static inline void eventpoll_init_file(struct file *file)
 | |
| {
 | |
| 	INIT_LIST_HEAD(&file->f_ep_links);
 | |
| 	spin_lock_init(&file->f_ep_lock);
 | |
| }
 | |
| 
 | |
| 
 | |
| /* Used to release the epoll bits inside the "struct file" */
 | |
| void eventpoll_release_file(struct file *file);
 | |
| 
 | |
| /*
 | |
|  * This is called from inside fs/file_table.c:__fput() to unlink files
 | |
|  * from the eventpoll interface. We need to have this facility to cleanup
 | |
|  * correctly files that are closed without being removed from the eventpoll
 | |
|  * interface.
 | |
|  */
 | |
| static inline void eventpoll_release(struct file *file)
 | |
| {
 | |
| 
 | |
| 	/*
 | |
| 	 * Fast check to avoid the get/release of the semaphore. Since
 | |
| 	 * we're doing this outside the semaphore lock, it might return
 | |
| 	 * false negatives, but we don't care. It'll help in 99.99% of cases
 | |
| 	 * to avoid the semaphore lock. False positives simply cannot happen
 | |
| 	 * because the file in on the way to be removed and nobody ( but
 | |
| 	 * eventpoll ) has still a reference to this file.
 | |
| 	 */
 | |
| 	if (likely(list_empty(&file->f_ep_links)))
 | |
| 		return;
 | |
| 
 | |
| 	/*
 | |
| 	 * The file is being closed while it is still linked to an epoll
 | |
| 	 * descriptor. We need to handle this by correctly unlinking it
 | |
| 	 * from its containers.
 | |
| 	 */
 | |
| 	eventpoll_release_file(file);
 | |
| }
 | |
| 
 | |
| #else
 | |
| 
 | |
| static inline void eventpoll_init_file(struct file *file) {}
 | |
| static inline void eventpoll_release(struct file *file) {}
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif /* #ifdef __KERNEL__ */
 | |
| 
 | |
| #endif /* #ifndef _LINUX_EVENTPOLL_H */
 | |
| 
 |