亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

內核源碼分析之tasklet(基于3.16-rc4)

2024-06-28 13:25:05
字體:
來源:轉載
供稿:網友
內核源碼分析之tasklet(基于3.16-rc4)

tasklet是在HI_SOFTIRQ和TASKLET_SOFTIRQ兩個軟中斷的基礎上實現的(它們是在同一個源文件中實現,由此可見它們的關系密切程度),它的數據結構和軟中斷比較相似,這篇博文將分析tasklet的初始化過程。

1.和tasklet相關的數據結構

tasklet_vec和tasklet_hi_vec數組(kernel/softirq.c)

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

第1行中為所有cpu創建了名為tasklet_vec數組,每個元素和一個cpu相關聯,數組元素類型為struct tasklet_head。第2行和第1行類似,創建出的tasklet_hi_vec數組存放的是每個cpu上優先級更高的tasklet小任務。下面看下struct tasklet_head結構體(kernel/softirq.c)。

1 struct tasklet_head {2     struct tasklet_struct *head;3     struct tasklet_struct **tail;4 };

內核會為每個cpu分配一個這樣的結構體變量,從而每個cpu都擁有一個小任務函數的鏈表。再看下結構體(kernel/softirq.c)。

1 struct tasklet_struct2 {3     struct tasklet_struct *next;4     unsigned long state;5     atomic_t count;6     void (*func)(unsigned long);7     unsigned long data;8 };

第1行next指向小任務鏈表下一個節點,第6行func變量指向了小任務函數。

2.tasklet初始化

小任務是基于HI_SOFTIRQ和TASKLET_SOFTIRQ兩個軟中斷來實現的。HI_SOFTIRQ所對應的軟中斷函數是tasklet_action,如下(kernel/softirq.c):

 1 static void tasklet_action(struct softirq_action *a) 2 { 3     struct tasklet_struct *list; 4  5     local_irq_disable(); 6     list = __this_cpu_read(tasklet_vec.head); 7     __this_cpu_write(tasklet_vec.head, NULL); 8     __this_cpu_write(tasklet_vec.tail, &__get_cpu_var(tasklet_vec).head); 9     local_irq_enable();10 11     while (list) {12         struct tasklet_struct *t = list;13 14         list = list->next;15 16         if (tasklet_trylock(t)) {17             if (!atomic_read(&t->count)) {18                 if (!test_and_clear_bit(TASKLET_STATE_SCHED,19                             &t->state))20                     BUG();21                 t->func(t->data);22                 tasklet_unlock(t);23                 continue;24             }25             tasklet_unlock(t);26         }27 28         local_irq_disable();29         t->next = NULL;30         *__this_cpu_read(tasklet_vec.tail) = t;31         __this_cpu_write(tasklet_vec.tail, &(t->next));32         __raise_softirq_irqoff(TASKLET_SOFTIRQ);33         local_irq_enable();34     }35 }

第6行中tasklet_vec數組中和本地cpu相關的元素的head域值,保存在list變量中,實際上把當前cpu的tastlet任務鏈表卸下來,list成為鏈表頭指針。第7,8行把tasklet_vec數組和本地cpu相關的元素的head域置為NULL,tail域指向head域。第11-26行用while循環執行所有的tasklet函數。第21行是tasklet函數的執行。第30-31行把執行之后的struct tasklet_struct鏈表節點重新掛到tasklet_vec數組中,由此可見裝tasklet函數的結構體不用程序員手動創建,由系統來提供。第32行重新設置軟中斷掩碼表的相應位。TASKLET_SOFTIRQ所對應的軟中斷函數是tasklet_hi_action,和tasklet_action執行過程類似,不再分析。

來看下tasklet_action函數初始化過程(kernel/softirq.c)。

 1 void __init softirq_init(void) 2 { 3     int cpu; 4  5     for_each_possible_cpu(cpu) { 6         per_cpu(tasklet_vec, cpu).tail = 7             &per_cpu(tasklet_vec, cpu).head; 8         per_cpu(tasklet_hi_vec, cpu).tail = 9             &per_cpu(tasklet_hi_vec, cpu).head;10     }11 12     open_softirq(TASKLET_SOFTIRQ, tasklet_action);13     open_softirq(HI_SOFTIRQ, tasklet_hi_action);14 }

