免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3831 | 回复: 8

[时钟管理] 对per-cpu变量tvec_bases的疑问 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-01-21 22:44 |显示全部楼层
///定义了一个per cpu变量.这里要知道定时器的注册和触发执行一定是在相同的cpu上的.
struct tvec_base boot_tvec_bases;
static DEFINE_PER_CPU(struct tvec_base *, tvec_bases) = &boot_tvec_bases;
疑问:
tvec_bases虽然是per cpu变量,但是指向的都是&boot_tvec_bases,也就是说不同的cpu其实操作的都是同一个变量,这样做有什么意义呢?能避免同步问题么?

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
发表于 2015-01-21 23:36 |显示全部楼层
启动的时候,会将这个变量做一个偏移处理,实际上每个tvec_base指向的都是不同的值,只是要基于boot_tvec_bases这个变量去找本节点的变量,不知道说清楚没

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2015-01-22 08:40 |显示全部楼层
回复 1# jinxinxin163
///定义了一个per cpu变量.这里要知道定时器的注册和触发执行一定是在相同的cpu上的.
struct tvec_base boot_tvec_bases;
static DEFINE_PER_CPU(struct tvec_base *, tvec_bases) = &boot_tvec_bases;
疑问:
tvec_bases虽然是per cpu变量,但是指向的都是&boot_tvec_bases,也就是说不同的cpu其实操作的都是同一个变量,这样做有什么意义呢?能避免同步问题么?


你是这么理解per_cpu的?

per_cpu的含义是同一个变量名,对应多个存储地址,当每个CPU访问的时候,根据CPUID便宜到相应的地址,所以不同的CPU访问同一个变量名,但实际上却是不同的物理地址。

   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2015-01-22 08:42 |显示全部楼层
回复 1# jinxinxin163


真的tvec_bases会在static int __cpuinit init_timers_cpu(int cpu)函数里进行重新赋值,这样,每个CPU的tvec_base就不一样了。boot_tvec_bases这个base,最终只会留给启动核来用。

static int __cpuinit init_timers_cpu(int cpu)
{
        int j;
        struct tvec_base *base;
        static char __cpuinitdata tvec_base_done[NR_CPUS];

        if (!tvec_base_done[cpu]) {
                static char boot_done;

                if (boot_done) {
                        /*
                         * The APs use this path later in boot
                         */
                        base = kmalloc_node(sizeof(*base),
                                                GFP_KERNEL | __GFP_ZERO,
                                                cpu_to_node(cpu));
                        《。。。》
                        per_cpu(tvec_bases, cpu) = base;
                } else {
                        /*
                         * This is for the boot CPU - we use compile-time
                         * static initialisation because per-cpu memory isn't
                         * ready yet and because the memory allocators are not
                         * initialised either.
                         */
                        boot_done = 1;
                        base = &boot_tvec_bases;
                }
                spin_lock_init(&base->lock);
                tvec_base_done[cpu] = 1;
        } else {
                base = per_cpu(tvec_bases, cpu);
        }

        《。。。》
}

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2015-01-22 08:49 |显示全部楼层
@瀚海书香@super皮波
我想两位可能理解错了楼主的意思了。

tvec_bases是PerCPU没错。会有多份物理地址不同,但变量名叫tvec_bases的也没错。但每一份的的副本里头的存内容是什么?楼主可以关心的是这个,关心的是这个核的这个PerCPU是不是都同时指向boot_tvec_bases。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
发表于 2015-01-22 09:42 |显示全部楼层
这种问题,只要知道per-cpu变量是如何存放的就知道了,初始化的时候会拷贝n份(n是cpu的个数),在使用的时候,每个cpu节点使用自己的那份拷贝

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-02-11 11:43 |显示全部楼层
回复 2# super皮波

那按照你的意思,其实把boot_tvec_bases赋值过去就好了,没必要是&boot_tvec_bases把
   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-02-11 11:48 |显示全部楼层
回复 3# 瀚海书香


    感谢啊,这里我主要是对&boot_tvec_bases不太理解,我的理解是boot_tvec_bases就好了

    既然,这里是指针,那么不同cpu都有一个指针指向&boot_tvec_bases,那么其实还是一个变量,对否?

事实不是,所以,我的理解肯定不对

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
发表于 2015-02-11 11:55 |显示全部楼层
回复 7# jinxinxin163

那按照你的意思,其实把boot_tvec_bases赋值过去就好了,没必要是&boot_tvec_bases把

tvec_bases是基于boot_tvec_bases的地址来去分配和查找当前cpu上的tvec_bases变量的
你直接找文档看看,per-cpu变量的分配和查找过程,看完了,你肯定就没有疑问了
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP