From nobody Thu Apr 2 14:07:33 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 12A7C35F189 for ; Fri, 27 Mar 2026 19:57:44 +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=1774641466; cv=none; b=f7ON95lJD88YWUr4SILxC9iHIJJAcr2AlquPd2el+BB76fS8Q6o6Zamge1SH1+oPonXFR9JH0xTvrjDu9IxkPstBL2MtDYz3sQYN0oLq21VTo21DoG0p0g+u635TTJEww4Zhob09IBha59dXlegHxAWePALoFKFMoJnhGNSxvms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774641466; c=relaxed/simple; bh=wz1OGCVcy0nrMSQ5p8MWSwMy2j3Y/e0VxNE08nTwkgQ=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=l/VOnWjpUKex/R0cmhMgANhU9mwLW8DXQsVPl0Z+X6Y5nnGmPBdbUBYJXZYOUeMgwsGhTjo/KdLytb1V8oS0GKvO0g/KL/hKNE36X4Nr+UYOyAHd65wtOr+im8vcNJz4tVaS0z9LIcprT2Kndex+2aXC4Yow4pO0uf32Jo2qtg4= 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=JHOicVq2; 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="JHOicVq2" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-48702d51cd0so28831875e9.2 for ; Fri, 27 Mar 2026 12:57:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774641463; x=1775246263; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=ZFg98qZ3lCCSVt8lr34pw3VzQMgyzjSNpkoFfcv1k64=; b=JHOicVq216V8imKWWWXk31m3ubCPVrq5xQ766X8vWash9tf78CgO09vC5Xnwv7di4+ 6nAY2dEIAP2J5kQbmfzESTT6oyZEZKoBi2tvyHzCjpjrP7PlZPeM60RIm+puJMt/nmxE /N3G+Ogdjy8Zw2SgN6GQOO2hJYbeu42VCyPOh3cjNJxqvh9dVD28bCfSEKsC0lFatTj7 82niPltrBBE3J/ihlgwPYseGtJJMt/iKdplmwGzkiLrxcb06mI/0wYDK1meTDL3GyD8b ybfwvaljHWqCfn5lTWqO5TufoCiGQM3HzOlDo6FmBLAzp3pANJwtZn+6vdUQrXpjbhHD KFVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774641463; x=1775246263; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=ZFg98qZ3lCCSVt8lr34pw3VzQMgyzjSNpkoFfcv1k64=; b=g5Nmam0M0PNiBkZkK9cxUsUtEL5ynkt7gMFbD8nC6jG/Z8CA3/ZdoSR90eCGtzw0Bb y+gaws341kxC8uDRpjzOUPBJuMGQXM2ZhuzS6w4oDtSBGlufiqlUbf8b9sVKzWkorDRo nULJexFkwfYhpO2UnPSpIverM+snI2E1zqO0/dLsbPbUi9PZFjjAgiZXw+bd93ZbbbSd FOCyb16m6uKOWBoXddphtKx+yvNkkgnK1TghSDaPslyinZCTcOqsyGL2w79P+V+K2Zwp 8Ubr/catEK661uVmflBCQU3kSiY0pCda3MPdm/zF+gUo4bu84lwDHVYxf71/+yx7EhHj oq7w== X-Forwarded-Encrypted: i=1; AJvYcCXnlbOdbEoPAziBwQXZDWJfloUABoe/8SxDlTytn9bG6VvAS+HfBY/gumlSyO/2FypUOClpjEHNGWg7rA4=@vger.kernel.org X-Gm-Message-State: AOJu0YzwXwKwPPyE+cOQR2j6e+WvIMgOHhN1zposXIArLgHEJzvS+pe9 QWqkjvrAqge8X16BuoTZ6z2FXhIbYdkXm9KPWXMa0ExAa74Sq9eO6pyy X-Gm-Gg: ATEYQzwXGTmfS87orWdC4QtEN0bWzpw7efl84wSIgUDYSQp3z5aIQhzoCd5oDVhWCGl UpRQbNfAnLC2BpWIN17l6jDwco3JjKPmMDeYgsWlXnRqo/m25qjb21kOK3IM5qiisiv0zC/NWg0 E1M9Kmxk38jzjb23FV+lMqmX+UWMtuLFqLKMnqg+pVgbnN+/dTM07WUHx82rK6j8RKx24nyege4 lzTcZXYcvEtIBcH/ennFPDHuNisXuAT3XOAQOFTf/bZVYYpzuiSP5U4sTjsW0fOd4qpMuzm3Yq+ Us09JMv6DAE2coarZtfQMGZQJDg5S7TLbTzzvLzsU5b0tCJ4Re7/ndwa3xHM8EdpUzsMvMC5zgt Gv4bytUjIV9y8XEVZaHq0zd8LZjHGyGlE1CSgbl1v6xjTMqMEUKhRj2foK/D7xlJhOborG6ZVz9 An5EcS0bxN2SFCcFWva+5bZqeQr3Y3h7bxQofmoDFa9Gv+ZNcY62TxgTfyuMVSDKRxMUSDTQf8S lqHTzr5dA1E X-Received: by 2002:a05:600c:1d15:b0:483:703e:4ad9 with SMTP id 5b1f17b1804b1-48727ee9b10mr63168225e9.19.1774641463293; Fri, 27 Mar 2026 12:57:43 -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 5b1f17b1804b1-487306acb47sm3065875e9.15.2026.03.27.12.57.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Mar 2026 12:57:43 -0700 (PDT) From: david.laight.linux@gmail.com To: Andrew Morton , Kees Cook , Andy Shevchenko , linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Linus Torvalds Cc: David Laight Subject: [PATCH next] string: Optimise strlen() Date: Fri, 27 Mar 2026 19:57:37 +0000 Message-Id: <20260327195737.89537-1-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 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" From: David Laight Unrolling the loop once significantly improves performance on some CPU. Userspace testing on a Zen-5 shows it runs at two bytes/clock rather than one byte/clock with only a marginal additional overhead. Using 'byte masking' is faster for longer strings - the break-even point is around 56 bytes on the same Zen-5 (there is much larger overhead, then it runs at 16 bytes in 3 clocks). But the majority of kernel calls won't be near that length. There will also be extra overhead for big-endian systems and those without a fast ffs(). Signed-off-by: David Laight --- For reference 'rep scasb' comes in at 150 + 3 per byte on Zen-5. I've not tested any Intel CPU, I don't think they can run a '1 clock loop' but the change might improve performance from 2 clocks/byte to 1 clock/byte. I can test Intel up to i7-7xxx but don't have any older AMD CPU or any other architecutes (apart from a pi-5). Other architectures may well see an improvement. If only because of a reduced number of taken branches. I did notice that arm64 uses a very large asm block that is clearly optimised for very long strings - I suspect the C version will be faster in the kernel. lib/string.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/string.c b/lib/string.c index b632c71df1a5..31de9aa86409 100644 --- a/lib/string.c +++ b/lib/string.c @@ -415,11 +415,13 @@ EXPORT_SYMBOL(strnchr); #ifndef __HAVE_ARCH_STRLEN size_t strlen(const char *s) { - const char *sc; + size_t len; =20 - for (sc =3D s; *sc !=3D '\0'; ++sc) - /* nothing */; - return sc - s; + for (len =3D 0; likely(s[len]); len +=3D 2) { + if (!s[len + 1]) + return len + 1; + } + return len; } EXPORT_SYMBOL(strlen); #endif --=20 2.39.5