From nobody Sat Feb 7 18:15:51 2026 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (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 AD70C13667F for ; Tue, 9 Apr 2024 15:24:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712676285; cv=none; b=dJfpP9nsPoN99FVL9vP5ZzTJz3dQ+4plfGa3KECn3bLa9PlfsxIA7zsLkQlrxH7rG92SqJ8kJR4+Up5rjFJ2XA5b4HhBMJhbZAxrbfauUK9DdDbAeawZUVQl9YXNxG9V1TbKWspaOG+irkmRY4+kJD3xQF0BQS7Y+dsOSmiC8hw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712676285; c=relaxed/simple; bh=L8raPWqde16GsYWbCk+qHGSoPzx+xF25H0NtJJiUQrA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pQkLdwR5viqoGgAAjG8BdZFJ0eDrfljjaky50kfbavbyhVErx1+g+wLSgp/CfK0ycXxKxMgcnvToQKEcR90M5eiMHkIrjtVuEJt/AF+qbs5ljoqPPaQbsgJ8M9o6N7JnbLf3Yh58/4kcvUQCMcT1UE3lumkVJPtab001TKFnolE= 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=2K3pEAIs; arc=none smtp.client-ip=209.85.210.173 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="2K3pEAIs" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-6ecf1d22d78so873914b3a.0 for ; Tue, 09 Apr 2024 08:24:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20230601.gappssmtp.com; s=20230601; t=1712676283; x=1713281083; 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=PC3JAGAh91yPLCnyIgZ/a59FqxkcNwJUPV8ww2u3Dso=; b=2K3pEAIsxYV7P1KUpAbTcLksBO3dYv2g60jnUziJ4uEi3PJgwt9iro7wp9fV5iyou3 2fXk1R26vMJuOUg7eT99FlMqYpOh1XrHzyM+ltdnWz70JuHKqPoEsD+pRXijXRHemAut m+hGofZDsjdYwczMVHrv1BGMZ1u2sWf273GN8PRN5bB8mCdOZJnRQVNLmumhyJQfSLYE 2hwLxKSE0L7D0pMd9W8pHRQiN5viMNlVZEqb0CrAdNvQw4Rc3uJPnS4lLIjmzlTMc61C YFIPy033Th31tteShL1qqyl6W/5ICD/ERqQoxrzJrZMh1Qzp7jJIfnuAeDiMpePicBmk 3qAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712676283; x=1713281083; 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=PC3JAGAh91yPLCnyIgZ/a59FqxkcNwJUPV8ww2u3Dso=; b=qrqnlQCxZWJ4enXaer/kVAtULyM48WanR7V/XgMc72Y/8j97gCY/tL9EM6E+5fvCMC ZoyH4g5eriXSLhPtNbfHgw0/+cn5FnI6LO1VckyE2hxPLJvQFEajmiA+SS1x8tNYqnUt e/C3/Z61xkDAdc1VyPx+8bCy8HDhZn9XfIiaeO1jCthgxbIRP62K0dLkH+qbaLyUC07L K3jRAeNH1Qa4K0ttAIRtrwF9wXVXhoAE9NzR2kXCBq3+e3eTXZuiOpLf8SPYwiwA2kQT ao/vtHARRE1jY9iyBINd7hHASI4C03ScWJGmxx7BlgBo3HzLubdr2tN/3wRIsfG1CuMp 8Ouw== X-Forwarded-Encrypted: i=1; AJvYcCV/jhHHJrvypHUdlVHWuV1QQx9IaTSHQN7zNvuTF9QPnF61ZIS2RFRKZEtiTiU+bLvrbdP3DKwuijiak/QZAGN9fJ5V3pX7fjJHzqN1 X-Gm-Message-State: AOJu0Ywh+n+NkH2PWMSwwk9zcS5ceCDspf07DxGsvFe0DuMf60+isFvP 4D7RxhSfneODHN8vDakcZDp0cMh7IroP1orb/DnBXIIZ/RwfSynuGKM67T8V7+I= X-Google-Smtp-Source: AGHT+IEc52xWMZzZcrHpnjme9geYxqLp5964NukBO7ZeZNSHOZ1BD9wDx+9lDuJhAiqT69HuUCo3Xg== X-Received: by 2002:a05:6a21:6d9d:b0:1a3:c621:da8d with SMTP id wl29-20020a056a216d9d00b001a3c621da8dmr171767pzb.1.1712676282899; Tue, 09 Apr 2024 08:24:42 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.194]) by smtp.gmail.com with ESMTPSA id ev6-20020a17090aeac600b002a513cc466esm3945558pjb.45.2024.04.09.08.24.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Apr 2024 08:24:41 -0700 (PDT) From: Jens Axboe To: linux-fsdevel@vger.kernel.org Cc: brauner@kernel.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk, Jens Axboe Subject: [PATCH 1/4] iov_iter: add copy_to_iter_full() Date: Tue, 9 Apr 2024 09:22:15 -0600 Message-ID: <20240409152438.77960-2-axboe@kernel.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240409152438.77960-1-axboe@kernel.dk> References: <20240409152438.77960-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" Add variant of copy_to_iter() that either copies the full amount asked for and return success, or ensures that the iov_iter is back to where it started on failure and returns false. Suggested-by: Al Viro Signed-off-by: Jens Axboe --- include/linux/uio.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/linux/uio.h b/include/linux/uio.h index 00cebe2b70de..9e9510672b28 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -197,6 +197,16 @@ size_t copy_to_iter(const void *addr, size_t bytes, st= ruct iov_iter *i) return 0; } =20 +static __always_inline __must_check +bool copy_to_iter_full(const void *addr, size_t bytes, struct iov_iter *i) +{ + size_t copied =3D copy_to_iter(addr, bytes, i); + if (likely(copied =3D=3D bytes)) + return true; + iov_iter_revert(i, copied); + return false; +} + static __always_inline __must_check size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) { --=20 2.43.0 From nobody Sat Feb 7 18:15:51 2026 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 32786137746 for ; Tue, 9 Apr 2024 15:24:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712676286; cv=none; b=le/T0+B1xl2cd5KQXqV/mGjI8neCHrQBOUT8LoWMhBsysgzU9QJmcK2Dp/lFzE0MOCGrtgbviWUNOcx9xcG7t8GjKJWiZrXTc8XB5HuaxqdcfWcLQhMh9CGAgeHcXfrcnttAEXUMj9kbDEBeWviYAcQYAP9kIhRQDlCikspGiR4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712676286; c=relaxed/simple; bh=rWWuEYi9ShXfHZjkkkoQhNS8w7ijwDS4w1AKkq3X00g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LuhGKDHrxw/bMFyIIeZQBbsgdIKWDoaWHAliLzfreqG0/MTw1Szkj3oB8SZoGJY3gfJlcKr6Cy0r7K7qE3XDzPVH6sjUYdvDxBe6qpqiArAt8KX6dehNIIsgnt6VoHqtQ++bGWQvY4xRTW8zGlFjgsi6FVZTQqJM3aHI310DLUQ= 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=VNU7G2WX; arc=none smtp.client-ip=209.85.216.41 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="VNU7G2WX" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-2a2f2cd61cdso1485762a91.1 for ; Tue, 09 Apr 2024 08:24:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20230601.gappssmtp.com; s=20230601; t=1712676284; x=1713281084; 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=jsdceta1AaxRkUhJQPij5NrIk0Ek1AVLknMfi/yNTxc=; b=VNU7G2WXIpl+VxtWSq919rpi+aNwX5MxtLmNBIE5Awc7q4qf18aEQkzLUGjZgHCLI3 L5UUJSiRlJ0wyTPy2zggwjWJrhrxfG3Pzn2vPrZh4X3S+tCwSFyb5rYZoSE5RDl6uRgQ uW2iX0aXyKbKFbNB0CsZfdDQ0EwvO8OWgCBaE5w+lD6HJvCrb1ivIBqeApPSif+MICgC dKqu4Jb1GRAL6gRPmHLt/HAgGHywMiF+8PSamZBVZSuElCZ+U4RGpoWimPk0Fd0nyDQ0 OgY+HDhcivRin8QIqVtu103o50+pG6rXxqn7l9Qi5F30N7vbyS+9ne7tnweT08wUJfhP uYNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712676284; x=1713281084; 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=jsdceta1AaxRkUhJQPij5NrIk0Ek1AVLknMfi/yNTxc=; b=HMOTmlPyi8REB4qSR3btXGFDhyUP5nZ/VDfVVH1+2gWy8YQL4aMpKi9lCoVonyKuQ7 KQKXchOJMl0b1f/SFtFf/eMabntwjHA/pUux/MPkrIDHIaqxD1uIg/MPeB9jg41IXSEL uNnveJahESJ4znzfR1zxtoL6uzXsJXKPSjnU5ev9MM71og3JMAnK3wCgVErXrf32Wyfg EWC7mQEBg8vBpuO9yLyZTQjgW81OP/0/Gqx7X6VvDd5guRf3qTx+E9es23a8r9rI7pYZ tXYha1W8picF/fYCG3Ujr41tF5gL4ArPAtr3jnw4i6Vw6FUq3jWdxsIjkdAB48ORC69g nA3g== X-Forwarded-Encrypted: i=1; AJvYcCXWK1nM2sLdWe0Zr+m5h8bw2UB7G0PkvfzrJZ996CSWv+UcAW9ca3dHzMJjPfjBsy9t+PiPFwjYth+66akeWD1Ltl7+PrCBmwHQkCdl X-Gm-Message-State: AOJu0YxMKIoMmP4dSRO9EUCGoXMBzgMgawyXYqZEEum13ak+7FVtcuqt OtG5nbMxnoXLtQviND0BeHiSP9rhPK+ianOr+w096POVtJBkU96Cu9kYMrDhVao= X-Google-Smtp-Source: AGHT+IFg1ehXZz9w6GoGvEWU+n/J/Z6E+G0lahpjmT0VcsXojamezh1lQriskRTyuGcovOQMhHnIJQ== X-Received: by 2002:a17:90a:8988:b0:29c:7697:d2dc with SMTP id v8-20020a17090a898800b0029c7697d2dcmr11491534pjn.4.1712676284393; Tue, 09 Apr 2024 08:24:44 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.194]) by smtp.gmail.com with ESMTPSA id ev6-20020a17090aeac600b002a513cc466esm3945558pjb.45.2024.04.09.08.24.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Apr 2024 08:24:43 -0700 (PDT) From: Jens Axboe To: linux-fsdevel@vger.kernel.org Cc: brauner@kernel.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk, Jens Axboe Subject: [PATCH 2/4] timerfd: convert to ->read_iter() Date: Tue, 9 Apr 2024 09:22:16 -0600 Message-ID: <20240409152438.77960-3-axboe@kernel.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240409152438.77960-1-axboe@kernel.dk> References: <20240409152438.77960-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 Tested-by: Marek Szyprowski --- fs/timerfd.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/fs/timerfd.c b/fs/timerfd.c index e9c96a0c79f1..f0d82dcbffef 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); @@ -312,8 +313,8 @@ static ssize_t timerfd_read(struct file *file, char __u= ser *buf, size_t count, ctx->ticks =3D 0; } spin_unlock_irq(&ctx->wqh.lock); - if (ticks) - res =3D put_user(ticks, (u64 __user *) buf) ? -EFAULT: sizeof(ticks); + if (ticks && !copy_to_iter_full(&ticks, sizeof(ticks), to)) + res =3D -EFAULT; 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(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 Sat Feb 7 18:15:51 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (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 0CB1C131180 for ; Tue, 9 Apr 2024 15:24:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712676288; cv=none; b=iGq2cb2JiA3so9vJe8WZyn79klPd/Uxl1RkpnY/O/310nmM9rMOdPDd/F54vQ+Am0Z5+4V7ptV5J02GN5NlyIyuhJaekS/FWXE1XbvUkUsQKBN9WtciVyz3ItXMiyoyFLEqy8FkTPtOFNHJS5BjzTLjubzezkSBIFBaoMzT0SIY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712676288; c=relaxed/simple; bh=SrwS5t0A/frD/26uRx+Jc9vqADKXdR1SqDkgRp7UW5U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iH6/xDu5jdTkKZLPaL8XcuJFTYuWdV8OpDFFtPy7TpoHrHMwQ+wxqe3Tc+gaQmoLnEBHNy/VTlZVX17n5bQ2PJlvySFmM0NaiQepvu7uQbM6XWS9NhN9BuqMeWMPL8AS3EgXlRUZMh2REqV324RPNwqg9d8FILhtgGwJDxUOxlY= 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=DD5j8TQx; arc=none smtp.client-ip=209.85.216.53 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="DD5j8TQx" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-2a2fbbd6cd6so1443518a91.1 for ; Tue, 09 Apr 2024 08:24:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20230601.gappssmtp.com; s=20230601; t=1712676286; x=1713281086; 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=qBpHmg++FZ+uTrxs+NJvN18MokFvXNNYYZk1ttpqZ54=; b=DD5j8TQxJOA1rG7A3o/nVkRWRiknoNdTZqRPmBsuQbtosqXUcSHzBKwmOKnC91xrcF p4BhnRRTV4c374D3xq0BM++BSgvVj+E/6LGpW4Af2+yh3Ea3XOsQvhxkzLiCi749C1pL VIJy45D9YqYyhmPozb0neMqflgEIWj1MgUCMWXscHE0VZtdZcx6mzQa5WJVAhKQC673P giiIbUZWQ1OtuKNo0jrG6IqbwVenjy7EYOJvLLRPAf3CYgZZAC5FB8ZG7msQ5nw+YECh UlJaZu5rVMnZPyPlD2nqZzvTJjgW13f6n13Zssu0M1Lzto7dIBmlWjWhOKQjRc4mAnBv 4EoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712676286; x=1713281086; 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=qBpHmg++FZ+uTrxs+NJvN18MokFvXNNYYZk1ttpqZ54=; b=CznwC+ACovYzRMWM44ehOZmZMA2PcbDIF7x26+/ENO7B53G6h4NNSA+VtOaFP8YaFI 2btng4YYv1qF48k3U/aSjzTLxKNYVgm3xvJxWXdc1mjc+sVDRcJYhCNX0AU0ZKwuYscO UPGergy+Svrz0JMAPHJLNfXSM8bmgdueqssB4LUXGMgp5vxvKDNU3YHcT0rxT8fLRZaZ 914JqfT5HkRg9xrshDAjPgTingcN+ipwYiZBb1mZho+P0TMqWI7hwvq4gEtOoPdOz9EI AD0PjGB7E1eQKVUtgt/DFI+4EU/nVTHl1gZx4VIFWRZrUPvHDY4tcCDCiA76qQenuCv+ hY1g== X-Forwarded-Encrypted: i=1; AJvYcCV8EgzcVaX3xO5V0kzQcC22O1EtksZBgIryRUJ1uZ744A0cToOk7rLPR/tpBe8rKbdRZfK9WMDregzY+R6RKIE9RUEyXBk6TM37/qrQ X-Gm-Message-State: AOJu0Yz5yg7YjMi/7WNvlL21ki0Dg9DLfGYdpMS6feBOAGuZS4dxvBt3 nJvfSP6wZ0LONjC/cp4eTHR7B4bBybQD778TXGBkrNPH2S2vqmEvLnOgshGgkR8= X-Google-Smtp-Source: AGHT+IFx8dcTbqDzFCan3ii9R2GHt4JMXo2F485r7OyEJ/SyoJfy7yn/PVNWNnHSKVhaATGXZzTJOw== X-Received: by 2002:a17:90b:3cb:b0:2a3:be48:23f3 with SMTP id go11-20020a17090b03cb00b002a3be4823f3mr10932902pjb.4.1712676286340; Tue, 09 Apr 2024 08:24:46 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.194]) by smtp.gmail.com with ESMTPSA id ev6-20020a17090aeac600b002a513cc466esm3945558pjb.45.2024.04.09.08.24.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Apr 2024 08:24:45 -0700 (PDT) From: Jens Axboe To: linux-fsdevel@vger.kernel.org Cc: brauner@kernel.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk, Jens Axboe Subject: [PATCH 3/4] userfaultfd: convert to ->read_iter() Date: Tue, 9 Apr 2024 09:22:17 -0600 Message-ID: <20240409152438.77960-4-axboe@kernel.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240409152438.77960-1-axboe@kernel.dk> References: <20240409152438.77960-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 | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index 60dcfafdc11a..6d963402c835 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -31,6 +31,7 @@ #include #include #include +#include =20 static int sysctl_unprivileged_userfaultfd __read_mostly; =20 @@ -282,7 +283,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 +1178,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_full(&msg, sizeof(msg), to); + if (_ret) 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 +2173,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 +2193,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 +2217,26 @@ 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(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)) { + put_unused_fd(fd); + 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 Sat Feb 7 18:15:51 2026 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 C50F213B294 for ; Tue, 9 Apr 2024 15:24:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712676290; cv=none; b=VjHywR+3fhwDeqwZLCQh1m/+DE83m37c6cVPJrzcq/2IXeKTh0W9royRDxBXju7ccUnsNx2I/btgTYemOAtcjV+v2RsUKaRO6oLQOZolhk32AnRb1p4AJRGOF8j4LEztOY2e30/cgXx+HhIAtrFHBOgoNkrDHVv7Yx7UwkwmECI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712676290; c=relaxed/simple; bh=Efu3b8ru21S0lD5Y5zsjwcGOYAOC7NOARCbE3B0sUCI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tWxCGIT/T4Yt4OWN/3uTq1/f9nimh0b1elRb38JbdVab1vMPoiXKJB8LUuiT/Y4sDLRehd5mPZIbKSlfpM3Ay3LCGhHKUuF4g3FPy8Y6Y4QPNaTfVZUcVuU8cLw15QkQLeQ4jiUsWBwoGYbXA0mY9IKbNKOPLopdPIVBxDKVi18= 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=gwF1hrwX; arc=none smtp.client-ip=209.85.210.179 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="gwF1hrwX" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-6e694337fffso1158905b3a.1 for ; Tue, 09 Apr 2024 08:24:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20230601.gappssmtp.com; s=20230601; t=1712676288; x=1713281088; 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=E0BoB0+iqRCepoqzaDLrQ1/6U1zOxuhY81V8gRabkwc=; b=gwF1hrwXAiD3TmmIefe+QCwKV9T0Q4UGEbgqoReYIXQhDnZ77cC/Jwv2SenUcMKQ6t VgmF8DNK6gmpLaZwxApHJMECImF9dgNWIsB9ulXFBjB0YhdIrhWwS/R+NXX6ElDwSlHH rKHgFeJLTR4emwluwfSP7VJBLXDcBNKAfQjQcXVBY2xNAMO4la/AFn9logRz+f48My5t xppTDBGUFY8SYfk/cAJ+rOoa+v3XZ6pDRKbQcdiEGQDRuELzcRPzurbYlG64vKCRtM/F 3zt1REap02THPzQJRTWRx+LtMUiovxyk+SjFEBGoIupnO4VcS1rabJWQos1EL1SbkZ7R YX8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712676288; x=1713281088; 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=E0BoB0+iqRCepoqzaDLrQ1/6U1zOxuhY81V8gRabkwc=; b=e7dKqSqj9o9NTwJz2sT/NbYZ1oAZFSB+uGXGkGlrOAboao+/q06EHR7oTC3P/W5KKq 2Kl7U1anbDBiU7vmlN5j9flRvdbd6h/MuxZFlvsvpk5fjiykjK+3KmmLyllGoDN9b4/M etH9+5/tiESli1R9nn3tQHf3/M/RTpKar6AiM91HOyIeIcCWFzOncdw5TaFsuilN6Rfg bKY2Z/khtu2O8OsSBmVPMOI61zzcmkhhQFKOKuwgligXRCSuC+mlRbEev7u4x/RKYrkW DR9SuggqRpIhHlQ6U2BWHfALIpo+lNajChPMnLdvY9HrNvIsAAO2WOO6x0XDMEkywLJV Josw== X-Forwarded-Encrypted: i=1; AJvYcCXLzJmoyf1+tXjeNexp1OfGcb2JpTfomuiRck6UxqWrUlipA2gbebGniaR7V1+H1cMXGzR/AN3/mjrY3inTz7+YIToe8WBJvhE7Q7UT X-Gm-Message-State: AOJu0YyhMIxZtCJsGbWfrBPo5evxlxYfgPy8HwPzloN3OnWACc7pcPgn we85udLt6Y0nxvzRyZHmoX0MG31p2rMvKnvq9+Xsq60E1Y6ejxmZp2D0COA9ZIs= X-Google-Smtp-Source: AGHT+IESaWswrduf3sLVbA5ib5/pMDBwW8iN7ZUU3AI4oslIDVZKjcURQLDu0lwwVU4+E5t/zf46CA== X-Received: by 2002:a05:6a20:4323:b0:1a7:199:8ac5 with SMTP id h35-20020a056a20432300b001a701998ac5mr151095pzk.4.1712676288122; Tue, 09 Apr 2024 08:24:48 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.194]) by smtp.gmail.com with ESMTPSA id ev6-20020a17090aeac600b002a513cc466esm3945558pjb.45.2024.04.09.08.24.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Apr 2024 08:24:46 -0700 (PDT) From: Jens Axboe To: linux-fsdevel@vger.kernel.org Cc: brauner@kernel.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk, Jens Axboe Subject: [PATCH 4/4] signalfd: convert to ->read_iter() Date: Tue, 9 Apr 2024 09:22:18 -0600 Message-ID: <20240409152438.77960-5-axboe@kernel.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240409152438.77960-1-axboe@kernel.dk> References: <20240409152438.77960-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..4a5614442dbf 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,10 @@ static int signalfd_copyinfo(struct signalfd_siginfo = __user *uinfo, break; } =20 - if (copy_to_user(uinfo, &new, sizeof(struct signalfd_siginfo))) + if (!copy_to_iter_full(&new, sizeof(struct signalfd_siginfo), to)) return -EFAULT; =20 - return sizeof(*uinfo); + return sizeof(struct signalfd_siginfo); } =20 static ssize_t signalfd_dequeue(struct signalfd_ctx *ctx, kernel_siginfo_t= *info, @@ -199,28 +198,27 @@ 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++; total +=3D ret; nonblock =3D 1; } while (--count); @@ -246,7 +244,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 +263,34 @@ 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(flags & O_CLOEXEC); + if (ufd < 0) { + kfree(ctx); + return ufd; + } + + file =3D anon_inode_getfile("[signalfd]", &signalfd_fops, ctx, + O_RDWR | (flags & 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