Linux4.4内核MCS/queue spinlocks

本文介绍了Linux4.4内核中的MCS自旋锁,它优化了锁的实现,将大部分自旋操作移至per cpu的node,减少缓存失效,提升性能。MCS自旋锁通过链表实现等待队列,提供spin_lock/spin_unlock等接口,对用户透明。此外,还提及了qrwlock结构及其在多读少写场景的应用。

参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-mcsspinlock/index.html

在qspinlock系列中使用了MCS,使用时仍使用spin_lock/spin_unlock、spin_lock_bh/spin_unlock_bh一套接口,对使用者透明。

mcs主要优化是将大部分自旋操作放在了per cpu的node中,防止多个cpu对同一个lock内存多次读写(全局的lock每次修改都会导致其他处理器缓存失效,频繁的缓存同步操作会导致繁重的系统总线和内存的流量,从而大大降低了系统整体的性能),以提高性能;通过链表实现了排队功能。



源码:

#define arch_spin_lock(l)		queued_spin_lock(l)
#define arch_spin_unlock(l)		queued_spin_unlock(l)

//spinlock

spinlock是一个atomic 类型的值,按bit分成如下几部分,在CPU个数不同时有所差别

/*
 * Bitfields in the atomic value:
 *
 * When NR_CPUS < 16K
 *  0- 7: locked byte
 *     8: pending
 *  9-15: not used
 * 16-17: tail index
 * 18-31: tail cpu (+1)
 *
 * When NR_CPUS >= 16K
 *  0- 7: locked byte
 *     8: pending
 *  9-10: tail index
 * 11-31: tail cpu (+1)
 */

/**
 * queued_spin_lock - acquire a queued spinlock
 * @lock: Pointer to queued spinlock structure
 */
