FS poll handlers always return true kqueue handlers are different. So the diff below introduces a new NOTE_IMM hint to be able to match the existing poll(2)/select(2) behavior.
This hint is obviously kernel-only. This is related to the NFS poller discussion so I'm bringing the diff now in order to move forward. Comments, oks? Index: sys/event.h =================================================================== RCS file: /cvs/src/sys/sys/event.h,v retrieving revision 1.38 diff -u -p -r1.38 event.h --- sys/event.h 25 May 2020 15:54:10 -0000 1.38 +++ sys/event.h 31 May 2020 08:34:38 -0000 @@ -128,6 +128,10 @@ struct klist { }; #ifdef _KERNEL +/* + * data/hint flags for EVFILT_{READ|WRITE}, not shared with userspace + */ +#define NOTE_IMM 0x1000 /* Immediate read event */ #define EVFILT_MARKER 0xf /* placemarker for tailq */ Index: isofs/cd9660/cd9660_vnops.c =================================================================== RCS file: /cvs/src/sys/isofs/cd9660/cd9660_vnops.c,v retrieving revision 1.83 diff -u -p -r1.83 cd9660_vnops.c --- isofs/cd9660/cd9660_vnops.c 7 Apr 2020 13:27:51 -0000 1.83 +++ isofs/cd9660/cd9660_vnops.c 31 May 2020 08:34:38 -0000 @@ -1036,6 +1036,9 @@ filt_cd9660read(struct knote *kn, long h return (1); } + if (kn->kn_sfflags & NOTE_IMM) + return (1); + return (kn->kn_data != 0); } Index: miscfs/fuse/fuse_vnops.c =================================================================== RCS file: /cvs/src/sys/miscfs/fuse/fuse_vnops.c,v retrieving revision 1.59 diff -u -p -r1.59 fuse_vnops.c --- miscfs/fuse/fuse_vnops.c 7 Apr 2020 13:27:51 -0000 1.59 +++ miscfs/fuse/fuse_vnops.c 31 May 2020 08:34:38 -0000 @@ -188,6 +188,9 @@ filt_fusefsread(struct knote *kn, long h return (1); } + if (kn->kn_sfflags & NOTE_IMM) + return (1); + return (kn->kn_data != 0); } Index: msdosfs/msdosfs_vnops.c =================================================================== RCS file: /cvs/src/sys/msdosfs/msdosfs_vnops.c,v retrieving revision 1.132 diff -u -p -r1.132 msdosfs_vnops.c --- msdosfs/msdosfs_vnops.c 7 Apr 2020 13:27:52 -0000 1.132 +++ msdosfs/msdosfs_vnops.c 31 May 2020 08:34:38 -0000 @@ -2013,6 +2013,10 @@ filt_msdosfsread(struct knote *kn, long kn->kn_fflags |= NOTE_EOF; return (1); } + + if (kn->kn_sfflags & NOTE_IMM) + return (1); + return (kn->kn_data != 0); } Index: nfs/nfs_kq.c =================================================================== RCS file: /cvs/src/sys/nfs/nfs_kq.c,v retrieving revision 1.30 diff -u -p -r1.30 nfs_kq.c --- nfs/nfs_kq.c 7 Apr 2020 13:27:52 -0000 1.30 +++ nfs/nfs_kq.c 31 May 2020 08:36:21 -0000 @@ -234,6 +234,10 @@ filt_nfsread(struct knote *kn, long hint kn->kn_fflags |= NOTE_EOF; return (1); } + + if (kn->kn_sfflags & NOTE_IMM) + return (1); + return (kn->kn_data != 0); } Index: tmpfs/tmpfs_vnops.c =================================================================== RCS file: /cvs/src/sys/tmpfs/tmpfs_vnops.c,v retrieving revision 1.40 diff -u -p -r1.40 tmpfs_vnops.c --- tmpfs/tmpfs_vnops.c 7 Apr 2020 13:27:52 -0000 1.40 +++ tmpfs/tmpfs_vnops.c 31 May 2020 08:34:38 -0000 @@ -2665,6 +2665,9 @@ filt_tmpfsread(struct knote *kn, long hi return (1); } + if (kn->kn_sfflags & NOTE_IMM) + return (1); + return (kn->kn_data != 0); } Index: ufs/ufs/ufs_vnops.c =================================================================== RCS file: /cvs/src/sys/ufs/ufs/ufs_vnops.c,v retrieving revision 1.150 diff -u -p -r1.150 ufs_vnops.c --- ufs/ufs/ufs_vnops.c 7 Apr 2020 13:27:52 -0000 1.150 +++ ufs/ufs/ufs_vnops.c 31 May 2020 08:34:38 -0000 @@ -1973,6 +1973,9 @@ filt_ufsread(struct knote *kn, long hint return (1); } + if (kn->kn_sfflags & NOTE_IMM) + return (1); + return (kn->kn_data != 0); }