get_cpu_mask
get_cpu_mask
/* cpu_bit_bitmap[0] is empty - so we can back into it */ #define MASK_DECLARE_1(x) [x+1][0] = (1UL << (x)) #define MASK_DECLARE_2(x) MASK_DECLARE_1(x), MASK_DECLARE_1(x+1) #define MASK_DECLARE_4(x) MASK_DECLARE_2(x), MASK_DECLARE_2(x+2) #define MASK_DECLARE_8(x) MASK_DECLARE_4(x), MASK_DECLARE_4(x+4) const unsigned long cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)] = { MASK_DECLARE_8(0), MASK_DECLARE_8(8), MASK_DECLARE_8(16), MASK_DECLARE_8(24), #if BITS_PER_LONG > 32 MASK_DECLARE_8(32), MASK_DECLARE_8(40), MASK_DECLARE_8(48), MASK_DECLARE_8(56), #endif };
static inline const struct cpumask *get_cpu_mask(unsigned int cpu) { const unsigned long *p = cpu_bit_bitmap[1 + cpu % BITS_PER_LONG]; p -= cpu / BITS_PER_LONG; return to_cpumask(p); }
#define to_cpumask(bitmap) \ ((struct cpumask *)(1 ? (bitmap) \ : (void *)sizeof(__check_is_bitmap(bitmap))))
上面cpu_bit_bitmap unsigned long型二维数组元素初始化如下:
[0+1][0] = 1<<0, [1+1][0] = 1<<1, [2+1][0] = 1<<2, [3+1][0] = 1<<3, [4+1][0] = 1<<4, [5+1][0] = 1<<5, [6+1][0] = 1<<6, [7+1][0] = 1<<7, [8+1][0] = 1<<8, [9+1][0] = 1<<9, [10+1][0] = 1<<10, [11+1][0] = 1<<11, [12+1][0] = 1<<12, [13+1][0] = 1<<13, [14+1][0] = 1<<14, [15+1][0] = 1<<15, ... [62+1][0] = 1<<62, [63+1][0] = 1<<63,
以NR_CPUS为4、cpu index为2为例,上述cpu_bit_bitmap[][]将是cpu_bit_bitmap[65][1]
p = cpu_bit_bitmap[3]
p -= 0
所以p指向cpu_bit_bitmap[3],这个指向的数据是1ul<<2
此时cpumask_t类型是一个结构体,里面只包含一个unsigned long bits[1]的数组:
typedef struct cpumask { unsigned long bits[1]; } cpumask_t
将1ul << 2转成cpumask_t即得到这个cpu的cpumask
以NR_CPUS为65、cpu index为64为例,上述cpu_bit_bitmap[][]将是cpu_bit_bitmap[65][2]
p = cpu_bit_bitmap[2]
p -= 1
所以p指向cpu_bit_bitmap[2]的前一个位置,即是cpu_bit_bitmap[1][1],将cpu_bit_bitmap[1][1] & cpu_bit_bitmap[2][0]这两个unsigned long型转成cpumask_t类型,此时cpumask_t类型是unsigned long bits[2]类型的struct:
typedef struct cpumask { unsigned long bits[2]; } cpumask_t
超过64个cpu的case这部分还需要再继续确认下...
分类:
linux cpu driver
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析