linuxer
    @callme_friend:登录之后,在管理界面有一个写文章的标签,点击进去就可以写文章了。当然,也可以offline写,这时候可以使用Windows Live Writer
    Linux内核同步机制之(四):spin lock  发表时间:2015-04-29 13:04
    linuxer
    @buyit:在我们自己的架构下,arm_arch_timer.c 是不是就不能直接用了? 比如timer肯定不能直接使用这个模块的代码,因为我们用的不是ARM的timer IP,因此寄存器不一样。 --------------------- 的确是不能直接使用了。不过听你的描述,你们是A5单核系统,因此cpu core中没有local timer,这时候,system counter和HW timer都集成在SOC上的一个HW block中,这时候使用arm_arch_timer.c作为参考其实不是那么适合,建议使用PXA系列的timer程序做参考就OK了。 CLOCK_EVT_FEAT_PERIODIC这个flag需要置位吗?ARM的代码里面似乎没有置位。假设我不主动置位,会影响系统的什么特性吗? ----------------------------- 这个flag和底层硬件是否有周期性产生timer中断相关,如果硬件有这个能力,当然要设定并且在clock event device中实现set_mode这个callback函数。如果不设定这个标记也没有关系,这也意味着底层的hw timer只是支持one shot mode,那么tick device layer会帮你用one shot mode来模拟周期性的timer中,具体参考tick_setup_periodic代码 CLOCK_EVT_FEAT_C3STOP设定问题 ---------------------- 其实我的文档中已经描述过这个问题。这个是和cpu idle的实现有关,如果你们打算设计的cpu idle状态不会导致HW timer停止工作就不需要设定这个bit。 还有个问题:这个timer的精度只有300,在我们SOC里面全靠它来更新ktime,这样的架构是否有问题?是否有可能改进设计? ------------------------------- timer的rating是300不意味timer的精度就是300,实际timer的精度是和system counter以及HW timer的输入的clock设定相关的 我看到kernel里面有关于broadcast timer的代码,在我们的SOC里面只有单核A5,是否完全不需要考虑这一块的设计?当它不存在就可以了?下面两个config不知道是否需要打开? ---------------------- 没有CLOCK_EVT_FEAT_C3STOP的问题则不需要打开 单核的A5, timer不在core里面,假设用了no_hz,那么如果进入cpuidle,这个timer是关还是开呢?我觉得必须开着,否则下一个timer中断就不会过来了因为timer关闭了。 ---------------------------- 设计是平衡的艺术。打开timer、功耗增加,关闭timer、虽然降低功耗,但是会增加软件的复杂度(需要进行特别的设计)。你问的这个问题是一个SOC设计的问题,不是一个时间子系统的软件设计问题,当然,最终的答案来自你们的产品需求。 其他问题改天再回答吧,^_^
    linuxer
    @buyit:所以对比旧的架构来看,新的架构下面如果系统负荷大的时候,timer中断反而会更多。 ------------------------------------- 的确,新的内核架构下,timer的中断会更多,但对于高性能的CPU而言,增加的中断次数可以忽略不计的。在旧的架构下,由于不支持高精度timer,因此,原本散布在各个ns时间点上的timer事件都并入到一个10ms的timer 中断event上来,因此中断次数当然比较少。 请问理解是否正确? -------------- 理解基本正确,除了“cpuidle的级别不够深”这句话。在多核架构下,timer硬件往往build in在cpu core上,因此,当cpu进入的idle级别比较深的时候,有可能local timer也进入inactive状态,这导致该硬件timer无法触发timer到期的中断事件。而实际上,cpu idle状态的时候需要硬件timer处于working状态。 这里使用新旧架构有些模糊,更准确的描述是:在有tick的内核中,每个cpu core上的swapper进程在被调度到的时候都会控制本cpu core进入idle状态,无论cpuidle的级别深或者不深,cpu都会每秒被timer irq唤醒100次。当然,如果cpu core定义了多种idle状态并且在较深的状态的时候导致local timer进入inactive状态,这时候,需要其他的手段来解决(tick broadcast framework)timer唤醒问题
    Linux时间子系统之(十三):Tick Device layer综述  发表时间:2015-04-29 12:26
    buyit
    请教一个问题: 假设在旧的linux上面,HZ=100,也就是10ms为周期产生timer irq,那么系统中所有的软件timer的精度只能够到10ms的级别,系统产生timer irq的频率就是一秒有100次。 换成新的架构,有no hz,tickless的模式,假设系统支持了高精度timer,但是为了调度器考虑,仍然产生了一个hz=100的hrtimer。 在系统正常运行过程中,假设一段时间内一直有工作的进程在运行,轮不到idle进程运行,那么这段时间内,系统中每秒钟产生100次hrtimer,为调度器使用,另外还会有一些精度更高的比如ns级别的hrtimer也会产生irq,所以对比旧的架构来看,新的架构下面如果系统负荷大的时候,timer中断反而会更多。 假设系统空闲,变成了idle模式,那么旧的架构下面,如果cpuidle的级别不够深,会每秒被timer irq唤醒100次,几乎就是不能idle。而新的tickless架构下面,在idle之前把sched timer停掉了,因此idle过程中除非有其它hrtimer到期,否则不会被调度器使用的timer唤醒。 请问理解是否正确?谢谢。
    Linux时间子系统之(十三):Tick Device layer综述  发表时间:2015-04-29 11:31
    buyit
    @linuxer 你好,有些概念我看了之后还是觉得有点模糊,麻烦你帮忙解答一下,多谢。抱歉我对这一块的理解有欠缺,似懂非懂,要真正做一遍才能彻底领悟,目前的问题本身也许也存在问题,请你包涵。 我们的SOC采用一个单核的A5,由于A5单核模式下面不支持ARM的generic timer架构,于是只能自己去搭这个timer的架构。目前是用一个56 bit的的system counter放在always-on里面,这个counter一直不停下,如果要读取的话是通过mem map方式读取。由于A5 core里面没有集成timer,因此在SOC级别放了一个32 bit的timer,同样通过mem map方式读取和配置timer。下面的这些问题我没有想明白: 1. 在我们自己的架构下,arm_arch_timer.c 是不是就不能直接用了? 比如timer肯定不能直接使用这个模块的代码,因为我们用的不是ARM的timer IP,因此寄存器不一样。 2. system counter我准备按照ARM的代码创建: static struct clocksource clocksource_counter = { .name = "arch_sys_counter", .rating = 400, .read = arch_counter_read, .mask = CLOCKSOURCE_MASK(56), .flags = CLOCK_SOURCE_IS_CONTINUOUS | CLOCK_SOURCE_SUSPEND_NONSTOP, }; 上面是照抄的,我觉得应该不需要改动什么,自己实现一下read函数就行了。 3. timer,这个需要去实现clock_event_device结构体,我准备照抄kernel里面tegra现成的: static struct clock_event_device tegra_clockevent = { .name = "timer0", .rating = 300, .features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC, .set_next_event = tegra_timer_set_next_event, .set_mode = tegra_timer_set_mode, }; CLOCK_EVT_FEAT_PERIODIC这个flag需要置位吗?ARM的代码里面似乎没有置位。假设我不主动置位,会影响系统的什么特性吗? CLOCK_EVT_FEAT_C3STOP这个flag是否需要置位?我看ARM把cp15类型的per cpu timer置位了这个flag,但是其它mem map的timer没有置位,我们用的是mem map类型的,所以这个不需要置位。 还有个问题:这个timer的精度只有300,在我们SOC里面全靠它来更新ktime,这样的架构是否有问题?是否有可能改进设计? 4. 我看到kernel里面有关于broadcast timer的代码,在我们的SOC里面只有单核A5,是否完全不需要考虑这一块的设计?当它不存在就可以了?下面两个config不知道是否需要打开? CONFIG_ARCH_HAS_TICK_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y 5. 单核的A5, timer不在core里面,假设用了no_hz,那么如果进入cpuidle,这个timer是关还是开呢?我觉得必须开着,否则下一个timer中断就不会过来了因为timer关闭了。 6.单核A5, timer不在core里面,假设用了no_hz,那么如果进入suspend,这个timer是关还是开呢?我觉得可以关闭,因为我们的system counter放在always-on里面,系统resume的时候可以通过读取system counter来补偿ktime。并且kernel suspend的时候普通的软件timer是不可能唤醒系统的,所以这个timer可以关闭。 7. 假设这是别家的芯片,多核A5, SMP,并且采用了ARM generic timer的架构,那么它是怎么运作的? 当cpu3进入cpuidle的时候,cpu3的core被clk gating了,那么cpu3的timer可能也被停止了,这时候是需要借助同一个cluster里面其它的cpu来给cpu3 broadcast timer中断吗? 这里涉及到一个设计逻辑:在cpu3进入cpuidle之前,cpu3是否会判断和计算一下下一个到期的timer,如果下一个timer很快到期,cpu3有两种选择,要么完全依赖于cpu0~cpu2的broadcast timer irq,直接idle。要么干脆不idle了先处理完下一个timer事件再说。我猜应该是前一种,甚至可以理解为cpu3执行idle代码的时候不会判断到期的timer,直接发出一个broadcast timer的广播,告诉其它cpu接管timer事件,然后cpu3直接idle。 8. broadcast这种行为,是由同一个cluster里面的其它cpu利用自身的cp15 timer的中断来广播给已经idle的cpu,还是全局的mem map的timer利用自身的timer中断来广播给所有的cpu?我觉得后者的可能性更高一些,假设一个cluster里面有cpu0~cpu3,假设cpu3进入cpuidle并且timer停止了,那么cpu0, cpu1, cpu2的timer仍然在运行中不受影响,一个全局的具有broadcast功能的timer会负责记录cpu3上面的下一个唤醒事件,等触发时间到来的时候,全局timer负责唤醒cpu3,这个过程中cpu0, cpu1, cpu2并不会接收这个广播事件,因为它们自身的cpu timer运行良好并不需要全局timer的帮助。理解是否正确? 9. cpuidle的时候per-cpu的timer是否关闭是否要看进入idle的级别?如果是最浅的级别,cpu简单执行了WFI,那么这种情况下per-cpu的timer应该不会停下,所以下一个event到期了之后cpu可以顺利被per-cpu timer唤醒。 如果进入的idle级别很深,肯定会关闭per-cpu timer, 这时候对系统架构来说是不是必须有一个全局的broadcast timer存在?否则的话这个idle的cpu就不能正常处理tick了,是不是会有问题? 有没有可能其它没有idle的cpu通过IPI来广播timer event给这个已经idle的cpu? 问题有点多,有点长,不好意思。期待你的耐心解答,先谢过了 :)
    puppypyb
    Quote:"当然,还有一点要注意,那就是在访问Per-CPU变量的时候,不能调度,当然更准确的说法是该task不能调度到其他CPU上去。目前的内核的做法是在访问Per-CPU变量的时候disable preemptive" 谈一点感想,有不对的地方请指出: 引入per-cpu变量的原因就是文中所说的,每个cpu都在自己的变量副本上工作,这样每次读写就可以避免锁开销,上下文切换和cache等一系列问题。假设当前task运行在其中一个core cpu0上且获得了var在该cpu上的本地副本,然后该task在操作该副本的过程中因被抢占而转移到另外一个core cpu1上运行,那么接下来cpu1将会继续操作该变量副本(属于cpu0),违反了“每个cpu都工作在自己副本上”这样一个前提,该机制就乱套了。 上面是我所认为的disable preemptive的初衷,就是在操作per-cpu副本的过程中防止task调度到其他cpu上去。但同样的get_cpu_var(var)的时候也disable了本CPU的调度。我想了下,在这样的场景下disable本cpu的调度好像没有必要,我理解为disable preemptive的副作用。
    Linux内核同步机制之(二):Per-CPU变量  发表时间:2015-04-29 10:07
    wowo
    @klaus:致敬就客气了,大家多多交流!欢迎!~~
    关于蜗窝  发表时间:2015-04-29 09:24
    wowo
    @klaus:非常欢迎啊。我和linuxer还曾经写过一篇100多页的ALSA的设计概念(公司这样叫的,其实就是分析文章),你发出来大家可以多多交流一下啊。
    关于蜗窝  发表时间:2015-04-29 09:23
    klaus
    我最近看了一下linux的alsa框架,有一些自己的理解,准备形成文章,不知道可否贡献给wowo。
    关于蜗窝  发表时间:2015-04-29 09:09
    klaus
    两年前看到过wowo,我一闪而过,再次看到wowo,我果断注册。向大家学习了。同时向wowo致敬!
    关于蜗窝  发表时间:2015-04-29 09:05

共6985条560/699上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 下一页
Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog