From nobody Mon Feb 9 10:24:23 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (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 4527C1F03CF for ; Fri, 21 Mar 2025 22:46:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742597177; cv=none; b=W4mC+sFs+7cjFvh0g7EvWBq4X/sNKSbzJ4cv2sHMUrywTDpIY2LUyn/RPjg8DrQwKjHxPHy2sqqtDwx1ILYYq2Gk7d25vEH5womVhwcG9vY+8flKZP/sSYDnW6QExCOAguV/QGfR3dA7CISUiEpYplrEfLPAL1RThxdGF136bZ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742597177; c=relaxed/simple; bh=czu60cFDRiNDyr+bONepwvYfmABNw2z5ZOxwBZ81kJ8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=qXMuJITWWv9Gnd9mNa15NgWDppYq24e3Aw8A8eP3RuTTzYu/r73xqFM4Udv79/KNytJFCrIODvgKt7vSF7jVXLLU4IhbvNXUyXv6i0dWf70on0nbegiS1B2iwoxxqZgIhmu6wMB+gllWwVXgLNrU0afom2zb6K8/2KOOubjy3C0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CCZrenZD; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CCZrenZD" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-43cf0d787eeso26264825e9.3 for ; Fri, 21 Mar 2025 15:46:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742597173; x=1743201973; 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=5SFb1UWZHNq6ESZ+rORIrqyA0Y2J+NdSM2LpSrRm5nA=; b=CCZrenZDme/wPuW1tGkv+xyqUs+fvIDV9GV5sLxDHuon8y5+qw5GsvLrBmSfYS9Xbv oOaQeTB0AMV6m7YGDiGqqRBZTZNEr5r08mmCxzYlaPBz/nnZuA2s+jx5VlQRzD+XJ2x3 9jU1CooJwNvuv9YYYW68x55M1u+G31Eumgo4uGCvGV8Z+6w0T+RPoYpxLvfJgtcmVyyv HBi1ZN++Mc/5+xrm9O+SY9QMF7wUC4VEfi+80FAeWt41ijNNxpar/UTNpQ6dQ1sOo9Af ctLCYBunVExgX+3i3JgJ1HVkIFnNthuX2Wwn7jMmwPmNjM6lm7vFAiz4l6H2HqsodA9v /HXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742597173; x=1743201973; 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=5SFb1UWZHNq6ESZ+rORIrqyA0Y2J+NdSM2LpSrRm5nA=; b=ou1Jcm5lQAzWtDVwBb73s+GZAaBD21cy599Uqa3awPvhPH060/waMSqiWbz3uJwjZ9 OnF+WxeuGm9SEqhyeLztBz0wYKYF/7nZqsVnVoQchgVWTLm4l0Ozw9GGIsaefiAUnOsS aLaqLQG8EYoAeimE+p2aktgLIDc6C85NoJAdMCKAnGbeZadE6Td/cgNY2oSC4RxwnDBh UdowqpJ6pEdt8FSEF0qZ75vr4OwvSIp9h1kxcIZ2DJT2rZYZjkzWHhvPRiBi+Y2ZfSa/ LhkGndjtCvh0EOgPtZRaBq+gYci3tUuvTVZpJ1mhgxDIJeazaqin3s8LVHC/JV+ldEui pWsQ== X-Gm-Message-State: AOJu0YxYe5mftNJj/kdjT9Z8soaEilOxnHtfW2prRtVFu2FQAULyufWN p6ks7W6dGu2/+tol4UEt64tpLrQtSVHhCt9MLHZttNJqx2i01Dp5Z09VuA== X-Gm-Gg: ASbGncvsgS+H12MqA0reSSTPXtZr4UmIuxU2/gHlxZ+f61fNOQci9zrGqvfymodFIza Cu4v2nxMYEtDXNeg02iVyqr4sxolpgqQlKamIKOmXvhwl5Ty3csN6pMeS1vU3XieiLWBhwf81yM jFsYb762aB4/m9CXgyfrNSyCRq/n/pjol8i3F/BESvqQZtznAZ+V6DjpNTi1D8QhLL8IBUI5N0p KyMcEYUYesBPXmWTnUDb9TBUxBHMlEAxV8flop0S71r4TdhRw0FViaugYO/n62ha1YzYInn3odk QXQ3TqM4hXWRApLbWd7M5P+PHqqupa8c8cSU6DkpvtZ1CG3bwvXlx5WxNg23FwcZot/THeHna1U /6xsC+nalrpy3nq2Euzujtcfl6w== X-Google-Smtp-Source: AGHT+IGKyNrpOlekTzBlxKIRCQ2WgvhzjoEecxPjJYME40UxhBjKkInj5NLRBj5EemBwG0ZjPMDSQg== X-Received: by 2002:a05:600c:c8e:b0:43a:b0ac:b10c with SMTP id 5b1f17b1804b1-43d50a33b40mr41753705e9.26.1742597173156; Fri, 21 Mar 2025 15:46:13 -0700 (PDT) Received: from snowdrop.snailnet.com (82-69-66-36.dsl.in-addr.zen.co.uk. [82.69.66.36]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3997f9a50c1sm3609957f8f.38.2025.03.21.15.46.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Mar 2025 15:46:12 -0700 (PDT) From: David Laight To: linux-kernel@vger.kernel.org Cc: David Laight , Linus Torvalds , Jens Axboe , David Howells , Matthew Wilcox , Andrew Morton , Alexander Viro Subject: [PATCH next 1/3] iov: Remove access_ok() from import_iovec() Date: Fri, 21 Mar 2025 22:45:55 +0000 Message-Id: <20250321224557.3847-2-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250321224557.3847-1-david.laight.linux@gmail.com> References: <20250321224557.3847-1-david.laight.linux@gmail.com> 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" There is no point checking the validity of the user address when reading the iovec[] from usespace. It is checked again before the user copy itself. Added in 09fc68dc66f75 (iov_iter: saner checks on copyin/copyout) Signed-off-by: David Laight Reviewed-by: Jens Axboe --- lib/iov_iter.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 65f550cb5081..623ec43e049a 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -1471,13 +1471,6 @@ ssize_t __import_iovec(int type, const struct iovec = __user *uvec, for (seg =3D 0; seg < nr_segs; seg++) { ssize_t len =3D (ssize_t)iov[seg].iov_len; =20 - if (!access_ok(iov[seg].iov_base, len)) { - if (iov !=3D *iovp) - kfree(iov); - *iovp =3D NULL; - return -EFAULT; - } - if (len > MAX_RW_COUNT - total_len) { len =3D MAX_RW_COUNT - total_len; iov[seg].iov_len =3D len; @@ -1528,8 +1521,6 @@ int import_ubuf(int rw, void __user *buf, size_t len,= struct iov_iter *i) { if (len > MAX_RW_COUNT) len =3D MAX_RW_COUNT; - if (unlikely(!access_ok(buf, len))) - return -EFAULT; =20 iov_iter_ubuf(i, rw, buf, len); return 0; --=20 2.39.5 From nobody Mon Feb 9 10:24:23 2026 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.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 34E99210F53 for ; Fri, 21 Mar 2025 22:46:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742597178; cv=none; b=HFmhQmmE/WBUutrwaZJc6purqCdn1fDihgOUWxXvvnv1R7Ip+vr4apAkdGXfOyFssvPy/J6K2lHjifkIXUpzwOkK7T0EDawfxnWyfBLYOSZhgGeKqHfanpvjXqOatQ8OsPFTq7jxMwKniLf0zdv5XJvna1bPZC39bD+7NQ0VYgo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742597178; c=relaxed/simple; bh=WgokdCBpH1SKYYWqDCWkpVV7Ru3JbBRFVHwjLClVCWE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DRkN0Qph+Y5UvnA2VcuYEh1AOpaHyH9aaFqcIQ2SuJKm8g+Xy2jLFQvLZ6Ele24/NrlCCHZlVUf+1AFmZpzy9vbvPEZsgKhaOZEEFlPzG6+7LPrLBakk12FnXq6i77SWXKtr4+NN5DYROXkqrcL5aFBn2brEccVBudM6gAW1zIA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=juzFt8oQ; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="juzFt8oQ" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-3912baafc58so1998090f8f.1 for ; Fri, 21 Mar 2025 15:46:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742597174; x=1743201974; 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=DQmTrN/MYIaz61wV3rB8q72p/Trt8rPHuowrU2WUSuc=; b=juzFt8oQ30WFLa2IcJ+phfrPt2LdsNiedj21Kf6tLpHLjSvyLsTRR/FXwp2mvMkNDA Iqq6W7U7FHk5v7epvKiP2hzrjBEnkclUwT6TXdy74+CSHyyIeNlq+2QzH58lBfJV6lNl 2l9jyR815jZngwpXuPbIgxqro1XiHid5QOFMRRMDSUU5AvOyU00o5fbz4iQXGJ6BKEh7 F5frNFd3M2tyTnjHTP6f3aEppUaTigv6IPw8g6QRTyvuznOsavf2Uzl+8UKF8Y/g6wC4 RS2w6ixut6/X9+raShk/+sGeKzrDRvycTg8MTU6MBY0sweY9EGsFoMgxrveVCs0GkQHC gW7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742597174; x=1743201974; 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=DQmTrN/MYIaz61wV3rB8q72p/Trt8rPHuowrU2WUSuc=; b=HfhgM6Gk6H5nlbjWvOTVwNVTFRqIdIbHStj7bdceVgzuWGTWzTMzkQDEhOs9VA55rh auBCkMSuP3eOub5tbMklahpeF83ubu9OEVJ7WDfO1rdBuyag57OMsKJG3FNzD83H+a92 b8Llb3kXQuc/1eE04XqnRktuWRQ2NAle7jMV/EC2topgj3/oT1BtNot6EDiBLF6h91dB YSqpE9qVJtdiyQLLuyb1xxFjphReY79O3Q0+WLV3h+hLiFOmS7yGEubAFJvuEzNxI0nD bdeL9HBAbFaDtc7ySgrHnY8wH575+xTAgSlXeRg/w6+OlwYondpPbskIQP+K49aEaR8y kNgw== X-Gm-Message-State: AOJu0YzW+PGDU7Or8mFe6YK0t9dzh+6TrP2WtJXjYrVh7uMxy0v7NShy 5VUnSoWoVX3Jn7VJDrYcpzV8pSwTgWqVFRSqiAcFswq0KT1UaQc7i1eAOA== X-Gm-Gg: ASbGncuc/jbHTeIIoqSR31wdgPGzV9O+lTCNi0atBI14Lo/U3a3YDOWbkiTo+LgChoR uL6EzQvgeWGh3Wt/exWrbBHjdep+ZoKF2FsbVfSjJHSzTj2ojom8AnbpHxX7QEWWPtrSm0mUJyl CVBjsnKUqUEcUO0EpQcdrjW1Pj3cPqSuWIlKKJ+xXvdEzi5PZ9RzPa1157UKC3kfe6fQSWj4J3w XAlYy8uyQHXMhHV/pmqZ0ugJqlt7kazN1UHBseFaFs+Q118lPrbOhwZD5ZE5zyZyiAK32v6xdPQ M3I17csQ4ej5MfEuCQUC/FmxQRUTXJzmIMrvQLje4N0yDx7DmJX8klXZDRUO9HSXfUCifPCJWCm klsDbrmVkec/aPZ9bdmLFwlSOEA== X-Google-Smtp-Source: AGHT+IHAmldxguLvSK3rp2YlKW4ClhOc3VIriyBs2Bw5LbVwUxXNvn6V3oJbajqiNzBalAsRyrE7Ag== X-Received: by 2002:a5d:5885:0:b0:390:f4f9:8396 with SMTP id ffacd0b85a97d-3997f912d09mr5616659f8f.28.1742597174212; Fri, 21 Mar 2025 15:46:14 -0700 (PDT) Received: from snowdrop.snailnet.com (82-69-66-36.dsl.in-addr.zen.co.uk. [82.69.66.36]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3997f9a50c1sm3609957f8f.38.2025.03.21.15.46.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Mar 2025 15:46:13 -0700 (PDT) From: David Laight To: linux-kernel@vger.kernel.org Cc: David Laight , Linus Torvalds , Jens Axboe , David Howells , Matthew Wilcox , Andrew Morton , Alexander Viro Subject: [PATCH next 2/3] iov: Use masked user accesses Date: Fri, 21 Mar 2025 22:45:56 +0000 Message-Id: <20250321224557.3847-3-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250321224557.3847-1-david.laight.linux@gmail.com> References: <20250321224557.3847-1-david.laight.linux@gmail.com> 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" Check can_do_masked_user_access() and use mask_user_address() or masked_user_access_begin() to optimise user access checks. Read iov->buf before iov->len to ensure accessing the 'masked' address fails when kernel addresses are converted to ~0ul. Signed-off-by: David Laight Reviewed-by: Jens Axboe --- lib/iov_iter.c | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 623ec43e049a..796ef647bff2 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -19,12 +19,15 @@ size_t copy_to_user_iter(void __user *iter_to, size_t p= rogress, { if (should_fail_usercopy()) return len; - if (access_ok(iter_to, len)) { - from +=3D progress; - instrument_copy_to_user(iter_to, from, len); - len =3D raw_copy_to_user(iter_to, from, len); - } - return len; + + if (can_do_masked_user_access()) + iter_to =3D mask_user_address(iter_to); + else if (!access_ok(iter_to, len)) + return len; + + from +=3D progress; + instrument_copy_to_user(iter_to, from, len); + return raw_copy_to_user(iter_to, from, len); } =20 static __always_inline @@ -49,12 +52,17 @@ size_t copy_from_user_iter(void __user *iter_from, size= _t progress, =20 if (should_fail_usercopy()) return len; - if (access_ok(iter_from, len)) { - to +=3D progress; - instrument_copy_from_user_before(to, iter_from, len); - res =3D raw_copy_from_user(to, iter_from, len); - instrument_copy_from_user_after(to, iter_from, len, res); - } + + if (can_do_masked_user_access()) + iter_from =3D mask_user_address(iter_from); + else if (!access_ok(iter_from, len)) + return len; + + to +=3D progress; + instrument_copy_from_user_before(to, iter_from, len); + res =3D raw_copy_from_user(to, iter_from, len); + instrument_copy_from_user_after(to, iter_from, len, res); + return res; } =20 @@ -1326,15 +1334,17 @@ static __noclone int copy_compat_iovec_from_user(st= ruct iovec *iov, int ret =3D -EFAULT; u32 i; =20 - if (!user_access_begin(uiov, nr_segs * sizeof(*uiov))) + if (can_do_masked_user_access()) + uiov =3D masked_user_access_begin(uiov); + else if (!user_access_begin(uiov, nr_segs * sizeof(*uiov))) return -EFAULT; =20 for (i =3D 0; i < nr_segs; i++) { compat_uptr_t buf; compat_ssize_t len; =20 - unsafe_get_user(len, &uiov[i].iov_len, uaccess_end); unsafe_get_user(buf, &uiov[i].iov_base, uaccess_end); + unsafe_get_user(len, &uiov[i].iov_len, uaccess_end); =20 /* check for compat_size_t not fitting in compat_ssize_t .. */ if (len < 0) { @@ -1356,15 +1366,17 @@ static __noclone int copy_iovec_from_user(struct io= vec *iov, { int ret =3D -EFAULT; =20 - if (!user_access_begin(uiov, nr_segs * sizeof(*uiov))) + if (can_do_masked_user_access()) + uiov =3D masked_user_access_begin(uiov); + else if (!user_access_begin(uiov, nr_segs * sizeof(*uiov))) return -EFAULT; =20 do { void __user *buf; ssize_t len; =20 - unsafe_get_user(len, &uiov->iov_len, uaccess_end); unsafe_get_user(buf, &uiov->iov_base, uaccess_end); + unsafe_get_user(len, &uiov->iov_len, uaccess_end); =20 /* check for size_t not fitting in ssize_t .. */ if (unlikely(len < 0)) { --=20 2.39.5 From nobody Mon Feb 9 10:24:23 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (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 CCAAC230BE5 for ; Fri, 21 Mar 2025 22:46:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742597179; cv=none; b=JwWzvbexivqgLBOmJ5n+wvTm8s8aIgWx1Ce3ZpL+UpS2FGnBsjemA99BrnAy6zWnOWN0n5jIl2UkCOnYtdV2safOGXP9nQGRnEAhniF0JZPSuXTE96Ichcqe4WGXv1ZvI36j5rzt4YL4k7Uouf34P4FNiUbtoYBwggWlXfzorYc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742597179; c=relaxed/simple; bh=ExwGZv6Rl7okLpEEZnQe7KMbNl4fOCrlEd6OalweAtU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=F8QQcpxcPUl+aOn5XJ6HML0bTocvUdUDDknH82cS9lrYkdgBoodvA0UKrc8BAK74G/U3iH4LvSsGfORMpppT6fhwKuU8fM0xbxqYZyjFakqY6fFfJfSaqLie1hsm84mNhqfEKy6KNLJW703FZ0yLxd4Y4hZoYM2mJyXFsw/dJx4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=aqYlo8MU; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="aqYlo8MU" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-43d0359b1fcso16264025e9.0 for ; Fri, 21 Mar 2025 15:46:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742597175; x=1743201975; 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=xKH9/VHiO9MRo9eLniQYLv14RerMz6rTdd2gdMpmmOg=; b=aqYlo8MUYYSZAAwe+MIoXUjyu5dW55DH2B0znoRqnW7M529J0QOqxIwB1mVDDNk5TV mJFl/lzCEwypeJX8V1cdnGXZhcgpFGoSTtB+6VfJvSFVLUXS6GOzyao60pXylwrkYSwF OGotARmITeTpOoRZV10J+prRIGx8zFF1vGo5BfjRho/KoC5mocLF0D7Dq1t4jUhS5nOm 2KfiPftSUSNl7q5ShKb39wd1w3ylDtPHyBKKUgcxaAyRKt1QeI6bce7902qnBqjs2KVs gff3CAWmNNE5owb6qUAhjcYzYzdiulYoLQu9MgQzGrUBnCukTDSvD6SkpJZCYe9LBcnd dJ1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742597175; x=1743201975; 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=xKH9/VHiO9MRo9eLniQYLv14RerMz6rTdd2gdMpmmOg=; b=Nh8YP4l7yfYp+isOAZJz0pcTDywCoNRG5sJo75Dt3bbZYymUUhq2tTIRJ/yQ4QQHfb PZRApOjfeqy33f/0B9n0PEqgW0C74po0Ptp5VvyMWHygK7BgCCkApwgs/DaQdnOnHvXa zc+f9fbvWVFO054oCM74W084y74/QDfZIXKVEL1Tw3sf7z8AoZLQuH+lEdR5iFWPPcF/ FrZgOg7EahjCHu14fzgEXAxuTh1ZqLGEkbCawu+LtOPcalY1lchXv+v7yO2pI2HYA9WC 7y2I3pS18WXg+wN6554Yns/OmgX3HEwmYskxgHFrguK4v8iqSkbquHWz3WJxv2UG02GE sYuA== X-Gm-Message-State: AOJu0Yy66S41JCuMwEhlnlZSavzWYCpSUcuSooHVdALx+BXSsVkzvvCe c4pYS5WswGX2ycaCSciQ5VDcx4U1fFaM1a+xELVHWTmRlHpHogG3vicYtg== X-Gm-Gg: ASbGncsl6VdCL71/uYvS81pWSPIL+c4tR4G+OzjFSn17PqgFwjSgmoLWYKc1GQpZVDi M/iIdskeW8bTnYvZurDKOX8CVmRquBhrSyo9hBNfz+DD0i9JI0Ve4ax2IxSgY3DTLQ2Ta6TxBie lf8Fk5EJtToETxjcOIwnnO5vV9SIsqEy8DFvUsONoEMQu0ebbh0ec+h55jnQcjIIiBpdOjNYGYf FNiqv+xuMDbaAy6fNS8sqqvVBg5okULK7lyOiV5JN/lQ5WORbEd2kG2uxRnZwj/rXzZi53zO6B6 tlzJXmM0DdvMD/x7s2qbFHGRoU408uX/xO68IRdfQdYfYDt62FRFGGfkal2M/k0fUXVHba18epB W06OEx2QytbiJEYrQ2h59yFyvkQ== X-Google-Smtp-Source: AGHT+IF2FtX0NQn/+Uua9MzkXkpbZ/mS3JCNF+UjhkRJnbOJlEhr7LCQrvYl31jmmpuK6vZQGfeNaA== X-Received: by 2002:a05:600c:c0e:b0:43d:1bf6:15e1 with SMTP id 5b1f17b1804b1-43d542bb8b3mr29143975e9.1.1742597174939; Fri, 21 Mar 2025 15:46:14 -0700 (PDT) Received: from snowdrop.snailnet.com (82-69-66-36.dsl.in-addr.zen.co.uk. [82.69.66.36]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3997f9a50c1sm3609957f8f.38.2025.03.21.15.46.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Mar 2025 15:46:14 -0700 (PDT) From: David Laight To: linux-kernel@vger.kernel.org Cc: David Laight , Linus Torvalds , Jens Axboe , David Howells , Matthew Wilcox , Andrew Morton , Alexander Viro Subject: [PATCH next 3/3] iov: Optimise __import_iovec_ubuf() Date: Fri, 21 Mar 2025 22:45:57 +0000 Message-Id: <20250321224557.3847-4-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250321224557.3847-1-david.laight.linux@gmail.com> References: <20250321224557.3847-1-david.laight.linux@gmail.com> 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" __import_iovec_ubuf() is used to read a single entry iovec[] into the simpler 'ubuf' format. Inline simplified bodies of copy_iovec_from_user() and copy_compat_iovec_from_user() to avoid the overhead of the loop. Signed-off-by: David Laight Reviewed-by: Jens Axboe --- I've left in the assignments to iov->iov_base and iov->iov_len but they may not be needed. lib/iov_iter.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 796ef647bff2..5eff3a307b71 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -1437,22 +1437,48 @@ static ssize_t __import_iovec_ubuf(int type, const = struct iovec __user *uvec, struct iovec **iovp, struct iov_iter *i, bool compat) { + const struct compat_iovec __user *compat_uvec; struct iovec *iov =3D *iovp; - ssize_t ret; + void __user *buf; + ssize_t len; + int ret; =20 *iovp =3D NULL; =20 - if (compat) - ret =3D copy_compat_iovec_from_user(iov, uvec, 1); - else - ret =3D copy_iovec_from_user(iov, uvec, 1); - if (unlikely(ret)) - return ret; + if (can_do_masked_user_access()) + uvec =3D masked_user_access_begin(uvec); + else if (!user_access_begin(uvec, compat ? sizeof (*compat_uvec) : sizeof= (*uvec))) + return -EFAULT; + + if (unlikely(compat)) { + compat_uvec =3D (const void __user *)uvec; + compat_uptr_t compat_buf; + compat_ssize_t compat_len; + + unsafe_get_user(compat_buf, &compat_uvec->iov_base, uaccess_end_efault); + unsafe_get_user(compat_len, &compat_uvec->iov_len, uaccess_end_efault); + buf =3D compat_ptr(compat_buf); + len =3D compat_len; + } else { + unsafe_get_user(buf, &uvec->iov_base, uaccess_end_efault); + unsafe_get_user(len, &uvec->iov_len, uaccess_end_efault); + } + user_access_end(); =20 - ret =3D import_ubuf(type, iov->iov_base, iov->iov_len, i); + /* check for size_t not fitting in ssize_t .. */ + if (unlikely(len < 0)) + return -EINVAL; + + iov->iov_base =3D buf; + iov->iov_len =3D len; + ret =3D import_ubuf(type, buf, len, i); if (unlikely(ret)) return ret; - return i->count; + return len; + +uaccess_end_efault: + user_access_end(); + return -EFAULT; } =20 ssize_t __import_iovec(int type, const struct iovec __user *uvec, --=20 2.39.5