simple_xattr
轻量 xattr 实现
特殊文件系统用
属性小且稀疏
用在哪
tmpfs
kernfs
pidfs / socket
每个 inode 1-2 个
存什么
security.foo
user.test=foo
名字 + 值
内存开销敏感
背景
不是完整 xattr
但用得广
旧表 · per-inode
v7.1 rhashtable
链表改哈希查找
每个 inode 一张表
表
struct simple_xattrs
rhashtable
查找更快
固定开销
稀疏
per-inode 1-2 个
表本身有成本
摊不薄
每个 inode 一份
改造
查找变快
内存变贵
回归 · 1296 字节
10 万空文件
每个加 user.test
slabinfo 差值
三种实现
v7.0 79.99
v7.1 1296.08
per-sb 111.86
bytes/file
对比
1296.08
80 → 1296
固定开销爆炸
查找收益被盖过
实测
单 xattr 内存
1296.08 bytes/file
方案 · 表上移
inode → superblock
一张共享哈希表
固定开销摊薄
表
simple_xattr_cache
cache->ht
lazy alloc
superblock 持有
共享
所有 inode 共用
不再每 inode 建表
查找仍哈希
单属性回落
关键
粒度从 inode 到 sb
固定开销一起摊
并发 · cmpxchg/RCU
表跨 inode 共享
inode 锁不够
惰性建表要原子
cmpxchg
cache->ht == NULL
先建表
cmpxchg_release
输者释放
RCU
查找在 RCU 下
释放走宽限期
simple_xattr_free_rcu
熬过并发查找
关键
cmpxchg_release + READ_ONCE
释放等 RCU
两视角 · 哈希+链表
查找走共享哈希
枚举/回收走链表
每个 inode 一条
哈希
get / set
name + parent
跨 inode 共享
快速定位
链表
listxattr
RCU 遍历
释放时摘除
per-inode 视角
分工
哈希负责定位
链表负责枚举
铺垫 · 接口与命名
系列另两处改动
为共享表清路
调用方更简单
接口
simple_xattr_set
惰性分配内移
调用方少管理
接口变集中
命名
security.foo
kasprintf 拼装
少临时缓冲
语义不变
范围
两处铺垫
主改动仍是 per-sb
收益与边界
10 万空文件
每个 user.test=foo
slabinfo 差值
三种配置
v7.0 79.99
v7.1 1296.08
per-sb 111.86
xattr bytes/file
边界
建文件开销基本持平
仍高于 v7.0
多 3 个指针
不是零成本
结论
内存回归基本消除
接近链表水平
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x