From nobody Mon Feb 9 20:36:10 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (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 B3C402D9780 for ; Sun, 16 Nov 2025 13:01:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763298087; cv=none; b=dtrxSYKu4vRrvuiW6lL34TB1YBmWC5QcmFQf4GJM47Xisgmdedpz2ZB/7K/QVLOcHsDV4EOnuQ15BhOsAxIHQ3Y0nBbvCbIfvqGsXfC2JlCowk7buxc/4tDHPaBY59qcmint1wOE4ZaVxgWFk2qPl/JbAB2U9PKOi7MskiKlqc4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763298087; c=relaxed/simple; bh=IzM2rX93+RHwFR2a+6Yd+RyUhFuyNZo1QK+1Qc3NuLo=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=Aj/WMGZ2xlL3OohTPE1rcHERW+4gbcZ5M+GAarfqCCq1vaofDkfsFdWV6uYWIPA5jf/4czy1rGBuRy6k5JLY68SxbPItPCnUrGH46pkfb8UzicoCPf6++ozBspr2sn/JZHwRpFhGh2uPL8tr3ryV4A1lvYwiftnH3lOOWQl8ulg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gms.tku.edu.tw; spf=pass smtp.mailfrom=gms.tku.edu.tw; dkim=pass (2048-bit key) header.d=gms-tku-edu-tw.20230601.gappssmtp.com header.i=@gms-tku-edu-tw.20230601.gappssmtp.com header.b=TYVAjDgC; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gms.tku.edu.tw Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gms.tku.edu.tw Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gms-tku-edu-tw.20230601.gappssmtp.com header.i=@gms-tku-edu-tw.20230601.gappssmtp.com header.b="TYVAjDgC" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2980d9b7df5so34302845ad.3 for ; Sun, 16 Nov 2025 05:01:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gms-tku-edu-tw.20230601.gappssmtp.com; s=20230601; t=1763298082; x=1763902882; 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=xdEiaivqbt3ZJ9LZRb4AerKCg8xyT7dRU3CkTYVGPyQ=; b=TYVAjDgCeeje9Ncf6ABJgdWntppcgchMEcIGvh26A9XcBaJdHj7B+PrYhFTmbLSHKL XYqkkdP6WRsKoCanhYX5vvEz6mBi/uOAH6kPkg6+86a3c825ctGYYRIw2kK1je5iDLJs TLPRZUB7pmN2+CbFKyeQd0I9pZaT9UIhYofXXoo8W+9FFGa13dmi9wFzt2boPir1QLnl B1i+3pyb9BSIN0iwtAvCCG4+J+4SAIn4Nk9/ta1TvFHywWnohKYFIXRII7RN6C48KL7f WQKIIBcNwPwVF8KzQl72renTdfyS2KUfabLGUUTjQ/91KzvJiAgHs4TH8jzpR67U04ch /l4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763298082; x=1763902882; 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=xdEiaivqbt3ZJ9LZRb4AerKCg8xyT7dRU3CkTYVGPyQ=; b=WP4Ue47toxouBnvc2v1HIiW6LKK4GYSqitJuqAM7HWqMMZs+SLHpIc5RgTsI2EZgKO rZcdxG8CfslCRtlH8LgoZMlMXnKZxvwcg9wH5hicOX77V2r6NFtUS7z3yjFtrikSjt+N a0wPrlMVFyLGqbYpCOHyQZ3859RuQ1+LkH9bEfjVrR8bVWskB56TXFXY8QVb1TzdF8Ja g28A9z/te89rC5BEJJ40ixNfx8lQCpWHl+08hIaCD++gdBUWcrNcQNpGf4voMBV2dLWd cuZ7yXYH6HF7FxTdgeBwYDffBJh7jmbIUT+1Au3c2RviUW3y22xKc1yOISXSSCbEEZyM F5Uw== X-Forwarded-Encrypted: i=1; AJvYcCX5p3r/TBPwsmK2XKg4Nd3s7pb9Wr+RAYzXeu/RQZMYxYkFxZzxy7ZNzn4Euc8IJ5DvVceImPV2eKBcYBA=@vger.kernel.org X-Gm-Message-State: AOJu0YzKMjhKta0jeiNxfsaTITkYdZJeZ+9C98b0oMctBF/G+T4VpCRL 8LwCzL2PzZAFYY4a31kFntHsYH2/U0u7xVgWpygaE77hEKcDYh+9YxGcfogEc5h9PilFNSH4HME BQp+wNZo= X-Gm-Gg: ASbGncuGJlZsvT8ifet4ffTnDkjQvsIPd1TyEuPM2dX4k00YCOjPMZ3etl0VhAUdyv6 6qLczaqqXPiFhxOJCJNnMmbO4N54spu6ft3ClY8JpBiRzY3p48yoGLW2E2rhdVT9RKa4N7cOG5Q /sKmm4jl+c7I8eVWj1jTflHyINP2OmPgfAY/uPOG97f1gCqQp5F98nvm4ijpT+0bzUa9OOSuum0 UxZE+53jOsQrDm2OYylNMX+55e7jZPll91P0qsXbkS/dpwIL/UG8VZ7rHnhMgGzH2wI7VwP9q07 zuI/AHqRHbD1Ja3hEEymxVezHyGFbSeCMk3efDqtVTBvwinzn+zsGgxjSm3jUj9K+s31q0hgw0M ojfvUh/sJ19ug7rnfRfPCHcGLg3vobckJ5/TQ9pgnuHfkYg1KMKYcxbnWH8k1JbL/eOUbjTpFD2 az/ljJgH8yGVX/uI99hOrKwx9q X-Google-Smtp-Source: AGHT+IEstqBjQhXguo6+A7ZemqvPVHBFS3JNn5HflPVWpYARnHN4wPA7VYupnZlAxbgQXvlGaFcVKA== X-Received: by 2002:a17:903:22c5:b0:296:1beb:6776 with SMTP id d9443c01a7336-2986a76a4ffmr98604625ad.58.1763298081806; Sun, 16 Nov 2025 05:01:21 -0800 (PST) Received: from wu-Pro-E500-G6-WS720T.. ([2001:288:7001:2703:22b3:6dbf:5b14:3737]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2985c2cca00sm109379595ad.101.2025.11.16.05.01.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 16 Nov 2025 05:01:21 -0800 (PST) From: Guan-Chun Wu <409411716@gms.tku.edu.tw> To: Theodore Ts'o , Andreas Dilger Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, visitorckw@gmail.com, Guan-Chun Wu <409411716@gms.tku.edu.tw> Subject: [PATCH] ext4: improve str2hashbuf by processing 4-byte chunks Date: Sun, 16 Nov 2025 21:01:05 +0800 Message-Id: <20251116130105.1988020-1-409411716@gms.tku.edu.tw> X-Mailer: git-send-email 2.34.1 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" The original byte-by-byte implementation with modulo checks is less efficient. Refactor str2hashbuf_unsigned() and str2hashbuf_signed() to process input in explicit 4-byte chunks instead of using a modulus-based loop to emit words byte by byte. This change removes per-byte modulo checks and reduces loop iterations, improving efficiency. Performance test (x86_64, Intel Core i7-10700 @ 2.90GHz, average over 10000 runs, using kernel module for testing): len | orig_s | new_s | orig_u | new_u ----+--------+-------+--------+------- 1 | 70 | 71 | 63 | 63 8 | 68 | 64 | 64 | 62 32 | 75 | 70 | 75 | 63 64 | 96 | 71 | 100 | 68 255 | 192 | 108 | 187 | 84 Signed-off-by: Guan-Chun Wu <409411716@gms.tku.edu.tw> --- fs/ext4/hash.c | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/fs/ext4/hash.c b/fs/ext4/hash.c index 33cd5b6b02d5..75105828e8b4 100644 --- a/fs/ext4/hash.c +++ b/fs/ext4/hash.c @@ -141,21 +141,29 @@ static void str2hashbuf_signed(const char *msg, int l= en, __u32 *buf, int num) pad =3D (__u32)len | ((__u32)len << 8); pad |=3D pad << 16; =20 - val =3D pad; if (len > num*4) len =3D num * 4; - for (i =3D 0; i < len; i++) { - val =3D ((int) scp[i]) + (val << 8); - if ((i % 4) =3D=3D 3) { - *buf++ =3D val; - val =3D pad; - num--; - } + + while (len >=3D 4) { + val =3D ((int)scp[0] << 24) + ((int)scp[1] << 16) + + ((int)scp[2] << 8) + (int)scp[3]; + *buf++ =3D val; + scp +=3D 4; + len -=3D 4; + num--; } + + val =3D pad; + + for (i =3D 0; i < len; i++) + val =3D (int)scp[i] + (val << 8); + if (--num >=3D 0) *buf++ =3D val; + while (--num >=3D 0) *buf++ =3D pad; + } =20 static void str2hashbuf_unsigned(const char *msg, int len, __u32 *buf, int= num) @@ -167,21 +175,29 @@ static void str2hashbuf_unsigned(const char *msg, int= len, __u32 *buf, int num) pad =3D (__u32)len | ((__u32)len << 8); pad |=3D pad << 16; =20 - val =3D pad; if (len > num*4) len =3D num * 4; - for (i =3D 0; i < len; i++) { - val =3D ((int) ucp[i]) + (val << 8); - if ((i % 4) =3D=3D 3) { - *buf++ =3D val; - val =3D pad; - num--; - } + + while (len >=3D 4) { + val =3D ((int)ucp[0] << 24) | ((int)ucp[1] << 16) | + ((int)ucp[2] << 8) | (int)ucp[3]; + *buf++ =3D val; + ucp +=3D 4; + len -=3D 4; + num--; } + + val =3D pad; + + for (i =3D 0; i < len; i++) + val =3D (int)ucp[i] + (val << 8); + if (--num >=3D 0) *buf++ =3D val; + while (--num >=3D 0) *buf++ =3D pad; + } =20 /* --=20 2.34.1