第5-10行,初始化tasklet_vec和tasklet_hi_vec兩個數組的元素,使每個元素的tail域指向head域。cpu編號作為兩個數組的下標。第12-13行將負責處理tasklet任務的兩個軟中斷函數tasklet_action和tasklet_hi_action分別存入軟中斷數組softirq_vec[NR_SOFTIRQS]的相應元素中。來看下open_softirq函數(kernel/softirq.c)。

1 void open_softirq(int nr, void (*action)(struct softirq_action *))2 {3     softirq_vec[nr].action = action;4 } 

相信你一看就明白了,不用解釋了~

再看看tasklet的初始化過程(kernel/softirq.c):

1 void tasklet_init(struct tasklet_struct *t,2           void (*func)(unsigned long), unsigned long data)3 {4     t->next = NULL;5     t->state = 0;6     atomic_set(&t->count, 0);7     t->func = func;8     t->data = data;9 }

該函數接收tasklet_struct結構體指針和小任務函數指針,然后對tasklet_struct結構體進行初始化,并將函數指針賦給t->func域。tasklet_init函數在tasklet_hrtimer_init函數中被調用。

3.tasklet調度(這兩個函數分別在include/linux/interrupt.h和kernel/softirq.c文件中)

1 static inline void tasklet_schedule(struct tasklet_struct *t)2 {3     if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))4         __tasklet_schedule(t);5 }
 1 void __tasklet_schedule(struct tasklet_struct *t) 2 { 3     unsigned long flags; 4  5     local_irq_save(flags); 6     t->next = NULL; 7     *__this_cpu_read(tasklet_vec.tail) = t; 8     __this_cpu_write(tasklet_vec.tail, &(t->next)); 9     raise_softirq_irqoff(TASKLET_SOFTIRQ);10     local_irq_restore(flags);11 }12 EXPORT_SYMBOL(__tasklet_schedule);

在__tasklet_schedule函數第7-8行,將struct tasklet_struct類型的tasklet掛到taskeletvec數組中,然后第9行進行軟中斷掩碼置位。之后當軟中斷被執行時,tasklet函數就可以被執行了。

