sched clock為什麼要retry

2021-07-25 20:37:07 字數 1404 閱讀 2018

前面講了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和其他幾種傳輸方式相比,擁有自己的專利,其他幾家有專利的沒有幾個,如果...

為什麼要分詞

這裡不討論這個問題,我要說的為什麼要分詞?分詞是什麼!有人問 分詞有什麼作用啊?某人答 搜尋引擎要用到中文分詞,所以非常重要 這完全是廢話,說了等於沒說。搜尋引擎又為什麼要分詞呢?其實一般意思上指的分詞是比較狹隘的意思,指中文的詞是怎樣劃分的。因為中文沒有空格,所以要理解一篇文 章,你首先當然要切分...