static __always_inline void queued_spin_lock(struct qspinlock *lock)
{
	u32 val;
        /*尝试获取lock,获取成功直接return, 否则进入queued_spin_lock_slowpath排队获取lock*/
	val = atomic_cmpxchg_acquire(&lock->val, 0, _Q_LOCKED_VAL);
	if (likely(val == 0))
		return;
	queued_spin_lock_slowpath(lock, val);
}
/**
 * queued_spin_lock_slowpath - acquire the queued spinlock
 * @lock: Pointer to queued spinlock structure
 * @val: Current value of the queued spinlock 32-bit word
 *
 * (queue tail, pending bit, lock value)
 *
 *              fast     :    slow                                  :    unlock
 *                       :                                          :
 * uncontended  (0,0,0) -:--> (0,0,1) ------------------------------:--> (*,*,0)
 *                       :       | ^--------.------.             /  :
 *                       :       v           \      \            |  :
 * pending               :    (0,1,1) +--> (0,1,0)   \           |  :
 *                       :       | ^--'              |           |  :
 *                       :       v                   |           |  :
 * uncontended    
你提出的问题非常专业,涉及 **Wi-Fi 信道规划与频段法规限制**。 你的表格显示的是不同 Wi-Fi 标准(11n、11ac/ax、11be)在 **40MHz 带宽** 下的速率表,并且你注意到: > ❓ **为什么在 40M 模式下没有 CH1-2 和 CH10-11?** --- ## ✅ 简短回答: > **因为在 2.4GHz 频段中,使用 40MHz 带宽时,CH1-2 和 CH10-11 无法作为主信道(Primary Channel),因为它们会导致部分子载波超出合法频率范围或与其他国家法规冲突。** --- ## 🔍 详细解释 ### 📡 背景:2.4GHz 频段结构 - **频率范围**:全球通用的 2.4GHz ISM 频段通常是: - **2400 MHz ~ 2483.5 MHz**(共约 83.5 MHz) - **信道划分**:每个信道宽 5MHz,中心频率间隔 5MHz - CH1: 2412 MHz - CH2: 2417 MHz - ... - CH13: 2472 MHz(中国允许) - CH14: 2484 MHz(仅日本,不常用) | 信道 | 中心频率 (MHz) | |------|----------------| | 1 | 2412 | | 2 | 2417 | | 3 | 2422 | | ... | ... | | 11 | 2462 | | 12 | 2467 | | 13 | 2472 | --- ### 🧩 什么是 40MHz 信道? 在 802.11n/ac/ax/be 中,可以通过绑定两个连续的 20MHz 信道来实现 **40MHz 带宽**。 它由两部分组成: - **Primary Channel(主信道)**:用于兼容旧设备(如 11b/g) - **Secondary Channel(辅信道)**:扩展带宽 例如: - 主信道 = CH6,辅信道 = CH10 → 组成 40M 信道(HT40+) - 或者主信道 = CH6,辅信道 = CH2 → HT40- > ⚠️ 关键点:整个 40MHz 信道必须完全落在合法频谱范围内! --- ## 🚫 为什么 CH1-2 和 CH10-11 不能用于 40M? 我们逐个分析: --- ### ❌ CH1 作为主信道(HT40+) - 主信道:CH1 (2412 MHz) - 辅信道应为:CH5 (2432 MHz) → 形成 **HT40+** - 实际需要覆盖频段:从 CH1 到 CH5 → 即 **2402 ~ 2442 MHz** - ✅ 完全在 2400~2483.5 内 → **理论上可行?** 但问题在于: - 如果用 **CH1 为主信道 + CH5 为辅信道**,那么实际使用的频段是: - **2402 ~ 2442 MHz**(共 40MHz) - 但 **CH1 的低边带已经贴近 2400 MHz 下限**,很多射频前端滤波器会衰减边缘信号。 - 更重要的是:**某些国家不允许这么靠边的 40M 配置**。 然而真正禁止 CH1 和 CH2 的原因是下面这个更严重的情况👇 --- ### ❌ CH2 作为主信道(HT40-) - 主信道:CH2 (2417) - 辅信道:CH? 应该是更低的 → CH-2?不存在! - 正确方式:若主信道是 CH2,则只能配 CH-2(即 CH-2 = 2407 MHz),对应信道编号 **“负数”** —— 这是不可能的。 所以: - **CH2 不可能作为 HT40- 的主信道**(无左邻信道) - 若作为 HT40+,则需搭配 CH6 → 跨度过大,非标准组合 👉 结论:**CH2 无法构成有效的 40MHz 信道** --- ### ❌ CH10 和 CH11 作为主信道(HT40+) - 主信道 CH10 (2457 MHz),辅信道 CH14 (2487 MHz)? - 但 CH14 只在日本允许,且频率为 2484 MHz,其扩展后会达到: - 上限:2484 + 10 = **2494 MHz** > **2483.5 MHz 法规上限** - 所以: - 在大多数国家(包括中国、美国、欧洲),**CH14 被禁止** - 因此 **CH10 和 CH11 无法找到合法的辅信道(CH14 无效)** - 即使尝试 HT40-(CH10 配 CH6),也因主辅关系不成立而不推荐 👉 结论:**CH10 和 CH11 无法安全地组成一个完整的 40MHz 信道而不越界** --- ## ✅ 合法的 40M 主信道有哪些?(2.4GHz) 在 2.4GHz 中,常见的合法 40M 主信道只有: | 主信道 | 模式 | 辅信道 | 频率范围 | |--------|------|--------|---------| | CH3 | HT40- | CH-1(无效)❌ | 不行 | | CH3 | HT40+ | CH7 | ✅ 可行 | | CH4 | HT40+ | CH8 | ✅ | | CH5 | HT40+ | CH9 | ✅ | | CH6 | HT40+ | CH10 | ✅(最常见)| | CH6 | HT40- | CH2 | ✅ | | CH7 | HT40- | CH3 | ✅ | | CH8 | HT40- | CH4 | ✅ | | CH9 | HT40- | CH5 | ✅ | 但由于边界问题,**真正广泛支持的 40M 主信道只有:** > ✅ **CH3, CH4, CH5, CH6** 而: - CH1, CH2 → 左侧无足够空间(HT40- 失败) - CH10, CH11, CH12, CH13 → 右侧无足够空间(HT40+ 失败) --- ## 🌍 不同地区的差异 | 地区 | 允许的最大信道 | 是否允许 CH14 | 40M 支持情况 | |------|----------------|---------------|-------------| | 美国 (FCC) | CH11 | ❌ | 仅支持 CH3-6 做 40M | | 欧洲 (ETSI) | CH13 | ❌ | 支持 CH3-7 | | 中国 | CH13 | ❌ | 支持 CH3-7 | | 日本 | CH14 | ✅ | 特殊支持 CH10+CH14(极少见)| 但在实际产品中,为了兼容性和稳定性,**默认禁用靠近边界的信道做 40M**。 --- ## 🛠️ 实际设备行为(Linux/mac80211, MediaTek, Qualcomm) 查看 Linux `iw list` 输出,你会发现: ```bash Band 2: * HT40+ Primary channel: 1 (2412 MHz), center freq: 2422 MHz -> INVALID Primary channel: 6 (2437 MHz), center freq: 2427 MHz -> VALID ``` 内核会自动标记某些信道组合为 **"NO-IR", "RADAR", 或 "disabled"**。 --- ## ✅ 总结:为什么没有 CH1-2 和 CH10-11? | 原因 | 说明 | |------|------| | 🚫 频率越界 | 使用 CH1 或 CH11 会导致 40MHz 带宽超出 2400–2483.5 MHz 范围 | | 🚫 缺少邻居信道 | CH1/CH2 没有左侧信道用于 HT40-;CH10/CH11 没有右侧信道用于 HT40+ | | 🚫 法规限制 | 多数国家禁止 CH14,导致 CH10+CH14 组合非法 | | 🚫 干扰严重 | 边缘信道易受蓝牙、微波炉等干扰,性能差 | | ✅ 推荐主信道 | 只有 CH3~CH6 是稳定可靠的 40M 主信道 | --- ### 💡 补充建议 如果你在开发驱动、固件或配置 AP: - 默认启用:`HT40+/HT40-` @ **CH6** - 避免自动选择 CH1、CH2、CH10、CH11 作为 40M 主信道 - 使用 `hostapd` 或 `ACS`(自动信道选择)算法时,优先排除边缘信道 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值