至此,tasklet的初始化就分析完了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品一本久久99精品| 播播国产欧美激情| 国产日韩精品在线播放| 国内精品小视频| 亚洲美女久久久| 欧美日韩亚洲精品一区二区三区| 欧美激情精品久久久久久蜜臀| 亚洲国模精品一区| 91精品免费视频| 国产精品99久久久久久久久久久久| 国产精品爽爽爽爽爽爽在线观看| 成人h片在线播放免费网站| 国内外成人免费激情在线视频网站| 亚洲经典中文字幕| 日韩欧美视频一区二区三区| 国内伊人久久久久久网站视频| 中文国产亚洲喷潮| 中文字幕亚洲欧美日韩高清| 久久精品国产欧美亚洲人人爽| 欧美精品激情在线观看| 久久视频在线直播| 亚洲精品久久久久久下一站| 国内精品在线一区| 97在线精品视频| 日韩少妇与小伙激情| 欧美麻豆久久久久久中文| 97国产精品视频| 亚洲人成毛片在线播放| 亚洲人精品午夜在线观看| 中文字幕亚洲欧美| 国产精品成人一区| 国产成人短视频| 欧美体内谢she精2性欧美| 亚洲春色另类小说| 69av在线播放| 国产亚洲欧美aaaa| 国产在线精品一区免费香蕉| 亚洲视频专区在线| 最好看的2019年中文视频| 色综合影院在线| 国产v综合v亚洲欧美久久| 青青草原成人在线视频| 日韩在线播放视频| 欧美精品videosex牲欧美| 欧美国产日韩二区| 777午夜精品福利在线观看| 日韩精品亚洲精品| 国产精品国产三级国产aⅴ浪潮| 日韩欧美亚洲综合| 亚洲美女动态图120秒| 狠狠躁夜夜躁人人爽天天天天97| 亚洲四色影视在线观看| 久久精品美女视频网站| 亚洲免费小视频| 久久亚洲精品中文字幕冲田杏梨| 亚洲在线免费看| 亚洲成人xxx| 91精品视频免费| 日韩中文字幕精品视频| 亚洲国产日韩欧美综合久久| 中文字幕亚洲字幕| 精品日韩视频在线观看| 亚洲人成电影网站色www| 亚洲www在线观看| 日韩亚洲欧美中文高清在线| xxxx欧美18另类的高清| 亚洲欧美www| 亚洲摸下面视频| 7777精品视频| 日韩成人黄色av| 亚洲女性裸体视频| 热re91久久精品国99热蜜臀| 国产精品久久久久国产a级| 成人欧美一区二区三区黑人| 欧美中文字幕在线视频| 亚洲jizzjizz日本少妇| 国产精品久久久久av| 日本中文字幕不卡免费| 久久国产精品99国产精| 日韩欧美国产成人| 亚洲伊人第一页| 一本色道久久综合狠狠躁篇的优点| 国产亚洲人成网站在线观看| 国产欧美一区二区三区久久人妖| www.日韩免费| 日韩av在线免费观看一区| 97碰碰碰免费色视频| 日韩成人黄色av| 成人网在线免费观看| 色青青草原桃花久久综合| 国产欧美一区二区三区视频| 国产免费一区视频观看免费| 91网站免费看| 日韩在线播放视频| 91老司机在线| 亚洲激情成人网| 成人h视频在线观看播放| 亚洲国产欧美在线成人app| 亚洲美女www午夜| 国产精品一区二区久久| 亚洲精品久久久久中文字幕二区| 青青草成人在线| 国产精品久久婷婷六月丁香| 中文字幕亚洲综合久久| 欧美主播福利视频| 欧美日韩国产麻豆| 久久躁日日躁aaaaxxxx| 91成人在线视频| 国产精品成av人在线视午夜片| 日韩av手机在线| 欧美国产日韩xxxxx| 亚洲成av人乱码色午夜| 欧美理论电影在线播放| 国产视频999| 久久久国产精品亚洲一区| 日韩黄色在线免费观看| 亚洲男人天堂久| 久久亚洲私人国产精品va| 成人h视频在线观看播放| 久久综合网hezyo| 亚洲国产精品女人久久久| 亚洲一区二区三区视频播放| 国产精品一区二区在线| 亚洲一区二区日本| 国产精品亚洲第一区| 亚洲精品白浆高清久久久久久| 国产日韩欧美中文在线播放| 精品偷拍各种wc美女嘘嘘| 精品久久久久久久久久国产| 精品久久久久久中文字幕| 国产精品爽黄69天堂a| 亚洲女人初尝黑人巨大| www.亚洲人.com| 欧美wwwwww| 激情av一区二区| 日本午夜人人精品| 91精品国产乱码久久久久久蜜臀| 欧美另类精品xxxx孕妇| 亚洲影院污污.| 96pao国产成视频永久免费| 国产精品一区=区| 亚洲精品videossex少妇| 亚洲第一偷拍网| 久久高清视频免费| 国产精品入口免费视频一| 国产精品久久久久久av福利软件| 大荫蒂欧美视频另类xxxx| 青青草国产精品一区二区| 日韩电影免费在线观看中文字幕| 国产丝袜一区二区三区免费视频| 尤物九九久久国产精品的特点| 国产精品视频内| 欧美丝袜美女中出在线| 久久久久久久久久国产精品| 国内精品美女av在线播放| 91在线观看免费高清完整版在线观看| 91久久久久久| 日本韩国在线不卡| 午夜精品蜜臀一区二区三区免费| 亚州成人av在线| 国产精品久久中文| 亚洲美女免费精品视频在线观看| 97国产在线视频| 久久露脸国产精品|