已合并到 Linux 7.1 内核中的代码,可能会对仍在 32 位硬件上运行现代 Linux 内核的用户带来一些负面性能影响。这一根本性变更将对 32 位 Linux 操作系统用户产生缓存行对齐(cache line alignment)和 slab 分配大小(slab sizing)方面的影响,但与此同时,它将为现代 64 位计算带来更清晰、更整洁的代码结构。
Linux 内核中 inode 结构体的 "i_ino" 字段原本是一个 unsigned long 类型。多年来,这导致文件系统不得不采用一些“黑科技”(hacks),将 64 位的标识符哈希成 32 位字段来使用。在 Linux 7.1 中,该字段将被改为 u64 类型,从而避免未来继续出现此类混乱的“黑科技”做法。然而,这对 32 位用户来说意味着 struct inode 的大小会增加,可能在缓存行对齐和 slab 分配方面引发一些副作用。

该提交请求(pull request)已被林纳斯·托瓦兹(Linus Torvalds)合并,其中解释了此次 Linux 7.1 VFS 的变更:
“由于历史原因,inode->i_ino 字段被定义为
unsigned long,这意味着在 32 位架构上它是 32 位的。这导致多个文件系统不得不实现‘黑科技’,将 64 位标识符哈希到 32 位字段中,同时也使我们无法拥有一个通用的 inode 标识字段。本次 PR 的工作是将 inode->i_ino 字段从
unsigned long改为u64。这对 64 位主机不会产生实质性影响,但 32 位主机上的struct inode将至少增大 4 字节。这可能会影响 slab 缓存的大小以及字段的内存对齐。变更的大部分内容集中在格式化字符串和 tracepoint 上,因为内核本身对 i_ino 字段并不特别关心。第一个补丁更改了一些 VFS 函数的参数,因此请仔细检查该补丁。
借助这一变更,我们或许可以缩小某些 inode 结构体。例如,
struct nfs_inode中有一个fileid字段,用于保存 64 位的 inode 编号。通过这一系列变更,该字段可能被移除。但我更愿意将这类清理工作留到以后进行,以保持本次变更的简洁性。”
——杰夫·雷顿(Jeff Layton)主导了此次变更
Linuxeden开源社区