皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

针对 Linux 7.1 的补丁可能对 32 位系统产生负面影响

已合并到 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 分配方面引发一些副作用。

针对 Linux 7.1 的补丁可能对 32 位系统产生负面影响

该提交请求(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)主导了此次变更

转自 https://www.phoronix.com/news/Linux-7.1-VFS-Kino-32-bit