From nobody Wed Feb 11 01:27:28 2026 Received: from mail-io1-f50.google.com (mail-io1-f50.google.com [209.85.166.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A35E615D5B4 for ; Tue, 2 Apr 2024 20:25:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712089534; cv=none; b=A1ODIrFdvhzbxyZbwka8vScLsrqhNtoGrVdUlcTQ4S5t3dUsM8C8qEKHRjZZlstbPtn5ZM1gIP8r/8muGDzY5laC6FnSPry8OA5oXUuf779Yz0q8Knotjyx9jWAGdCeczSCGx91jK26CoUYVa+pVgbWfrFBMRCLE56WYHdfwr20= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712089534; c=relaxed/simple; bh=nKnUH95th5iYE+E4iFcTgJ/16TGJIT26Qlwp258+K5s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ns+BfVPgPVA3vcFL2BAkn4At6j/+c7zkNd+CXfpzmiXGfTleORa/IY4bYYzkz7g2b/HFkLTu/Pxb5PIEBMCeXqqT+PItB/XhBcnTTYvPv+t9LN3bu6fzcuJD2GX8xdakrSO4VzbJ/++eNnuT0Ugz5AhdiBV176ehXDjH6H1jlN4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk; spf=pass smtp.mailfrom=kernel.dk; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b=2gtWnPGf; arc=none smtp.client-ip=209.85.166.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kernel.dk Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b="2gtWnPGf" Received: by mail-io1-f50.google.com with SMTP id ca18e2360f4ac-7cc0e831e11so42168139f.1 for ; Tue, 02 Apr 2024 13:25:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20230601.gappssmtp.com; s=20230601; t=1712089531; x=1712694331; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0FZepTNIuSDeEcz8U+UNewgZo+OZhoLKPwuweNfu0j4=; b=2gtWnPGf5fqzADevdBAFp2Ldv/vvHexZ0YgDDDUHikM1VtL+bIGWOifz9I3kY52S/W cuL2TdVyELFAxPXlCTP1VG20bRS5eEj3uj/SuDZoF8ssZ9iwVkmTJxwYN8kYL1OJWkik GxHH9A2qx7g5XojFDK9wv+3jpbjV5puKvrtJCnMKcmFNdNdJ3JV7iFvr6igvpftZAmKb 5rfU0rRzAgHKtWRm4jBUVKFobvtPeoufGeGtTBvDRBmMWKVgvQ9eS9+tCYJtpGTYxPcQ 4JrCnsNWUh/Yfg04LBUunmXJUtmhfwaan9vLICa3AVX96mTuWxNZWrYf0iiyBHj469WS G5tQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712089531; x=1712694331; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0FZepTNIuSDeEcz8U+UNewgZo+OZhoLKPwuweNfu0j4=; b=mgPJqO22FwszAvEYgtjbHxoFmVjF2BnYI1l9D8F0HBMQHkKOCJV/HctG3b/tm3SFA1 lNezqm2MqMGKD2BIIcbrD5y/J7/RvCZDbWSlr74kbQhecRVq8sLRDd0HGNHMGXY/Feaz MCiqXDDyAC+eOb0EI6WQ2l5EOdt96IAbbghuYSj369P3tCc/TdI2L6xjqTwp6B/i5qHG Y1IET5rCtibXwiAMBxzjfL9vkNV/aO4GsZHUPmciQwCKMEETDjeWjqTM+MVn8WAQ1yAB GLB8yJpg0RMOJXIY8sCoNHdlIgDjj9n1n3udl/H53EM/+UigRXeAzDpcn+KWSvTJvBjZ 0hYA== X-Forwarded-Encrypted: i=1; AJvYcCULyGsjKQXzg+vyqeOj58k85QP+xSPN2X/18y3B9oGP0rui8nBCL2Qku+LeZemKLXQjAUSEDmBuTElMmi6L9S7F9H33UjgJLWAw21KH X-Gm-Message-State: AOJu0YyVftDfnfwRJ+tBA5z5wdBd+BwJqkc9srMt8v9eNyPP+S1hMp1A cuA+utss5YCp4CJVxuGlpthz1lXQaOW7lLZwTks3d63p+UOaHtGQx2HHsy/HySoBkpsKXPe9Pzp u X-Google-Smtp-Source: AGHT+IFF7DMoRqbCY2mzvlWMvINoCoSms6BJpXeiJeD49z0rUXhgZSmI6hVa5k8tSH1ih5v7pQIr3Q== X-Received: by 2002:a6b:6d16:0:b0:7d0:c0e7:b577 with SMTP id a22-20020a6b6d16000000b007d0c0e7b577mr7956399iod.2.1712089530753; Tue, 02 Apr 2024 13:25:30 -0700 (PDT) Received: from localhost.localdomain ([96.43.243.2]) by smtp.gmail.com with ESMTPSA id u9-20020a02cbc9000000b0047ec029412fsm3445956jaq.12.2024.04.02.13.25.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 13:25:29 -0700 (PDT) From: Jens Axboe To: linux-fsdevel@vger.kernel.org Cc: brauner@kernel.org, linux-kernel@vger.kernel.org, Jens Axboe Subject: [PATCH 1/3] timerfd: convert to ->read_iter() Date: Tue, 2 Apr 2024 14:18:21 -0600 Message-ID: <20240402202524.1514963-2-axboe@kernel.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240402202524.1514963-1-axboe@kernel.dk> References: <20240402202524.1514963-1-axboe@kernel.dk> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Switch timerfd to using fops->read_iter(), so it can support not just O_NONBLOCK but IOCB_NOWAIT as well. With the latter, users like io_uring interact with timerfds a lot better, as they can be driven purely by the poll trigger. Manually get and install the required fd, so that FMODE_NOWAIT can be set before the file is installed into the file table. No functional changes intended in this patch, it's purely a straight conversion to using the read iterator method. Signed-off-by: Jens Axboe --- fs/timerfd.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/fs/timerfd.c b/fs/timerfd.c index e9c96a0c79f1..b96690b46c1f 100644 --- a/fs/timerfd.c +++ b/fs/timerfd.c @@ -262,17 +262,18 @@ static __poll_t timerfd_poll(struct file *file, poll_= table *wait) return events; } =20 -static ssize_t timerfd_read(struct file *file, char __user *buf, size_t co= unt, - loff_t *ppos) +static ssize_t timerfd_read_iter(struct kiocb *iocb, struct iov_iter *to) { + struct file *file =3D iocb->ki_filp; struct timerfd_ctx *ctx =3D file->private_data; ssize_t res; u64 ticks =3D 0; =20 - if (count < sizeof(ticks)) + if (iov_iter_count(to) < sizeof(ticks)) return -EINVAL; + spin_lock_irq(&ctx->wqh.lock); - if (file->f_flags & O_NONBLOCK) + if (file->f_flags & O_NONBLOCK || iocb->ki_flags & IOCB_NOWAIT) res =3D -EAGAIN; else res =3D wait_event_interruptible_locked_irq(ctx->wqh, ctx->ticks); @@ -313,7 +314,7 @@ static ssize_t timerfd_read(struct file *file, char __u= ser *buf, size_t count, } spin_unlock_irq(&ctx->wqh.lock); if (ticks) - res =3D put_user(ticks, (u64 __user *) buf) ? -EFAULT: sizeof(ticks); + res =3D copy_to_iter(&ticks, sizeof(ticks), to); return res; } =20 @@ -384,7 +385,7 @@ static long timerfd_ioctl(struct file *file, unsigned i= nt cmd, unsigned long arg static const struct file_operations timerfd_fops =3D { .release =3D timerfd_release, .poll =3D timerfd_poll, - .read =3D timerfd_read, + .read_iter =3D timerfd_read_iter, .llseek =3D noop_llseek, .show_fdinfo =3D timerfd_show, .unlocked_ioctl =3D timerfd_ioctl, @@ -407,6 +408,7 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flag= s) { int ufd; struct timerfd_ctx *ctx; + struct file *file; =20 /* Check the TFD_* constants for consistency. */ BUILD_BUG_ON(TFD_CLOEXEC !=3D O_CLOEXEC); @@ -443,11 +445,22 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, fl= ags) =20 ctx->moffs =3D ktime_mono_to_real(0); =20 - ufd =3D anon_inode_getfd("[timerfd]", &timerfd_fops, ctx, - O_RDWR | (flags & TFD_SHARED_FCNTL_FLAGS)); - if (ufd < 0) + ufd =3D get_unused_fd_flags(O_RDWR | (flags & TFD_SHARED_FCNTL_FLAGS)); + if (ufd < 0) { kfree(ctx); + return ufd; + } + + file =3D anon_inode_getfile("[timerfd]", &timerfd_fops, ctx, + O_RDWR | (flags & TFD_SHARED_FCNTL_FLAGS)); + if (IS_ERR(file)) { + put_unused_fd(ufd); + kfree(ctx); + return PTR_ERR(file); + } =20 + file->f_mode |=3D FMODE_NOWAIT; + fd_install(ufd, file); return ufd; } =20 --=20 2.43.0 From nobody Wed Feb 11 01:27:28 2026 Received: from mail-io1-f51.google.com (mail-io1-f51.google.com [209.85.166.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 91C4915DBB6 for ; Tue, 2 Apr 2024 20:25:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712089535; cv=none; b=TRNIgA5Tpz3oyDlw0BUD3fyf9gD5O7J1Z/PVGNs7gfrOc5eqQ/DDStNJ0Y+KA1mpmNXPGdvcBhlEEMV2g71u3HNYRqbJS3gBE6EZ7XT4/fAHUpibztdfFSMmr1LDkYfvCFAIN1BBE0WFdqkOsMR//EDC/ere5573RWfAfdxzEkA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712089535; c=relaxed/simple; bh=OIR2Y5io1QhHTLei1BSk8STk0MqP9Cy7Pory5o7tlKI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BwSXOEfWem8olfk5ij5KH8d5V9QQSAdb7Cy9K62cBlropxwAnKTU4VnTeFgVe45cmee9b8ZHVr7ErjP+Bz+2QCxkF15odw6RrFl6gTXoxyzWvADZufotYL42MsFxQL9YQrv5HtalP3+/RCSsDNgLDJNA2PBlHck34zcsE6SPlDU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk; spf=pass smtp.mailfrom=kernel.dk; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b=d4IitUln; arc=none smtp.client-ip=209.85.166.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kernel.dk Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b="d4IitUln" Received: by mail-io1-f51.google.com with SMTP id ca18e2360f4ac-7c86e6f649aso18469339f.0 for ; Tue, 02 Apr 2024 13:25:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20230601.gappssmtp.com; s=20230601; t=1712089532; x=1712694332; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xLz/H2XFRBrWVV5Gb4xnS/5GtE0qd548o457X3QGvso=; b=d4IitUlno+PuogJ8NCl7dVSEOq176jVoZrWzBNZXyTbn/swjwxqIvBtrZOi891h0pY lIKtL79G7INaAgvEVMCcIKvG9BwpqaytpNNXz5WPdGVwTQY+17iJJmG1zqeh97XImOO/ Bd/m92nwuMJ3fGAhDT+vKpMQGwpjGki1ZCafFw+dFzU+ul7h/BrGHC6GfCI7Ec+rL+Wg P6UGtibQAdiIyIqQWaUxRONMT8Do8YVJBoSqfgLpSf9jqRe2dkT2SFAHe1hG42kvfIMN 4fPy7eDnm/OsHSi6v2IAnF/IzMqGRuhJPvugqktAiXVm3tP87YKBMjuI6j4sgpxU0yfD gT4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712089532; x=1712694332; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xLz/H2XFRBrWVV5Gb4xnS/5GtE0qd548o457X3QGvso=; b=KgA9omFDfVFg85SuklaGw6GptJm5Jx5t8/20zpNHCGRi3JRRHV9KpHB8GibVSrl+yY nyCt40R9TMYIG4JBoO2LpUmlPoEvulIQXtBhkQcsynZT1Q6fKnqn4wBp/J+wsyoaea7T znM191KbYvrwObDtzTQGZlxB5+ljdOg3Z1aopBLfpTViNPTO4FSEPIcfCskRA3iMBlZ/ sSVmpzbzWYzW0LGXSaKsLyq5TI2QZCsBzmP1c+CyGW9UZWF1EVCmaxoZr7mhBrhZ3JDb lmpyVlT/jk3wfAp7IAbL2r5yR5D06AoatKyk6Imj7dFbIxZfOFkWN2CRmOTtR5HTpjDy qLWw== X-Forwarded-Encrypted: i=1; AJvYcCWvmD9ePEdvHl8Irf9k+SMyA8I1n7MePajVJJnBU7z7JpB3tTPjtcWSwQbXW7ugjy5BjI40OVjTegViXPIHwu2o/tYGgdZ37A5vnEYr X-Gm-Message-State: AOJu0Yy7wB7gzpoBM0+ne0DVl05ae9RJUodX8mEL6gHpEJTKHB68szZT MUo7HWZVd5+sDGu6Mdky/RSRjD9UM59vx73NeNF6PicTibmvONXMLyYQ9afKj74= X-Google-Smtp-Source: AGHT+IHYbMpQf4s8TRlHSc+tS+jQrOmVzcT6LSF5ihsLdx9ND8J3x+gOfbJS39lohHw+Z7Bh3px49w== X-Received: by 2002:a6b:c949:0:b0:7d0:bd2b:43ba with SMTP id z70-20020a6bc949000000b007d0bd2b43bamr9340547iof.0.1712089532551; Tue, 02 Apr 2024 13:25:32 -0700 (PDT) Received: from localhost.localdomain ([96.43.243.2]) by smtp.gmail.com with ESMTPSA id u9-20020a02cbc9000000b0047ec029412fsm3445956jaq.12.2024.04.02.13.25.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 13:25:31 -0700 (PDT) From: Jens Axboe To: linux-fsdevel@vger.kernel.org Cc: brauner@kernel.org, linux-kernel@vger.kernel.org, Jens Axboe Subject: [PATCH 2/3] userfaultfd: convert to ->read_iter() Date: Tue, 2 Apr 2024 14:18:22 -0600 Message-ID: <20240402202524.1514963-3-axboe@kernel.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240402202524.1514963-1-axboe@kernel.dk> References: <20240402202524.1514963-1-axboe@kernel.dk> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rather than use the older style ->read() hook, use ->read_iter() so that userfaultfd can support both O_NONBLOCK and IOCB_NOWAIT for non-blocking read attempts. Split the fd setup into two parts, so that userfaultfd can mark the file mode with FMODE_NOWAIT before installing it into the process table. With that, we can also defer grabbing the mm until we know the rest will succeed, as the fd isn't visible before then. Signed-off-by: Jens Axboe --- fs/userfaultfd.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index 60dcfafdc11a..7864c2dba858 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -282,7 +282,7 @@ static inline bool userfaultfd_huge_must_wait(struct us= erfaultfd_ctx *ctx, /* * Verify the pagetables are still not ok after having reigstered into * the fault_pending_wqh to avoid userland having to UFFDIO_WAKE any - * userfault that has already been resolved, if userfaultfd_read and + * userfault that has already been resolved, if userfaultfd_read_iter and * UFFDIO_COPY|ZEROPAGE are being run simultaneously on two different * threads. */ @@ -1177,34 +1177,34 @@ static ssize_t userfaultfd_ctx_read(struct userfaul= tfd_ctx *ctx, int no_wait, return ret; } =20 -static ssize_t userfaultfd_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) +static ssize_t userfaultfd_read_iter(struct kiocb *iocb, struct iov_iter *= to) { + struct file *file =3D iocb->ki_filp; struct userfaultfd_ctx *ctx =3D file->private_data; ssize_t _ret, ret =3D 0; struct uffd_msg msg; - int no_wait =3D file->f_flags & O_NONBLOCK; struct inode *inode =3D file_inode(file); + bool no_wait; =20 if (!userfaultfd_is_initialized(ctx)) return -EINVAL; =20 + no_wait =3D file->f_flags & O_NONBLOCK || iocb->ki_flags & IOCB_NOWAIT; for (;;) { - if (count < sizeof(msg)) + if (iov_iter_count(to) < sizeof(msg)) return ret ? ret : -EINVAL; _ret =3D userfaultfd_ctx_read(ctx, no_wait, &msg, inode); if (_ret < 0) return ret ? ret : _ret; - if (copy_to_user((__u64 __user *) buf, &msg, sizeof(msg))) + _ret =3D copy_to_iter(&msg, sizeof(msg), to); + if (_ret < 0) return ret ? ret : -EFAULT; ret +=3D sizeof(msg); - buf +=3D sizeof(msg); - count -=3D sizeof(msg); /* * Allow to read more than one fault at time but only * block if waiting for the very first one. */ - no_wait =3D O_NONBLOCK; + no_wait =3D true; } } =20 @@ -2172,7 +2172,7 @@ static const struct file_operations userfaultfd_fops = =3D { #endif .release =3D userfaultfd_release, .poll =3D userfaultfd_poll, - .read =3D userfaultfd_read, + .read_iter =3D userfaultfd_read_iter, .unlocked_ioctl =3D userfaultfd_ioctl, .compat_ioctl =3D compat_ptr_ioctl, .llseek =3D noop_llseek, @@ -2192,6 +2192,7 @@ static void init_once_userfaultfd_ctx(void *mem) static int new_userfaultfd(int flags) { struct userfaultfd_ctx *ctx; + struct file *file; int fd; =20 BUG_ON(!current->mm); @@ -2215,16 +2216,25 @@ static int new_userfaultfd(int flags) init_rwsem(&ctx->map_changing_lock); atomic_set(&ctx->mmap_changing, 0); ctx->mm =3D current->mm; - /* prevent the mm struct to be freed */ - mmgrab(ctx->mm); + + fd =3D get_unused_fd_flags(O_RDONLY | (flags & UFFD_SHARED_FCNTL_FLAGS)); + if (fd < 0) + goto err_out; =20 /* Create a new inode so that the LSM can block the creation. */ - fd =3D anon_inode_create_getfd("[userfaultfd]", &userfaultfd_fops, ctx, + file =3D anon_inode_create_getfile("[userfaultfd]", &userfaultfd_fops, ct= x, O_RDONLY | (flags & UFFD_SHARED_FCNTL_FLAGS), NULL); - if (fd < 0) { - mmdrop(ctx->mm); - kmem_cache_free(userfaultfd_ctx_cachep, ctx); + if (IS_ERR(file)) { + fd =3D PTR_ERR(file); + goto err_out; } + /* prevent the mm struct to be freed */ + mmgrab(ctx->mm); + file->f_mode |=3D FMODE_NOWAIT; + fd_install(fd, file); + return fd; +err_out: + kmem_cache_free(userfaultfd_ctx_cachep, ctx); return fd; } =20 --=20 2.43.0 From nobody Wed Feb 11 01:27:28 2026 Received: from mail-io1-f48.google.com (mail-io1-f48.google.com [209.85.166.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A30715E1F6 for ; Tue, 2 Apr 2024 20:25:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712089536; cv=none; b=ZRdjrGMwlx2zVxdl+IlHJLjsZYp0WwawW0Yr96k77EgZzKymTGpsOV8bdS+hWmqxeZefHpBFr5lzhKPF4noN/Y1LszyQPXnZn87knKJZk5Ja8rzpMQahInGPOOAADVp5vcZLSvtal3T4Qqz36rWiI8OSJPXENowcxOBnU/z1Xxs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712089536; c=relaxed/simple; bh=lvxMY5xAb2LkORT4WJWhXdTw9IOcYUuS+QAu6zRgfeM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P8+U9Pd5WcQRnh4DiQ1LclMnbv3h11R+kfDBVZMyP4fvhV19wOKmd6uNYm6BbBZymspYJrmab0a+ZH5yHopOP0xYg+Uwu448n05h8VSKmCDD5xKmPNc9QpL11HSf2bkt1FhRyXtRx0CutGVcTvhmmj8E7XIsTY0toAp0k6FFl90= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk; spf=pass smtp.mailfrom=kernel.dk; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b=rpSQ5AbF; arc=none smtp.client-ip=209.85.166.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kernel.dk Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b="rpSQ5AbF" Received: by mail-io1-f48.google.com with SMTP id ca18e2360f4ac-7cc0e831e11so42169739f.1 for ; Tue, 02 Apr 2024 13:25:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20230601.gappssmtp.com; s=20230601; t=1712089534; x=1712694334; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wEISoDaReVBYlihnUfkRNegSHCa1fOWz9Nfv9lbetO4=; b=rpSQ5AbFmAhADrr5Wu0H8kGy+7W6gC8uCOb0gXT1WngH/NkwcM7sSOoAl3Gtf9+L2R +R6598YkJLVV31lhowcV+wut1UT/UbOtCWqQ3+lSPuKvn2Rs4p0OFcWgauEzemUbnqfT PkOtl/7AjqOBf3SgWreaLUAx3m95jvvm8kP3Ep3lyghYYbsuUZnmx5+9rabQFbUfSh4j m4sNnGto0z9th8Zdgb9qcenoZ65u49+KTUNWAkMKjUq09eVePvbfqSjJYOY5KeyIlqAM OIrf6P7V3w9jAAdHMa4b3LyPAsArfMrIudNLMMLxc+tzbI5xZuAu/i2wuHXR4fxGTrrR sd/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712089534; x=1712694334; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wEISoDaReVBYlihnUfkRNegSHCa1fOWz9Nfv9lbetO4=; b=Vt07Xmrw07cGPv3xmK8siLnqrYJLVcfOtMr9UB3m4L7KBv6KbDo8JjIeA1/rxV8auA gqQoQNLaytT9uuOT25kXQ4j9A9vh8kM1zfFAbJB9nPG7qoeug2kxxmcqy7ZsJHJqop5i 332Zzak/cRz3Syspxaq3wbjCuQQ5Tzm+3d6+aba1+Ayr/xogvCJkyxDFl9yxwvLYeRvr 1eBytdsnA/wybvdYmf6SxayqedUL0CC8RheAxxCLfi3XMaQPjPVlUG2sHgeDNgUZzbNz 1Qd/10LbJpRAyIUMZZHRjE+luObNG/lTkqmq6r56NyTOwfvXpykVRXGAWgIjUkfkp/gX E1yA== X-Forwarded-Encrypted: i=1; AJvYcCUzfneuaMyix7FaIO4MJLwwwOUkm1MWEeATq+2wfzz7CbFwQb0dpunqqt4C3Usxo29FgbFzK4kJTyU5p3EpEYWr6BWcDecrDhwkaBin X-Gm-Message-State: AOJu0YwijemEYFxKhLtkUmIiryyqLDAEkd3vsXKgZwpVqAGd2UyM/7hK VvaJwsh60PK0mNb7en7zN3Ad1dhuJ31OXlr7RBgUDFFMuGL0KSJYPCQCB6kjcTE= X-Google-Smtp-Source: AGHT+IGJehSXeir2a4opOIryK4i/S+JB9yIPvNU+R1MfGhn5Hq5ofPKNTd0bOyXRTrjF2tYhZksXHA== X-Received: by 2002:a6b:6d16:0:b0:7d0:c0e7:b577 with SMTP id a22-20020a6b6d16000000b007d0c0e7b577mr7956587iod.2.1712089534576; Tue, 02 Apr 2024 13:25:34 -0700 (PDT) Received: from localhost.localdomain ([96.43.243.2]) by smtp.gmail.com with ESMTPSA id u9-20020a02cbc9000000b0047ec029412fsm3445956jaq.12.2024.04.02.13.25.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 13:25:33 -0700 (PDT) From: Jens Axboe To: linux-fsdevel@vger.kernel.org Cc: brauner@kernel.org, linux-kernel@vger.kernel.org, Jens Axboe Subject: [PATCH 3/3] signalfd: convert to ->read_iter() Date: Tue, 2 Apr 2024 14:18:23 -0600 Message-ID: <20240402202524.1514963-4-axboe@kernel.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240402202524.1514963-1-axboe@kernel.dk> References: <20240402202524.1514963-1-axboe@kernel.dk> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Jens Axboe --- fs/signalfd.c | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/fs/signalfd.c b/fs/signalfd.c index e20d1484c663..9b4ff83d816d 100644 --- a/fs/signalfd.c +++ b/fs/signalfd.c @@ -68,8 +68,7 @@ static __poll_t signalfd_poll(struct file *file, poll_tab= le *wait) /* * Copied from copy_siginfo_to_user() in kernel/signal.c */ -static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo, - kernel_siginfo_t const *kinfo) +static int signalfd_copyinfo(struct iov_iter *to, kernel_siginfo_t const *= kinfo) { struct signalfd_siginfo new; =20 @@ -146,10 +145,7 @@ static int signalfd_copyinfo(struct signalfd_siginfo _= _user *uinfo, break; } =20 - if (copy_to_user(uinfo, &new, sizeof(struct signalfd_siginfo))) - return -EFAULT; - - return sizeof(*uinfo); + return copy_to_iter(&new, sizeof(struct signalfd_siginfo), to); } =20 static ssize_t signalfd_dequeue(struct signalfd_ctx *ctx, kernel_siginfo_t= *info, @@ -199,25 +195,26 @@ static ssize_t signalfd_dequeue(struct signalfd_ctx *= ctx, kernel_siginfo_t *info * error code. The "count" parameter must be at least the size of a * "struct signalfd_siginfo". */ -static ssize_t signalfd_read(struct file *file, char __user *buf, size_t c= ount, - loff_t *ppos) +static ssize_t signalfd_read_iter(struct kiocb *iocb, struct iov_iter *to) { + struct file *file =3D iocb->ki_filp; struct signalfd_ctx *ctx =3D file->private_data; struct signalfd_siginfo __user *siginfo; - int nonblock =3D file->f_flags & O_NONBLOCK; + size_t count =3D iov_iter_count(to); ssize_t ret, total =3D 0; kernel_siginfo_t info; + bool nonblock; =20 count /=3D sizeof(struct signalfd_siginfo); if (!count) return -EINVAL; =20 - siginfo =3D (struct signalfd_siginfo __user *) buf; + nonblock =3D file->f_flags & O_NONBLOCK || iocb->ki_flags & IOCB_NOWAIT; do { ret =3D signalfd_dequeue(ctx, &info, nonblock); if (unlikely(ret <=3D 0)) break; - ret =3D signalfd_copyinfo(siginfo, &info); + ret =3D signalfd_copyinfo(to, &info); if (ret < 0) break; siginfo++; @@ -246,7 +243,7 @@ static const struct file_operations signalfd_fops =3D { #endif .release =3D signalfd_release, .poll =3D signalfd_poll, - .read =3D signalfd_read, + .read_iter =3D signalfd_read_iter, .llseek =3D noop_llseek, }; =20 @@ -265,20 +262,35 @@ static int do_signalfd4(int ufd, sigset_t *mask, int = flags) signotset(mask); =20 if (ufd =3D=3D -1) { + struct file *file; + ctx =3D kmalloc(sizeof(*ctx), GFP_KERNEL); if (!ctx) return -ENOMEM; =20 ctx->sigmask =3D *mask; =20 + ufd =3D get_unused_fd_flags(O_RDWR | + (flags & (O_CLOEXEC | O_NONBLOCK))); + if (ufd < 0) { + kfree(ctx); + return ufd; + } + + file =3D anon_inode_getfile("[signalfd]", &signalfd_fops, ctx, + O_RDWR | (flags & (O_CLOEXEC | O_NONBLOCK))); + if (IS_ERR(file)) { + put_unused_fd(ufd); + kfree(ctx); + return ufd; + } + file->f_mode |=3D FMODE_NOWAIT; + /* * When we call this, the initialization must be complete, since * anon_inode_getfd() will install the fd. */ - ufd =3D anon_inode_getfd("[signalfd]", &signalfd_fops, ctx, - O_RDWR | (flags & (O_CLOEXEC | O_NONBLOCK))); - if (ufd < 0) - kfree(ctx); + fd_install(ufd, file); } else { struct fd f =3D fdget(ufd); if (!f.file) --=20 2.43.0