Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1267851
  • 博文数量: 494
  • 博客积分: 161
  • 博客等级: 入伍新兵
  • 技术积分: 5084
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-01 07:37
个人简介

只有偏执狂才能生存

文章分类

全部博文(494)

文章存档

2016年(10)

2015年(112)

2014年(69)

2013年(275)

2012年(28)

相关博文

分类:

2012-11-29 16:19:04

原文地址:tasklet_1 作者:oscarvei

1.
任何时刻只有一个CPU在运行tasklet的处理函数。
在哪个cpu上激活的,就在哪个cpu上运行tasklet的处理函数。

tasklet api:
1. 初始化(init)
515 void tasklet_init(struct tasklet_struct *t,
516                   void (*func)(unsigned long), unsigned long data)

2. 激活(raise)
561 static inline void tasklet_schedule(struct tasklet_struct *t)


点击(此处)折叠或打开

  1. 515 void tasklet_init(struct tasklet_struct *t,
  2. 516 void (*func)(unsigned long), unsigned long data)
  3. 517 {
  4. 518 t->next = NULL;
  5. 519 t->state = 0;
  6. 520 atomic_set(&t->count, 0);
  7. 521 t->func = func;
  8. 522 t->data = data;
  9. 523 }

点击(此处)折叠或打开

  1. 561 static inline void tasklet_schedule(struct tasklet_struct *t)
  2. 562 {
  3. 563 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
  4. 564 __tasklet_schedule(t);
  5. 565 }
  6. 566

点击(此处)折叠或打开

  1. 514
  2. 515 struct tasklet_struct
  3. 516 {
  4. 517 struct tasklet_struct *next;
  5. 518 unsigned long state;
  6. 519 atomic_t count;
  7. 520 void (*func)(unsigned long);
  8. 521 unsigned long data;
  9. 522 };
  10. 523

点击(此处)折叠或打开

  1. 402 static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
  2. 403 static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec);

 点击(此处)折叠或打开

  1. 393 /*
  2. 394 * Tasklets
  3. 395 */
  4. 396 struct tasklet_head
  5. 397 {
  6. 398 struct tasklet_struct *head;
  7. 399 struct tasklet_struct **tail;
  8. 400 };
  9. 401


点击(此处)折叠或打开

  1. 561 static inline void tasklet_schedule(struct tasklet_struct *t)
  2. 562 {
  3. 563 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
  4. 564 __tasklet_schedule(t);
  5. 565 }
  6. 566


点击(此处)折叠或打开

  1. 405 void __tasklet_schedule(struct tasklet_struct *t)
  2. 406 {
  3. 407 unsigned long flags;
  4. 408
  5. 409 local_irq_save(flags);
  6. 410 t->next = NULL;
  7. 411 *__this_cpu_read(tasklet_vec.tail) = t;
  8. 412 __this_cpu_write(tasklet_vec.tail, &(t->next));
  9. 413 raise_softirq_irqoff(TASKLET_SOFTIRQ);
  10. 414 local_irq_restore(flags);
  11. 415 }


点击(此处)折叠或打开

  1. 444 static void tasklet_action(struct softirq_action *a)
  2. 445 {
  3. 446 struct tasklet_struct *list;
  4. 447
  5. 448 local_irq_disable();
  6. 449 list = __this_cpu_read(tasklet_vec.head);
  7. 450 __this_cpu_write(tasklet_vec.head, NULL);
  8. 451 __this_cpu_write(tasklet_vec.tail, &__get_cpu_var(tasklet_vec).head);
  9. 452 local_irq_enable();
  10. 453
  11. 454 while (list) {
  12. 455 struct tasklet_struct *t = list;
  13. 456
  14. 457 list = list->next;
  15. 458
  16. 459 if (tasklet_trylock(t)) {
  17. 460 if (!atomic_read(&t->count)) {
  18. 461 if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
  19. 462 BUG();
  20. 463 t->func(t->data);
  21. 464 tasklet_unlock(t);
  22. 465 continue;
  23. 466 }
  24. 467 tasklet_unlock(t);
  25. 468 }
  26. 469
  27. 470 local_irq_disable();
  28. 471 t->next = NULL;
  29. 472 *__this_cpu_read(tasklet_vec.tail) = t;
  30. 473 __this_cpu_write(tasklet_vec.tail, &(t->next));
  31. 474 __raise_softirq_irqoff(TASKLET_SOFTIRQ);
  32. 475 local_irq_enable();
  33. 476 }
  34. 477 }


阅读(494) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册