引言
在 Linux 网络协议栈中,套接字(socket)的克隆是一个常见操作,例如在 TCP 连接中处理子请求或实现负载均衡。sk_clone_lock
函数负责克隆一个 socket,并确保其状态和资源的正确初始化。然而,当原始 socket 附加了 BPF(Berkeley Packet Filter)过滤器时,克隆过程需额外关注资源管理问题。本文围绕 sk_clone_lock
中的关键函数 sk_filter_charge
,探讨其作用、实现逻辑及背后的设计思想。
1. sk_filter_charge
的核心作用
sk_filter_charge
的核心任务是 为新克隆的 socket 安全地附加 BPF 过滤器资源,同时确保资源使用符合系统限制。其具体作用可分为以下三方面:
1.1 资源分配与全局限制检查
-
可选内存(optmem)的配额机制
BPF 过滤器的内存占用被归类为“可选内存”,受系统参数sysctl_optmem_max
限制。该参数定义了单个 socket 可分配的非核心内存最大值(如过滤器、套接字选项等)。
sk_filter_