svn commit: r355065 - head/sys/compat/linux

Vladimir Kondratyev wulf at FreeBSD.org
Sun Nov 24 20:41:48 UTC 2019


Author: wulf
Date: Sun Nov 24 20:41:47 2019
New Revision: 355065
URL: https://svnweb.freebsd.org/changeset/base/355065

Log:
  Linux epoll: Don't deregister file descriptor after EPOLLONESHOT is fired
  
  Linux epoll does not remove descriptor after one-shot event has been triggered.
  Set EV_DISPATCH kqueue flag rather then EV_ONESHOT to get the same behavior.
  
  Required by Linux Steam client.
  
  PR:		240590
  Reported by:	Alex S <iwtcex at gmail.com>
  Reviewed by:	emaste, imp
  MFC after:	1 week
  Differential Revision:	https://reviews.freebsd.org/D22513

Modified:
  head/sys/compat/linux/linux_event.c

Modified: head/sys/compat/linux/linux_event.c
==============================================================================
--- head/sys/compat/linux/linux_event.c	Sun Nov 24 19:18:12 2019	(r355064)
+++ head/sys/compat/linux/linux_event.c	Sun Nov 24 20:41:47 2019	(r355065)
@@ -306,7 +306,7 @@ epoll_to_kevent(struct thread *td, struct file *epfp,
 
 	/* flags related to how event is registered */
 	if ((levents & LINUX_EPOLLONESHOT) != 0)
-		*kev_flags |= EV_ONESHOT;
+		*kev_flags |= EV_DISPATCH;
 	if ((levents & LINUX_EPOLLET) != 0)
 		*kev_flags |= EV_CLEAR;
 	if ((levents & LINUX_EPOLLERR) != 0)
@@ -501,16 +501,17 @@ linux_epoll_ctl(struct thread *td, struct linux_epoll_
 	case LINUX_EPOLL_CTL_ADD:
 		/*
 		 * kqueue_register() return ENOENT if event does not exists
-		 * and the EV_ADD flag is not set.
+		 * and the EV_ADD flag is not set. Reset EV_ENABLE flag to
+		 * avoid accidental activation of fired oneshot events.
 		 */
-		kev[0].flags &= ~EV_ADD;
+		kev[0].flags &= ~(EV_ADD | EV_ENABLE);
 		error = kqfd_register(args->epfd, &kev[0], td, M_WAITOK);
 		if (error != ENOENT) {
 			error = EEXIST;
 			goto leave0;
 		}
 		error = 0;
-		kev[0].flags |= EV_ADD;
+		kev[0].flags |= (EV_ADD | EV_ENABLE);
 		break;
 
 	case LINUX_EPOLL_CTL_DEL:


More information about the svn-src-all mailing list