前面講了sched_clock 會返回當前從arch_time 讀取的時間,但是計算的時候有個epoch_cyc 和 epoch_ns也需要實時更新.
unsigned long long notrace sched_clock(void)
while (read_seqcount_retry(&cd.seq, seq));
return res;
}那這兩個值是在**更新的呢?
答案是sched_clock_postinit
void __init sched_clock_postinit(void)
這個函式會初始化乙個high time,這個high time的expiry time,也就是第二個引數是在sched_clock_register的時候更新的
wrap = clocks_calc_max_nsecs(new_mult, new_shift, 0, new_mask, null);
cd.wrap_kt = ns_to_ktime(wrap);
這個high time的callback函式是sched_clock_poll。
static enum hrtimer_restart sched_clock_poll(struct hrtimer *hrt)
這個函式會呼叫hrtimer_forward_now 來讓持續推動high time向前,會在update_sched_clock->update_clock_read_data 中更新epoch_cyc 和 epoch_ns
static void update_clock_read_data(struct clock_read_data *rd)
注意這個函式更新的時候分兩次更新。
static inline void raw_write_seqcount_latch(seqcount_t *s)
在raw_write_seqcount_latch 函式中會增加s->sequence++
這也是為什麼在sched_clock 會retry的原因。
unsigned long long notrace sched_clock(void)
while (read_seqcount_retry(&cd.seq, seq));
return res;
}在read_seqcount_retry->__read_seqcount_retry 中retry的條件如下。如果前兩次讀的s->sequence 不一樣,就繼續讀。
static inline int __read_seqcount_retry(const seqcount_t *s, unsigned start)
不一樣的原因就是sched_clock在讀的時候update_clock_read_data也在更新s->sequence。因此會持續讀,直到update_clock_read_data 更新完畢
為什麼要學習R語言
r的誕生 1992年,肉絲 ross ihaka 和 蘿蔔特 robert gentleman 兩個人在s語言 貝爾實驗室開發的一種統計用程式語言 的基礎上開始構思一種新的用於統計學分析的開源語言,直到1995年第乙個版本正式發布 和各位年齡相仿 因為他們名字的第乙個字母都是r,所以這門語言就被叫做...
為什麼要選擇ISP 為什麼要選擇AHD
在影象傳輸中,我們為什麼選擇nextchip?為什麼要選擇isp?為什麼要選擇ahd?為什麼選擇北京冠宇銘通?這個問題我倒著回答各位 一 北京冠宇銘通科技是nextchip目前為止唯一一家正式官方授權 車載產品廠家之一 二 ahd和其他幾種傳輸方式相比,擁有自己的專利,其他幾家有專利的沒有幾個,如果...
為什麼要分詞
這裡不討論這個問題,我要說的為什麼要分詞?分詞是什麼!有人問 分詞有什麼作用啊?某人答 搜尋引擎要用到中文分詞,所以非常重要 這完全是廢話,說了等於沒說。搜尋引擎又為什麼要分詞呢?其實一般意思上指的分詞是比較狹隘的意思,指中文的詞是怎樣劃分的。因為中文沒有空格,所以要理解一篇文 章,你首先當然要切分...