On 4/3/24 4:57 PM, Al Viro wrote: > On Wed, Apr 03, 2024 at 08:02:54AM -0600, Jens Axboe wrote: >> Rather than use the older style ->read() hook, use ->read_iter() so that >> signalfd can support both O_NONBLOCK and IOCB_NOWAIT for non-blocking >> read attempts. >> >> Split the fd setup into two parts, so that signalfd can mark the file >> mode with FMODE_NOWAIT before installing it into the process table. > > Same issue with copy_to_iter() calling conventions; what's more, userland > really does not expect partial copies here, so it might be worth adding > > static inline > bool copy_to_iter_full(void *addr, size_t bytes, struct iov_iter *i) > { > size_t copied = copy_to_iter(addr, bytes, i); > if (likely(copied == bytes)) > return true; > iov_iter_revert(i, copied); > return false; > } > > to include/linux/uio.h for the sake of those suckers. Then > they could go for > return copy_to_iter_full(&new, sizeof(new), to) ? sizeof(new) : -EFAULT; > and similar in other two. That's a good idea, makes the transformations easier too and avoids dealine with the partial case. > NOTE: the userland ABI is somewhat sucky here - if the buffer goes > unmapped (or r/o) at the offset that is *not* a multiple of > sizeof(struct signalfd_siginfo), you get an event quietly lost. > Not sure what can be done with that - it is a user-visible ABI. The ABI could be nicer, but isn't this a case of "well don't do that then"? -- Jens Axboe