日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

rt带宽限制浅析

發(fā)布時(shí)間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rt带宽限制浅析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(基于linux-4.4.42)

一、摘要

??? 由于實(shí)時(shí)任務(wù)的優(yōu)先級(jí)高于普通任務(wù),因而為了防止cpu消耗型的實(shí)時(shí)任務(wù)一直占用cpu引發(fā)其他任務(wù)"饑餓"的情況發(fā)生,內(nèi)核采用了帶寬限制手段來抑制實(shí)時(shí)任務(wù)的運(yùn)行時(shí)間。系統(tǒng)中將各個(gè)任務(wù)按層級(jí)組織成一個(gè)個(gè)任務(wù)組,組內(nèi)的所有任務(wù)視為一個(gè)整體掛在一個(gè)運(yùn)行隊(duì)列上,而帶寬限制的單位也是針對(duì)一個(gè)組來進(jìn)行的。
??? 那么究竟什么是帶寬限制呢?在任務(wù)調(diào)度中帶寬限制就是指一定周期內(nèi)一個(gè)隊(duì)列上任務(wù)可運(yùn)行的最大時(shí)間,內(nèi)核中使用xxx_bandwidth結(jié)構(gòu)來限制任務(wù)的運(yùn)行時(shí)間。針對(duì)實(shí)時(shí)任務(wù)這個(gè)結(jié)構(gòu)就是: struct rt_bandwidth {/* nests inside the rq lock: */raw_spinlock_t rt_runtime_lock;ktime_t rt_period; u64 rt_runtime;struct hrtimer rt_period_timer;unsigned int rt_period_active; };??? 在單cpu環(huán)境中,rt_bandwidth限制了cpu上的實(shí)時(shí)任務(wù)在rt_period周期內(nèi)運(yùn)行時(shí)間不能夠超過rt_runtime;而在SMP多cpu環(huán)境中rt_bandwidth限制了系統(tǒng)中實(shí)時(shí)任務(wù)在rt_period周期內(nèi)的cpu占用時(shí)間比例不能夠超過rt_runtime/rt_period。
??? 舉個(gè)例子,在4核的SMP環(huán)境中,rt_runtime為950000,而rt_period為1000000,系統(tǒng)中所有實(shí)時(shí)任務(wù)的cpu(4個(gè)核的占用總和)占用率不能夠超過95%。

??? 在實(shí)時(shí)任務(wù)組調(diào)度使能的情況下,帶寬限制與各個(gè)組相關(guān),即一個(gè)任務(wù)組有一個(gè)rt_bandwidth,而這個(gè)組的rt_bandwidth限制了本組中實(shí)時(shí)任務(wù)的運(yùn)行時(shí)間。

二、實(shí)現(xiàn)原理

2.1 相關(guān)數(shù)據(jù)結(jié)構(gòu)

??? 內(nèi)核中通過static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)函數(shù)來判斷實(shí)時(shí)任務(wù)運(yùn)行時(shí)間是否超出帶寬限制。函數(shù)的核心思想就是判斷這個(gè)運(yùn)行隊(duì)列rt_rq的運(yùn)行時(shí)間是否超過了額定的運(yùn)行時(shí)間。而“運(yùn)行時(shí)間”和“額定時(shí)間”都是放在struct rt_rq運(yùn)行隊(duì)列這個(gè)結(jié)構(gòu)中的,我們來看下這個(gè)結(jié)構(gòu)相關(guān)的具體實(shí)現(xiàn):

/* Real-Time classes' related field in a runqueue: */ struct rt_rq {...... int rt_throttled; /* 調(diào)度限制標(biāo)志,置1表示使能調(diào)度限制 */u64 rt_time; /* rt_rq隊(duì)列中的調(diào)度實(shí)體已經(jīng)消耗的cpu時(shí)間 */u64 rt_runtime; /* rt_rq在一個(gè)周期內(nèi)的最大額定運(yùn)行時(shí)間 *//* Nests inside the rq lock: */......struct rq *rq; /* rt_rq所屬的就緒隊(duì)列rq */struct task_group *tg; /* rt_rq所屬的任務(wù)組 */ };??? 當(dāng)一個(gè)調(diào)度組task_group被創(chuàng)建時(shí)(例如在cgroup中創(chuàng)建一個(gè)cpu子系統(tǒng)時(shí)就會(huì)創(chuàng)建一個(gè)task_group)時(shí),內(nèi)核會(huì)為這個(gè)新的task_group在各個(gè)cpu上都創(chuàng)建一個(gè)運(yùn)行隊(duì)列struct rt_rq,而所有的 實(shí)時(shí)調(diào)度實(shí)體 都是掛在各自的運(yùn)行隊(duì)列rt_rq上的,整個(gè)結(jié)構(gòu)如下所示: /* task group related information */ struct task_group {struct cgroup_subsys_state css;...... #ifdef CONFIG_RT_GROUP_SCHEDstruct sched_rt_entity **rt_se; /* 一個(gè)組在每個(gè)cpu上都有一個(gè)代表這個(gè)層級(jí)組的rt_se */struct rt_rq **rt_rq; /* 一個(gè)組在每個(gè)cpu上都有一個(gè)rt_rq里面掛著屬于這個(gè)組的rt_ses */struct rt_bandwidth rt_bandwidth; /* 帶寬結(jié)構(gòu) */ #endif......struct list_head list;struct task_group *parent; ......struct cfs_bandwidth cfs_bandwidth; };

2.2 組調(diào)度層級(jí)結(jié)構(gòu)

??? 在引入了組調(diào)度之后,任務(wù)的調(diào)度的對(duì)象都是調(diào)度實(shí)體,而各個(gè)調(diào)度實(shí)體又有自己的父層級(jí)實(shí)體,父層級(jí)也可以再有自己的父層級(jí)...這樣層層組織起來成為一個(gè)樹狀結(jié)構(gòu)。而各個(gè)cpu上的同一個(gè)組層級(jí)se又結(jié)合在一起組成了上面提到的層級(jí)任務(wù)組結(jié)構(gòu):struct task_group。下面是一個(gè)task_group的層級(jí)結(jié)構(gòu)示意圖:

? ? ??????????????????????????????????????????????? 圖1 具有3個(gè)層的的任務(wù)組組織示意圖
??? 如上圖所示,每個(gè)task_group中都有一個(gè)rt_se**和rt_rq**,而子層級(jí)的調(diào)度實(shí)體rt_se[cpu]又都掛到父層級(jí)的的rt_rq[cpu]中。
??? 我們可以將task_group的兩個(gè)rt_se**和rt_rq**看成兩個(gè)指針數(shù)組sched_rt_entity * rt_se[cpu]和struct rt_rq *rt_rq[cpu],數(shù)組在每個(gè)cpu(cpu_possible_mask位圖中的所有cpu)上都有一個(gè)元素;
??? 子層級(jí)的調(diào)度實(shí)體都掛到本層級(jí)rt_rq隊(duì)列中,而這些調(diào)度實(shí)體都會(huì)被看成一個(gè)整體,即本層級(jí)的rt_se;一個(gè)task_group中兩者之間的關(guān)系為

tg.rt_se[cpu]->my_q == tg.rt_rq[cpu]; ? /* tg表示某一個(gè)task_group;cpu為某個(gè)具體的cpu */
tg.rt_rq[cpu]隊(duì)列掛著的所有任務(wù)都看成一個(gè)整體:tg.rt_se[cpu]。
當(dāng)tg.rt_se[cpu]->my_q == NULL 時(shí)表示這個(gè)調(diào)度實(shí)體不再是一個(gè)組,而是一個(gè)實(shí)實(shí)在在的任務(wù)。

??? 有了上面的概念,我們?cè)倏匆粋€(gè)運(yùn)行隊(duì)列的運(yùn)行時(shí)間rt_rq->rt_time和額定時(shí)間rt_rq->rt_runtime:
??? rt_rq->rt_time就表示屬于這個(gè)隊(duì)列(這個(gè)組中)的調(diào)度實(shí)體(子層級(jí)、子孫層級(jí)...一直到葉子節(jié)點(diǎn)層層累加)的運(yùn)行時(shí)間;rt_rq->rt_runtime就表示屬于此隊(duì)列的實(shí)體的額定時(shí)間。
??? 調(diào)度器在檢查一個(gè)調(diào)度實(shí)體運(yùn)行時(shí)間是否超額時(shí),實(shí)際檢查的是它所在的運(yùn)行隊(duì)列的rt_rq[cpu]->rt_time是否超過rt_rq[cpu]->rt_runtime;在SMP系統(tǒng)中,如果內(nèi)核使能了RT_RUNTIME_SHARE特性,如果運(yùn)行隊(duì)列的運(yùn)行時(shí)間已經(jīng)超額,則會(huì)嘗試去其他cpu上的rt_rq隊(duì)列中“借”時(shí)間以擴(kuò)張rt_rq[cpu]->rt_runtime。
??? 不論如何,如果運(yùn)行隊(duì)列的運(yùn)行時(shí)間rt_rq->rt_time超額且在使能了帶寬限制的情況下,會(huì)使能rt_rq的調(diào)度限制標(biāo)志:rt_rq->rt_throttled = 1,調(diào)度受限標(biāo)志一旦使能,后續(xù)就rt_rq就無(wú)法得到調(diào)度。

三、帶寬限制的來龍去脈

3.1 帶寬和運(yùn)行時(shí)間初始化

3.1.1 root組帶寬初始化

??? 最頂層的root組是所有task_group的祖先,內(nèi)核中用全局變量struct task_group root_task_group定義。它在內(nèi)核啟動(dòng)初期由sche_init()進(jìn)行初始化的:

start_kernel()|sched_init()??? 我們來看一下sched_init()做了哪些工作:
??? 1) 帶寬初始化
??? 針對(duì)實(shí)時(shí)任務(wù),這里會(huì)對(duì)兩個(gè)帶寬結(jié)構(gòu)進(jìn)行初始化:全局struct rt_bandwidth def_rt_bandwidth和root_task_group.rt_bandwidth,并且將他們的帶寬周期和運(yùn)行時(shí)間額度都初始化為相同的值: def_rt_bandwidth.rt_period = sysctl_sched_rt_period; def_rt_bandwidth.rt_runtime = sysctl_sched_rt_runtime; root_task_group.rt_bandwidth.rt_period = sysctl_sched_rt_period; root_task_group.rt_bandwidth.rt_runtime = sysctl_sched_rt_runtime;??? 其中sysctl_sched_rt_period和sysctl_sched_rt_runtime值都是內(nèi)核定義的全局變量,可以通過/proc/sys/kernel/sched_rt_period_us 和 /proc/sys/kernel/sched_rt_runtime_us 分別查看;默認(rèn)情況下這兩個(gè)變量的值分別為1000000 和 950000,單位都是是微秒。
??? 這樣初始化以后,默認(rèn)情況下def_rt_bandwidth和root_task_group.rt_bandwidth的周期為1秒;而它們的額定時(shí)間為0.95秒。

??? 2)調(diào)度實(shí)體和運(yùn)行隊(duì)列初始化
??? 根組root_task_group的 struct sched_rt_entity **rt_se 和 struct rt_rq **rt_rq 成員實(shí)際上是兩個(gè)指針數(shù)組,每個(gè)數(shù)組成員與一個(gè)cpu相對(duì)應(yīng);root_task_group中的這些調(diào)度實(shí)體和運(yùn)行隊(duì)列最終是需要和每個(gè)cpu上就緒隊(duì)列rq中的成員關(guān)聯(lián)起來的,效果如下偽代碼所示: rq[cpu]->rt.tg = root_task_group; root_task_group.rt_rq[cpu] = rq[cpu]->rt; root_task_group->rt_se[cpu] = NULL; rq[cpu]->rt.rt_runtime = def_rt_bandwidth.rt_runtime; /* 這里將top rt_rq的時(shí)間額度設(shè)置為950000微秒 */??? 其中,rq->rt是一個(gè)就緒隊(duì)列上最頂層的運(yùn)行隊(duì)列rt_rq,它的運(yùn)行時(shí)間額度rq->rt.rt_runtime初始化為def_rt_bandwidth.rt_runtime,默認(rèn)為0.95秒。

3.1.2 新建一個(gè)task_group

??? 一個(gè)task_group分組的創(chuàng)建是通過sched_create_group()函數(shù)來實(shí)現(xiàn)的。內(nèi)核中在執(zhí)行 setsid()系統(tǒng)調(diào)用函數(shù) 或者 創(chuàng)建一個(gè)cpu子系統(tǒng)控制組的時(shí)候都會(huì)調(diào)用sched_create_group()來創(chuàng)建一個(gè)task組。
??? 我們跟隨sched_create_group()函數(shù)的腳步看看一個(gè)task_group如何創(chuàng)建,rt_badwidth如何初始化,一個(gè)新的rt_rq的額定時(shí)間如何設(shè)置。 /* allocate runqueue etc for a new task group */ struct task_group *sched_create_group(struct task_group *parent) {struct task_group *tg;tg = kzalloc(sizeof(*tg), GFP_KERNEL); /* 分配task_group結(jié)構(gòu) */if (!tg)return ERR_PTR(-ENOMEM);if (!alloc_fair_sched_group(tg, parent)) /* fair調(diào)度的情況 */goto err;if (!alloc_rt_sched_group(tg, parent)) /* 真正的初始化發(fā)生在這里 */goto err;return tg;err:sched_free_group(tg);return ERR_PTR(-ENOMEM); }??? 函數(shù)sched_create_group有兩個(gè)主要部分,第一步分配task_group結(jié)構(gòu),第二步就是分配和初始化task_group中的調(diào)度實(shí)體和運(yùn)行隊(duì)列。第二步中,針對(duì)普通任務(wù)調(diào)用alloc_fair_sched_group()函數(shù)來完成,針對(duì)實(shí)時(shí)任務(wù)調(diào)用alloc_rt_sched_group()來完成;我們重點(diǎn)分析實(shí)時(shí)任務(wù)的情況: int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent) {struct rt_rq *rt_rq;struct sched_rt_entity *rt_se;int i;tg->rt_rq = kzalloc(sizeof(rt_rq) * nr_cpu_ids, GFP_KERNEL); /* 準(zhǔn)備nr_cpu_ids個(gè)rt_rq空間 */if (!tg->rt_rq)goto err;tg->rt_se = kzalloc(sizeof(rt_se) * nr_cpu_ids, GFP_KERNEL); /* 準(zhǔn)備nr_cpu_ids個(gè)rt_se空間 */if (!tg->rt_se)goto err;init_rt_bandwidth(&tg->rt_bandwidth, /* 將tg->rt_period初始化為def_rt_bandwidth.rt_period ;ktime_to_ns(def_rt_bandwidth.rt_period), 0); * tg->rt_runtime初始化為 0 */for_each_possible_cpu(i) {rt_rq = kzalloc_node(sizeof(struct rt_rq), /* */GFP_KERNEL, cpu_to_node(i));if (!rt_rq)goto err;rt_se = kzalloc_node(sizeof(struct sched_rt_entity),GFP_KERNEL, cpu_to_node(i));if (!rt_se)goto err_free_rq;init_rt_rq(rt_rq); /* 初始化rt_rq成員 */rt_rq->rt_runtime = tg->rt_bandwidth.rt_runtime; /* 設(shè)置rt_rq->rt_runtime = 0 */init_tg_rt_entry(tg, rt_rq, rt_se, i, parent->rt_se[i]); /* 將新分配的rt_rq、rt_se與tg以及parent組進(jìn)行關(guān)聯(lián) */}return 1;err_free_rq:kfree(rt_rq); err:return 0; }??? 函數(shù)alloc_rt_sched_group()的主要任務(wù)就是分配tg->rt_rq和tg->rt_re這兩個(gè)指針數(shù)組在各個(gè)cpu上對(duì)應(yīng)的調(diào)度實(shí)體rt_se和運(yùn)行隊(duì)列rt_rq結(jié)構(gòu)體實(shí)例,并初始化這些結(jié)構(gòu)體。
??? 可以看到一個(gè)新創(chuàng)建的tg->rt_bandwidth.rt_runtime以及各個(gè)cpu上的rt_rq->rt_runtime都初始化為0。這在創(chuàng)建一個(gè)cpu子系統(tǒng)控制組的的情況下更加容易驗(yàn)證: # mount -t cgroup cpu -o cpu /cgroup/cpu /* 創(chuàng)建cpu子系統(tǒng) */ # mkdir /cgroup/cpu/child0 /* 創(chuàng)建一個(gè)child0子組 */??? 這個(gè)時(shí)候我們可以通過 "cat /cgroup/cpu/child0/cpu.rt_runtime_us"為0,即這個(gè)新創(chuàng)建的子組中tg->rt_bandwidth.rt_runtime為0,直到我們往通過"echo xxx > /cgroup/cpu/child0/cpu.rt_runtime_us"寫值是才會(huì)改變,此時(shí)tg->rt_bandwidth.rt_runtime和組內(nèi)各個(gè)cpu上的運(yùn)行隊(duì)列的額定時(shí)間tg-rt_rq[cpu]->rt_runtime都設(shè)置為我們寫入的值。

3.2 帶寬限制的檢查流程

??? 內(nèi)核在多個(gè)關(guān)鍵點(diǎn)都會(huì)更新自己cpu上當(dāng)前任務(wù)的運(yùn)行時(shí)間信息,針對(duì)實(shí)時(shí)任務(wù)調(diào)用的是update_curr_rt()來進(jìn)行更新。更新當(dāng)前任務(wù)運(yùn)行時(shí)間是任務(wù)調(diào)度一個(gè)非常重要的行為:任務(wù)運(yùn)行多久、何時(shí)選擇下一個(gè)任務(wù)、選擇哪個(gè)任務(wù)運(yùn)行以及cpu負(fù)載均衡等等都需要是基于任務(wù)信息不斷更新來進(jìn)行的。
??? 對(duì)于實(shí)時(shí)調(diào)度,如果使能了帶寬限制(即sysctl_sched_rt_runtime >= 0),還要更新當(dāng)前任務(wù)的運(yùn)行隊(duì)列(即葉子節(jié)點(diǎn))到其祖先(root 節(jié)點(diǎn))所在的運(yùn)行隊(duì)列的運(yùn)行時(shí)間: rt_rq->rt_time += delta_exec;??? 更新完一個(gè)運(yùn)行隊(duì)列后,還要通過 sched_rt_runtime_exceeded(rt_rq);??? 檢查運(yùn)行隊(duì)列的運(yùn)行時(shí)間是否超過額定運(yùn)行時(shí)間,如果超過額定運(yùn)行時(shí)間還要通過resched_curr(rq)將就緒隊(duì)列rq上的當(dāng)前任務(wù)設(shè)置為TIF_NEED_RESCHED標(biāo)志以被調(diào)度出去。
??? 下面我們就來看看sched_rt_runtime_exceeded(rt_rq)是如何檢查一個(gè)隊(duì)列的運(yùn)行時(shí)間超額與否的。 static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq) {u64 runtime = sched_rt_runtime(rt_rq); /* runtime為額定時(shí)間rt_rq->rt_runtime */if (rt_rq->rt_throttled) /* 如果受到調(diào)度限制直接返回 */return rt_rq_throttled(rt_rq); if (runtime >= sched_rt_period(rt_rq)) /* 如果rt_rq的額定時(shí)間大于周期說明不會(huì)發(fā)生超時(shí),返回0表示不超額 */return 0;balance_runtime(rt_rq); /* 對(duì)rt_rq的額定時(shí)間進(jìn)行"balance" */runtime = sched_rt_runtime(rt_rq); /* balance后rt_rq的額定時(shí)間可能會(huì)改變,所以需要重新獲取rt_rq->rt_runtime */if (runtime == RUNTIME_INF) /* 額定時(shí)間"無(wú)限",也返回0表示沒有超額 */return 0;if (rt_rq->rt_time > runtime) { /* 如果 rt_rq上的運(yùn)行時(shí)間大于了額定時(shí)間 */struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq);/** Don't actually throttle groups that have no runtime assigned* but accrue some time due to boosting.*/if (likely(rt_b->rt_runtime)) { /* 一般情況下帶寬額定時(shí)間rt_b->rt_runtime都不為0 */rt_rq->rt_throttled = 1; /* 在rt_rq的運(yùn)行時(shí)間超過額定時(shí)間的情況下設(shè)置調(diào)度限制rt_throttled */printk_deferred_once("sched: RT throttling activated\n");} else {/** In case we did anyway, make it go away,* replenishment is a joke, since it will replenish us* with exactly 0 ns.*/rt_rq->rt_time = 0;}if (rt_rq_throttled(rt_rq)) { /* 如果rt_rq運(yùn)行時(shí)間超額且設(shè)置了調(diào)度限制標(biāo)志 */sched_rt_rq_dequeue(rt_rq); /* 先將rt_rq對(duì)應(yīng)的實(shí)體從隊(duì)列刪除,再放到隊(duì)尾;* 注意:函數(shù)想將rt_rq這個(gè)組的rt_se及其所有的祖先rt_se出隊(duì),然后再?gòu)淖嫦萺t_se開始再依次放到隊(duì)尾;任何一個(gè)rt_rq的調(diào)度受限時(shí),對(duì)應(yīng)的rt_se在__enqueue_rt_entity(rt_se)是不能入隊(duì)的,所以這里的rt_rq對(duì)應(yīng)組的調(diào)度實(shí)體不會(huì)入隊(duì)的;入不了隊(duì)也就意味著無(wú)法得到調(diào)度。 */return 1;}}return 0; }??? 我們來縷一縷思路:
??? 1) sched_rt_runtime_exceeded(rt_rq)用于判斷一個(gè)rt_rq上的運(yùn)行時(shí)間是否超時(shí),如果超時(shí)則返回1否則返回0;
??? 2) 這個(gè)函數(shù)首先檢查的是rt_rq有沒有調(diào)度限制,額定時(shí)間是否大于帶寬周期;第一種一般情況返回1(除非發(fā)生了優(yōu)先級(jí)翻轉(zhuǎn)),第二種情況返回0;
??? 3) 如果即沒有調(diào)度限制,額定時(shí)間也在帶寬周期范圍內(nèi),則首先要對(duì)對(duì)rt_rq->rt_runtime進(jìn)行"balance",即在多核情況下,其他cpu上的rt_rq還有剩余時(shí)間,可以從其他cpu的rt_rq中"借"時(shí)間;
??? 4) 經(jīng)過"balance"后,rt_rq的額定時(shí)間可能會(huì)增加,最多增加到帶寬周期,此時(shí)再去檢查運(yùn)行時(shí)間(rt_rq->rt_time)是否超過額定時(shí)間(rt_rq->rt_runtime);

???? 5)如果運(yùn)行時(shí)間超額,且?guī)掝~定時(shí)間不為0的情況下將設(shè)置調(diào)度限制標(biāo)志:rt_rq->rt_throttled = 1,并將rt_rq中的所有上層實(shí)體放到隊(duì)尾,rt_rq對(duì)應(yīng)的本層實(shí)體則出隊(duì);

??? 一旦調(diào)度被限制(rt_rq->rt_throttled不為0且沒有發(fā)生優(yōu)先級(jí)翻轉(zhuǎn)),會(huì)有下列影響:
? ?? 1) sched_rt_runtime_exceeded()檢查時(shí)返回1,會(huì)為當(dāng)前任務(wù)rq->curr設(shè)置TIF_NEED_RESCHED標(biāo)志,等到下次中斷返回時(shí)會(huì)將它調(diào)度出去;
???? 2) 在調(diào)度受限的情況下,任務(wù)的"加入運(yùn)行隊(duì)列的"入口都會(huì)拒絕將一個(gè)調(diào)度實(shí)體入隊(duì),如enqueue_top_rt_rq(rt_rq)和__enqueue_rt_entity(rt_se, head)函數(shù)都會(huì)跳過調(diào)度受限的隊(duì)列。

3.3 調(diào)度限制的解除

??? 上面已經(jīng)了解到,如果一個(gè)隊(duì)列調(diào)度限制使能的情況下,將無(wú)法得到調(diào)度運(yùn)行的機(jī)會(huì);但是任務(wù)不可能一直處于調(diào)度限制,因?yàn)槟菢拥脑捜蝿?wù)就永遠(yuǎn)得不到執(zhí)行了。這個(gè)時(shí)候就需要一種檢查機(jī)制,一旦調(diào)度限制已經(jīng)讓任務(wù)得到了應(yīng)有的“懲罰”,就需要解除這個(gè)限制,讓它重獲自由。
??? 內(nèi)核中在struct task_group結(jié)構(gòu)rt_bandwidth的高精度時(shí)鐘rt_period_timer來實(shí)現(xiàn)此功能。高精度時(shí)鐘rt_period_timer在帶寬初始化函數(shù)init_rt_bandwidth()中進(jìn)行初始化: void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime) {rt_b->rt_period = ns_to_ktime(period);rt_b->rt_runtime = runtime;raw_spin_lock_init(&rt_b->rt_runtime_lock);hrtimer_init(&rt_b->rt_period_timer, /* 初始化帶寬的高精度時(shí)鐘 */CLOCK_MONOTONIC, HRTIMER_MODE_REL);rt_b->rt_period_timer.function = sched_rt_period_timer; /* 設(shè)置時(shí)鐘到期處理函數(shù):sched_rt_period_timer */ }??? 帶寬初始化函數(shù)init_rt_bandwidth()在創(chuàng)建一個(gè)task_group時(shí)調(diào)用,這樣rt_bandwidth的高精度定時(shí)器也會(huì)在這個(gè)時(shí)候初始化;rt_bandwidth的高精度時(shí)鐘初始化后通過hrtimer_start_expires()激活運(yùn)轉(zhuǎn)起來。每當(dāng)調(diào)用__enqueue_rt_entity()函數(shù)將一個(gè)rt_se調(diào)度實(shí)體入隊(duì)時(shí),都會(huì)檢查rt_se所在組的rt_bandwidth上的高精度時(shí)鐘是否激活,如果沒有激活則將其激活。 __enqueue_rt_entity()|inc_rt_tasks(rt_se, rt_rq)|inc_rt_group(rt_se, rt_rq)|start_rt_bandwidth(&rt_rq->tg->rt_bandwidth)??? start_rt_bandwidth調(diào)用函數(shù)來完成rt_bandwidth高精度時(shí)鐘的激活,如下所示: static void start_rt_bandwidth(struct rt_bandwidth *rt_b) {if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF)return;raw_spin_lock(&rt_b->rt_runtime_lock);if (!rt_b->rt_period_active) {rt_b->rt_period_active = 1;hrtimer_forward_now(&rt_b->rt_period_timer, rt_b->rt_period); /* 將定時(shí)器到期時(shí)間設(shè)置為一個(gè)帶寬周期 */hrtimer_start_expires(&rt_b->rt_period_timer, HRTIMER_MODE_ABS_PINNED); /* 激活定時(shí)器 */}raw_spin_unlock(&rt_b->rt_runtime_lock); }??? 鋪墊了這么多,終于等到了定時(shí)器的激活;激活后定時(shí)器開始飛速運(yùn)轉(zhuǎn),直到我們?cè)O(shè)置的定時(shí)器到期;而定時(shí)器到期意味著什么呢?意味著時(shí)鐘到期處理函數(shù)rt_b->rt_period_timer.function的調(diào)用執(zhí)行,而這個(gè)函數(shù)在帶寬初始化時(shí)設(shè)置為sched_rt_period_timer(),所以時(shí)鐘到期后實(shí)際回調(diào)的是sched_rt_period_timer()。 static enum hrtimer_restart sched_rt_period_timer(struct hrtimer *timer) {struct rt_bandwidth *rt_b =container_of(timer, struct rt_bandwidth, rt_period_timer);int idle = 0;int overrun;raw_spin_lock(&rt_b->rt_runtime_lock);for (;;) {overrun = hrtimer_forward_now(timer, rt_b->rt_period); /* 更新時(shí)鐘,overrun返回時(shí)鐘超時(shí)期數(shù) */if (!overrun)break;raw_spin_unlock(&rt_b->rt_runtime_lock);idle = do_sched_rt_period_timer(rt_b, overrun); /* 主要的處理函數(shù) */raw_spin_lock(&rt_b->rt_runtime_lock);}if (idle)rt_b->rt_period_active = 0; /* idle==1表示此task_group中沒有可調(diào)度的任務(wù),時(shí)鐘標(biāo)志設(shè)置為未激活 */raw_spin_unlock(&rt_b->rt_runtime_lock);return idle ? HRTIMER_NORESTART : HRTIMER_RESTART; }??? 再來瞧瞧這個(gè)核心的處理函數(shù): static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun) {int i, idle = 1, throttled = 0;const struct cpumask *span;span = sched_rt_period_mask(); #ifdef CONFIG_RT_GROUP_SCHED/** FIXME: isolated CPUs should really leave the root task group,* whether they are isolcpus or were isolated via cpusets, lest* the timer run on a CPU which does not service all runqueues,* potentially leaving other CPUs indefinitely throttled. If* isolation is really required, the user will turn the throttle* off to kill the perturbations it causes anyway. Meanwhile,* this maintains functionality for boot and/or troubleshooting.*/if (rt_b == &root_task_group.rt_bandwidth)span = cpu_online_mask; #endiffor_each_cpu(i, span) { /* 分析此帶寬所在的task_group組上各個(gè)cpu的運(yùn)行隊(duì)列rt_rq */int enqueue = 0;struct rt_rq *rt_rq = sched_rt_period_rt_rq(rt_b, i);struct rq *rq = rq_of_rt_rq(rt_rq);raw_spin_lock(&rq->lock);if (rt_rq->rt_time) { /* rt_rq運(yùn)行時(shí)間不為0:rt_rq的運(yùn)行時(shí)間只有在rt_bandwidth高精度時(shí)鐘* 到期后才得以重新統(tǒng)計(jì) */u64 runtime;raw_spin_lock(&rt_rq->rt_runtime_lock);if (rt_rq->rt_throttled)balance_runtime(rt_rq); /* 如果rt_rq調(diào)度受限進(jìn)行"balcance",以嘗試從其他cpu的rt_rq偷時(shí)間* 這是第二次出現(xiàn)。*/runtime = rt_rq->rt_runtime;rt_rq->rt_time -= min(rt_rq->rt_time, overrun*runtime); /* 抹去周期運(yùn)行時(shí)間;* @overrun:超過時(shí)鐘周期數(shù);@runtime:一個(gè)周期內(nèi)運(yùn)行隊(duì)列的額定運(yùn)行時(shí)間;* 沒有到一個(gè)周期,則將運(yùn)行時(shí)間清0;否則 * 運(yùn)行時(shí)間設(shè)置為過期超出的額定時(shí)間;*/if (rt_rq->rt_throttled && rt_rq->rt_time < runtime) { /* 如果剩余的運(yùn)行時(shí)間小于一個(gè)周期額定時(shí)間 rt_rq->rt_throttled = 0; * 則清除調(diào)度限制標(biāo)志,并將入隊(duì)標(biāo)志設(shè)置為1 */enqueue = 1;/** When we're idle and a woken (rt) task is* throttled check_preempt_curr() will set* skip_update and the time between the wakeup* and this unthrottle will get accounted as* 'runtime'.*/if (rt_rq->rt_nr_running && rq->curr == rq->idle)rq_clock_skip_update(rq, false);}if (rt_rq->rt_time || rt_rq->rt_nr_running)idle = 0;raw_spin_unlock(&rt_rq->rt_runtime_lock);} else if (rt_rq->rt_nr_running) { /* 如果此周期rt_rq沒有運(yùn)行時(shí)間,但是rt_rq還有就緒的任務(wù),idle = 0; * 且rt_rq沒有調(diào)度限制則入隊(duì)標(biāo)志置1 */if (!rt_rq_throttled(rt_rq))enqueue = 1;}if (rt_rq->rt_throttled)throttled = 1;if (enqueue)sched_rt_rq_enqueue(rt_rq); /* 在3.2中可以看到rt_rq帶寬超時(shí)后sched_rt_rq_dequeue()出隊(duì)后無(wú)法再入隊(duì),直到這里解除了調(diào)度限制 */raw_spin_unlock(&rq->lock);}if (!throttled && (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF))return 1;return idle; /* idle返回0表示有cpu上無(wú)可運(yùn)行調(diào)度實(shí)體 */ }}
??? 到此我們匆匆瀏覽了一個(gè)task_group中高精度時(shí)鐘的運(yùn)行流程;從上面do_sched_rt_period_timer(rt_b, overrun)函數(shù)也可以看到隊(duì)列的帶寬限制的解除條件:在時(shí)鐘到期后重新計(jì)算rt_rq的運(yùn)行時(shí)間(也就是剩余的運(yùn)行時(shí)間),如果更新后的運(yùn)行時(shí)間小于一個(gè)周期的額定時(shí)間,則會(huì)解除rt_rq的調(diào)度限制rt_rq->rt_throttled = 0。

四、總結(jié)

??? 上面簡(jiǎn)要分析了內(nèi)核中如何通過帶寬限制來防止實(shí)時(shí)任務(wù)無(wú)限制的占用cpu資源的實(shí)現(xiàn)方式。
??? 1 帶寬限制的對(duì)象是一個(gè)組,組內(nèi)的任務(wù)都掛到同一個(gè)運(yùn)行隊(duì)列rt_rq上,最終帶寬限制的實(shí)施對(duì)象就是rt_rq;
??? 2 內(nèi)核在多個(gè)關(guān)鍵點(diǎn)更新任務(wù)的信息update_curr_rt(),而更新當(dāng)前任務(wù)信息后,就會(huì)檢查組的運(yùn)行時(shí)間是否超過帶寬限制;
??? 3 如果一個(gè)rt_rq超過帶寬限制,則會(huì)標(biāo)記此rt_rq調(diào)度受限,此后rt_rq上的實(shí)體將被移出隊(duì)列,并且?guī)捪拗平獬盁o(wú)法再加入到隊(duì)列上;
??? 4 每個(gè)任務(wù)組都維護(hù)著一個(gè)高精度時(shí)鐘用以定期(rt_period)更新rt_rq上的運(yùn)行時(shí)間,并對(duì)"被懲罰到位"的rt_rq解除調(diào)度限制。

上文中有兩處提到了對(duì)運(yùn)行隊(duì)列rt_rq的額定時(shí)間進(jìn)行"balance",這個(gè)"balcance"是如何工作的呢?敬請(qǐng)期待,我們下期再講。

總結(jié)

以上是生活随笔為你收集整理的rt带宽限制浅析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

中文乱幕日产无线码1区 | 亚洲精品乱码久久久久久久久久 | 麻豆视频在线观看 | 日本护士撒尿xxxx18 | 久久99精品国产 | 91豆花在线 | 国产在线观看91 | 黄色片毛片 | 免费电影播放 | 日韩在线视频一区二区三区 | 国产四虎影院 | 久久久久久国产精品亚洲78 | 日韩免费观看一区二区三区 | 一级a性色生活片久久毛片波多野 | 色婷婷视频在线 | 欧美大片大全 | 免费看黄色大全 | 九九九毛片 | 911久久香蕉国产线看观看 | 国内精品久久久久影院一蜜桃 | 亚洲精品视频免费观看 | 国产手机在线精品 | 日韩精品中文字幕在线 | 91精品视频导航 | 国产成人三级在线播放 | 国产精品综合久久 | 狠狠色香婷婷久久亚洲精品 | av成人免费网站 | 日本中文字幕视频 | 中文字幕久久久精品 | 中文av在线播放 | 国产欧美日韩精品一区二区免费 | 亚洲精品免费在线播放 | 中文字幕国内精品 | 免费看91的网站 | 欧美综合在线视频 | 奇米影音四色 | 亚洲夜夜综合 | 久久五月婷婷丁香社区 | 婷婷激情五月综合 | 日批视频在线 | 狠狠色狠狠综合久久 | 国产精品久久久久永久免费观看 | 国产综合精品一区二区三区 | 最新国产精品视频 | 成人国产精品久久久久久亚洲 | 91porny九色在线播放 | 国产成人一区二区精品非洲 | 国产91综合一区在线观看 | 日日干天天干 | 国产精品一区二区免费在线观看 | 人人玩人人添人人澡超碰 | 中文字幕av在线电影 | 综合网伊人 | 久久观看最新视频 | www.五月婷婷.com | 国产做a爱一级久久 | 国产精品久久99综合免费观看尤物 | 国产一区 在线播放 | 色视频成人在线观看免 | 在线观看片 | 国产精品一区在线观看 | 欧美嫩草影院 | 欧美日韩aaaa | 激情综合中文娱乐网 | 亚洲一区欧美精品 | 亚洲高清视频在线 | 91麻豆精品国产91久久久更新时间 | 欧美十八 | 日韩久久在线 | 久久亚洲精品电影 | 成年人在线免费看视频 | 天天干夜夜夜 | 日韩视频在线不卡 | 成人黄色免费在线观看 | 97免费在线观看视频 | 国产黄色a| 日本在线成人 | 亚洲国产999 | 国产剧情一区在线 | japanesexxxxfreehd乱熟 | av电影中文字幕 | 久久国产精品一区二区三区四区 | 中文字幕乱码在线播放 | 97超碰总站 | 久久久久国产一区二区 | 五月婷婷丁香六月 | 超碰免费97 | www.人人草 | 亚洲性少妇性猛交wwww乱大交 | 成人sm另类专区 | 成人福利在线 | av丝袜在线 | 国产免费一区二区三区最新6 | 国内精品视频在线播放 | www黄色av | 美女视频又黄又免费 | 成人a级网站 | 日韩高清成人在线 | 国产精品专区h在线观看 | 日日干夜夜干 | 在线一二三区 | 久久综合狠狠综合 | 热久久国产精品 | 国产福利91精品一区 | 亚洲视频 视频在线 | 怡红院av久久久久久久 | 国产精品福利无圣光在线一区 | 久久99这里只有精品 | 亚洲香蕉视频 | 午夜久久影视 | 亚洲更新最快 | 婷婷丁香激情 | av在线免费网| 激情偷乱人伦小说视频在线观看 | 国产在线播放不卡 | 国产女v资源在线观看 | 国产精品嫩草影院123 | 成人久久18免费 | 成人免费看视频 | 亚洲一级电影 | 麻豆91视频 | 97电影手机版 | 97电院网手机版 | 亚洲欧美精品一区 | 久久美女视频 | 综合久色| 色视频在线观看免费 | 国产精品久久久久久久久婷婷 | 99视频在线看 | 国产欧美精品一区二区三区 | 久久综合狠狠综合 | 在线观看视频福利 | 国产又粗又长的视频 | 国产亚洲精品中文字幕 | 狠狠色丁香久久综合网 | 51精品国自产在线 | 午夜精品久久久久久久久久 | 午夜三级理论 | 国产精品久久久久久超碰 | 91精品办公室少妇高潮对白 | 国产成人免费高清 | 国产黄色理论片 | 亚洲免费国产视频 | 午夜影院日本 | 色资源中文字幕 | 亚洲伦理电影在线 | 久久免费视频一区 | 天天操夜夜爱 | 江苏妇搡bbbb搡bbbb | 日韩高清不卡一区二区三区 | 国产精品一区二区在线播放 | 成人av免费看 | www.色的| 国产拍揄自揄精品视频麻豆 | 天天综合婷婷 | 日韩电影一区二区三区 | 外国av网| 久久久久久久综合色一本 | 99精品视频免费观看视频 | 日韩激情免费视频 | 免费日韩 精品中文字幕视频在线 | 一二三区视频在线 | 天天激情综合网 | 看片网站黄色 | 久久草视频| 热久久免费视频 | 91视频高清完整版 | 中文字幕一区二区三区四区 | 中文字幕日本特黄aa毛片 | 夜夜躁日日躁 | 夜夜爽88888免费视频4848 | 欧美一二区视频 | 日韩精品在线看 | 玖玖在线播放 | 久久在线一区 | 日本黄色免费在线观看 | 日本激情视频中文字幕 | 免费观看一级 | 国产在线精品视频 | av福利在线 | 日韩免费一区二区在线观看 | 在线观看中文字幕dvd播放 | 久久激情久久 | 男女免费视频观看 | 日韩一区精品 | 欧美最猛性xxx | 亚洲每日更新 | 国产拍揄自揄精品视频麻豆 | 国产日产欧美在线观看 | 91综合久久一区二区 | 精品一区欧美 | 99热9 | 国产视频久久久 | 国产亚洲精品久久 | 久久网址 | 欧美a级成人淫片免费看 | 国产分类视频 | 91麻豆网| 国产免费不卡av | 亚洲精选在线观看 | 日韩美在线观看 | 中文字幕电影一区 | 天天操夜夜操天天射 | 国产精品99久久久精品 | 激情网站五月天 | 欧美午夜久久久 | 国产精品女人久久久久久 | 天天干天天操av | 国产伦精品一区二区三区高清 | 国产视频69 | 久草在线免费色站 | 欧美成人高清 | 五月天亚洲综合 | 中文字幕人成不卡一区 | 中文字幕欧美日韩va免费视频 | 免费观看黄 | 香蕉视频18 | 久久久久亚洲精品 | 欧美色综合久久 | 999男人的天堂 | 国产成人精品综合久久久 | 天天操狠狠干 | 国产精品成人a免费观看 | 欧美淫aaa免费观看 日韩激情免费视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 日韩在线视频一区 | 精品毛片一区二区免费看 | 久人人| 欧美一区二区在线 | 国产香蕉久久 | 在线视频婷婷 | 麻豆果冻剧传媒在线播放 | 91大神dom调教在线观看 | www.久久久.cum | 中文字幕资源在线观看 | 91在线你懂的 | 中文av在线播放 | 成人毛片100免费观看 | 精品伦理一区二区三区 | 亚洲精品免费看 | 成人av影视在线 | 国产精品ssss在线亚洲 | 免费国产亚洲视频 | 奇米网在线观看 | av网在线观看| 黄av免费 | www九九热| 日韩在线视频一区 | 久久久九色精品国产一区二区三区 | 亚洲在线看 | 欧美色图亚洲图片 | 亚洲精品久久久久久中文传媒 | 成人免费在线看片 | 欧美性色黄 | 天天操天天干天天插 | 黄色一级大片在线观看 | 国产精品毛片一区视频播 | 欧美一区二视频在线免费观看 | 久久久久久久久电影 | 日韩av不卡播放 | 成人h动漫在线看 | 久久久精品国产一区二区三区 | 超碰在线资源 | 天天干天天爽 | 亚洲国产精品成人av | 有码中文字幕在线观看 | 91中文在线视频 | 欧美日韩18| 中文字幕中文字幕在线中文字幕三区 | 黄色av一区二区 | 韩国视频一区二区三区 | 成人亚洲免费 | 999男人的天堂 | 人人射 | 九九久久电影 | 国产一级二级三级视频 | 国产精品久久久av | 天堂资源在线观看视频 | 成 人 黄 色 视频 免费观看 | 久久久久久久电影 | 日日操日日干 | 日日夜日日干 | 97超碰人人爱 | 免费久久网 | 色综合久久天天 | 5月丁香婷婷综合 | 国产流白浆高潮在线观看 | 天天干天天操天天拍 | 国产精品美女视频网站 | 九九久久影院 | 女人高潮一级片 | 日韩电影在线观看一区二区 | 日韩网页 | 久久久精华网 | 国产精品激情偷乱一区二区∴ | 亚洲精品视频国产 | 丁香午夜婷婷 | 日韩三级视频在线看 | 超碰官网 | 91在线视频在线观看 | 日本高清中文字幕有码在线 | 婷婷色网址 | 国产黄色大全 | 久久久久久久久久久久亚洲 | av线上看 | 麻豆一级视频 | 操一草 | 亚洲91视频 | 在线视频a| 久久婷婷国产色一区二区三区 | 四虎永久免费网站 | 国产1区2区3区精品美女 | 国产 日韩 欧美 中文 在线播放 | 免费黄色激情视频 | 精品伊人久久久 | 91自拍91| 国产黄色视 | 久久天天躁夜夜躁狠狠85麻豆 | 国产在线看一区 | 久久久久免费 | 免费色婷婷| 亚洲视频在线播放 | 激情图片qvod | 久久午夜精品视频 | 婷婷在线免费 | 亚洲视频 视频在线 | 在线观看一区二区视频 | 免费观看高清 | 国产精品久久99综合免费观看尤物 | 婷婷亚洲综合五月天小说 | 4438全国亚洲精品观看视频 | 国产一性一爱一乱一交 | 亚洲国产成人久久 | 在线免费看黄色 | 在线免费视频 你懂得 | 国产另类av | 国产一二三区在线观看 | 在线观看精品一区 | 在线免费黄色 | 成人av在线看 | 九九热免费在线视频 | 国产成人久久精品亚洲 | 国产精品不卡 | 国产精品一区二区三区视频免费 | 91精品久久久久久久久久入口 | www国产精品com | 91网址在线观看 | 青青草华人在线视频 | 在线观看蜜桃视频 | 日韩免费网址 | 国产精品久久一区二区三区, | 亚洲精品在线观看免费 | 国产精品久久久久久久久久 | 97超在线| 福利一区二区在线 | 午夜视频在线观看一区二区 | 五月天激情视频 | 黄色片免费看 | 亚洲最大激情中文字幕 | 欧美一区二区三区特黄 | 国产一区在线免费观看视频 | 欧美日韩免费网站 | 国产欧美最新羞羞视频在线观看 | 天天摸日日摸人人看 | 天天色天天草天天射 | 在线观看岛国片 | 超碰人人在线 | 亚洲精品国产精品国自产观看浪潮 | 国产精品欧美精品 | 中文字幕视频观看 | 九九一级片 | 中文字幕国产 | 一区二区三区在线免费观看视频 | av中文字幕在线电影 | 日韩激情视频在线 | 日韩欧美一级二级 | 亚洲视频免费在线看 | 中文字幕在线观看完整版 | 精品国产自在精品国产精野外直播 | 精品久久久久久久久久久久 | www.五月天婷婷.com | 免费看成人片 | 日韩精品一区二区在线观看 | 日韩美一区二区三区 | 日本狠狠色| 91九色视频网站 | 亚洲黄色在线免费观看 | 欧美日韩三级在线观看 | 午夜色大片在线观看 | av电影免费在线 | 五月天激情视频在线观看 | 99久久久久久 | 色播五月激情五月 | 久热国产视频 | 99精品视频网站 | 欧美性做爰猛烈叫床潮 | 精品国产乱码久久久久久1区2匹 | 日韩视频免费观看高清完整版在线 | 色天天中文 | 日韩高清黄色 | 五月婷婷在线播放 | 久久特级毛片 | 国产午夜在线观看 | 久久九精品 | 亚洲在线免费视频 | 激情伊人五月天 | 国产一线二线三线在线观看 | 一区二区三区动漫 | 日韩a级黄色片 | 亚洲视频在线视频 | 久久区二区 | 日韩一级片观看 | 伊人婷婷网 | 中文字幕网站视频在线 | 成人av资源网站 | 久久天天躁狠狠躁亚洲综合公司 | 国产成本人视频在线观看 | 91丨九色丨丝袜 | 日韩视频在线一区 | 国产一区免费看 | 欧美精品久久久久久久久免 | 国产黄色免费在线观看 | 国产成人免费在线 | 五月综合久久 | 国产拍揄自揄精品视频麻豆 | 国内精品免费久久影院 | 国产成人久久av | 国产福利av| 99精品国产在热久久下载 | 国产亚洲精品久久久久久久久久 | 婷婷网五月天 | 免费福利片 | 激情久久婷婷 | 日韩在线观看第一页 | 久久久亚洲电影 | 精品二区视频 | 久久伊人八月婷婷综合激情 | 国内精自线一二区永久 | 亚洲欧美国产精品久久久久 | 中文字幕二区在线观看 | 91精品久久久久久 | 国产亚洲欧美在线视频 | 韩国av一区二区三区在线观看 | 欧美精品久久久久久久亚洲调教 | 免费韩国av | 欧美巨乳波霸 | 精品国产乱码久久久久久久 | 日韩欧美高清一区二区三区 | 97视频一区 | 91精品办公室少妇高潮对白 | 国产精成人品免费观看 | 在线观看国产日韩 | a午夜电影 | 久久精品国产免费 | 精品视频在线观看 | 国产99久久久国产精品免费看 | 亚洲精品高清视频 | 欧美在线视频一区二区三区 | 精品国产视频在线观看 | 久在线观看 | 九九在线播放 | 97精品国产97久久久久久久久久久久 | 久久精品电影院 | 在线观看mv的中文字幕网站 | 亚洲视频综合在线 | 91福利社在线观看 | 日本最新一区二区三区 | www.av免费| 婷婷色中文 | 激情婷婷色 | av网站在线观看播放 | a爱爱视频 | 九九久久影视 | 国产一区自拍视频 | 免费在线成人av电影 | 国产网红在线观看 | 久久99久久99精品免视看婷婷 | 国产一区视频在线 | 精品国产一区二区三区久久久久久 | 91在线中字 | 蜜臀久久99精品久久久久久网站 | 一区二区三区www | 亚洲三级黄色 | 夜夜看av | 在线天堂中文www视软件 | 国产精品一区二区av | 久久视频在线看 | 色狠狠综合 | 丁香六月av| 色综合久久久久久中文网 | 黄色三几片 | 久久无码av一区二区三区电影网 | 午夜视频在线观看一区二区三区 | 中文字幕av免费在线观看 | 69av在线播放 | 九九免费视频 | 人人插人人费 | 黄色网在线播放 | 91香蕉国产在线观看软件 | 精品人人爽 | 久草国产精品 | 欧美另类美少妇69xxxx | 国产一级免费播放 | 久久手机视频 | 亚洲最大免费成人网 | 国产在线精品福利 | 香蕉影院在线观看 | 中文字幕电影在线 | 日韩.com| 国产我不卡 | 日韩色一区二区三区 | 日韩中文字幕在线观看 | 手机av在线免费观看 | 黄色成人影视 | 麻豆久久久 | 国产91精品在线观看 | 国产精品免费一区二区 | 手机成人免费视频 | 国产人成免费视频 | 久久99精品国产99久久6尤 | 日日婷婷夜日日天干 | 久草精品资源 | 99精品免费久久久久久日本 | 粉嫩av一区二区三区四区五区 | 国色天香永久免费 | av中文在线影视 | 九九九热精品免费视频观看网站 | 青青河边草观看完整版高清 | 99国产精品久久久久久久久久 | 中文字幕在线播放第一页 | 一区二区三区四区在线免费观看 | 日韩免费 | 国产五月天婷婷 | 国产一区欧美二区 | 人人澡人 | 久久精品视频免费播放 | 欧美日韩国产一二三区 | 久久精品国产免费观看 | 91麻豆操 | 中文字幕成人一区 | 天天爽天天爽夜夜爽 | 久久婷婷国产色一区二区三区 | 国产色就色 | 中文字幕成人一区 | 天天操天天色天天 | 去干成人网 | 国产精品第 | 久久成人国产精品免费软件 | 欧美在一区 | 美女黄频| 国产99久久99热这里精品5 | 午夜视频在线瓜伦 | 久久精品一区二区三区中文字幕 | 91在线视频在线观看 | 国产又黄又爽又猛视频日本 | 国产三级精品三级在线观看 | 韩国av免费在线观看 | 在线免费黄色av | 国产视频亚洲精品 | 在线视频手机国产 | 成人h在线| 日日夜夜操av | 中文久久精品 | 不卡精品视频 | 久久精品3| 成 人 免费 黄 色 视频 | 亚洲国产精品一区二区久久,亚洲午夜 | 欧美日bb| 亚洲精品国偷拍自产在线观看蜜桃 | 国产999免费视频 | 麻花豆传媒一二三产区 | av在线com| 亚洲综合色激情五月 | 国产亚洲精品久久久久久移动网络 | 天天爱综合| 亚洲精品在线观看免费 | 国产一区二区三精品久久久无广告 | 成人一区电影 | 日韩免费久久 | 婷婷www| 激情视频一区二区三区 | 在线观看视频免费大全 | 欧美日韩在线免费观看视频 | 九色91视频 | 久久免费大片 | 国产资源免费在线观看 | 成人久久久精品国产乱码一区二区 | 人人插人人爱 | 久久久久国产成人精品亚洲午夜 | 久久久香蕉视频 | 国产精品久久片 | 97视频免费在线 | 日韩视频一区二区在线 | 免费看片色 | 国产在线视频一区二区三区 | 久久久久女人精品毛片 | 免费亚洲视频在线观看 | 日韩在线免费电影 | 四虎影视4hu4虎成人 | 97精品国产97久久久久久春色 | 欧美男同视频网站 | 午夜电影一区 | 中文字幕在线观看免费 | 国产一区二区电影在线观看 | 视频 国产区 | 六月丁香色婷婷 | 国产一区二区在线播放 | 69亚洲乱 | 黄色软件在线看 | 国产精品久久久亚洲 | 在线婷婷 | 最新久久免费视频 | 插婷婷| 欧美日韩一区二区三区不卡 | 久久久久久久久黄色 | 韩国在线一区二区 | 69精品视频在线观看 | 国产视频资源 | 久久久久综合精品福利啪啪 | 日日夜夜精品免费视频 | 国产91粉嫩白浆在线观看 | 五月花丁香婷婷 | 亚洲专区 国产精品 | 欧美性视频网站 | 中国一级片在线播放 | 久久黄色网址 | 久精品视频免费观看2 | 亚洲最大成人免费网站 | 天堂av网在线 | 亚洲激情久久 | 亚洲精品456在线播放第一页 | 色www精品视频在线观看 | 成人v| 欧美性视频网站 | 久草精品视频在线播放 | 国产黄色高清 | 中文永久字幕 | 国产手机av | 国产一区二区播放 | av成人免费| 欧美日韩在线播放一区 | 啪嗒啪嗒免费观看完整版 | 麻豆一区二区 | 免费国产在线精品 | 国产精品免费在线视频 | 久久天| 欧美性极品xxxx娇小 | 亚洲综合色丁香婷婷六月图片 | 四虎在线观看 | 亚洲精品2区 | 在线看一级片 | 黄色1级毛片| 免费观看一级一片 | 日韩特级毛片 | 丝袜av一区| 中文字幕永久 | 国产精品一区二区在线 | 欧美精品一区二区蜜臀亚洲 | 91精品啪在线观看国产81旧版 | 探花视频在线版播放免费观看 | 中文字幕永久 | 午夜精品一区二区三区免费 | 欧美精品久久久久久久久老牛影院 | 97免费在线观看视频 | 久草网站在线 | 人人干人人添 | 最近中文字幕完整视频高清1 | 国产91免费在线观看 | 久久免费视频一区 | 人人澡人摸人人添学生av | 免费欧美| 夜夜摸夜夜爽 | 男女精品久久 | 91香蕉视频 | 四虎免费在线观看视频 | 久久精品影视 | 狠狠色丁香婷婷综合久久片 | 波多野结衣电影久久 | 在线播放亚洲 | 中文字幕888 | www.99久久.com | 国产日韩欧美在线观看视频 | 亚洲国产日韩精品 | 激情丁香综合五月 | 色姑娘综合 | 在线视频久| 99热这里只有精品1 av中文字幕日韩 | 99热超碰在线 | 亚洲精品视频免费在线观看 | 免费观看一级成人毛片 | 久久精品99国产精品酒店日本 | 久久尤物电影视频在线观看 | 97超级碰碰碰视频在线观看 | 天天插天天干天天操 | 国产黄色在线网站 | 久久资源在线 | 国产精品精品国产 | 91精品久久久久久综合乱菊 | 亚洲三级视频 | 成人中文字幕+乱码+中文字幕 | 97电影网手机版 | 国产成人一区二区在线观看 | 免费av片在线 | 一级黄色片在线播放 | 中文字幕高清视频 | 国产精品丝袜久久久久久久不卡 | 国产精品精品国产色婷婷 | 国产精品久久久久免费观看 | 国产精品资源 | 狠狠狠色狠狠色综合 | 99国产一区二区三精品乱码 | 91精品资源 | 久久99电影 | 在线观看网站你懂的 | 国产美女永久免费 | 久久久久免费精品国产 | 久久www免费视频 | 亚洲 欧美日韩 国产 中文 | 久草在线资源观看 | 2019中文在线观看 | 黄色成人在线观看 | 免费在线观看黄网站 | 久久草在线视频国产 | 9ⅰ精品久久久久久久久中文字幕 | 精品美女久久久久 | 99爱视频| 久草在线看片 | 国产美女精品人人做人人爽 | 国产中文字幕在线免费观看 | 亚洲永久精品在线观看 | 精品99在线 | 欧美一级日韩免费不卡 | 激情视频一区 | 一区二区三区四区五区在线 | 国产精品不卡在线播放 | 成人丁香花| www.超碰97.com| 国产精品第一页在线观看 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 丁香六月国产 | 蜜臀久久99精品久久久酒店新书 | 国产经典三级 | 日韩欧美在线视频一区二区三区 | 成人久久久久 | 成人丝袜| 国产精品国产三级国产aⅴ9色 | 中文字幕第一 | 日韩欧在线 | 国产在线观看免费av | av免费在线播放 | 成人免费视频网 | 久久久免费高清视频 | 特级毛片爽www免费版 | 黄色毛片一级 | 久草久热 | 国内外成人在线视频 | 99久久久久久久久久 | 国产精品理论片在线观看 | 国产老太婆免费交性大片 | 亚洲精品美女视频 | 天天操天天舔天天干 | 午夜视频在线观看网站 | 中文字幕久久网 | 亚洲第五色综合网 | 久久久久免费网站 | 免费精品国产va自在自线 | 91九色在线观看 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 国产亚洲精品中文字幕 | 91九色蝌蚪视频 | 中文字幕乱码亚洲精品一区 | 91亚色视频 | 亚洲最新在线视频 | 男女啪啪视屏 | 韩日三级在线 | av高清免费在线 | 国产日韩在线观看一区 | 日日日干 | 91超级碰碰 | 国产色在线,com | 97国产电影| 精品免费视频. | 国产精品毛片一区视频播不卡 | 久草视频在 | 一区二区三区中文字幕在线 | 99国产在线观看 | 激情视频在线观看网址 | 91热这里只有精品 | 六月色 | 91高清视频 | 欧美aa一级片 | 在线观看国产亚洲 | 亚洲一级电影视频 | 在线观看黄色免费视频 | 午夜精品导航 | 欧美巨乳波霸 | 婷婷夜夜 | 97国产超碰在线 | 久久小视频 | 久久久久97国产 | 综合久久精品 | 高清av网 | 亚洲成人精品在线 | 人人超在线公开视频 | 免费视频网| 免费欧美 | 在线免费观看黄色大片 | 天天操天天干天天 | 亚洲精品网址在线观看 | 亚洲精品久久久久999中文字幕 | 国产午夜精品一区二区三区嫩草 | 91视频在线观看免费 | 日本福利视频在线 | 久久精品亚洲 | 国产亚洲精品日韩在线tv黄 | 中文字幕 国产专区 | 色资源网免费观看视频 | 一区二区三高清 | 92中文资源在线 | 九九热精品视频在线播放 | 美州a亚洲一视本频v色道 | 中文av一区二区 | 中文字幕中文字幕在线中文字幕三区 | 中文字幕免费高清 | av大片免费在线观看 | 中文字幕在线免费观看 | www激情网| 黄p网站在线观看 | 网站在线观看日韩 | 国产成人综合精品 | 亚洲精品综合在线观看 | 激情文学综合丁香 | 亚洲一区视频在线播放 | 少妇bbw搡bbbb搡bbbb | 一区二区三区精品久久久 | 国产高清日韩欧美 | 亚洲综合狠狠干 | 激情视频在线高清看 | 999久久久免费精品国产 | 九草视频在线观看 | 一二三久久久 | 狠狠ri | 一级欧美日韩 | 亚洲日本在线一区 | 国产精品九九九 | 麻豆视频91 | 久久综合狠狠综合久久激情 | 韩日电影在线 | 久久久国产精品一区二区三区 | 国产综合91| 精品免费在线视频 | 97在线观视频免费观看 | 99热最新地址 | 成年人在线视频观看 | 91视频com | 久久免费毛片视频 | 91精品国自产在线观看 | 欧美国产一区在线 | 日韩av有码在线 | 国产精品视频观看 | 天天操天天弄 | 久久综合影视 | 在线影院 国内精品 | 97成人精品视频在线观看 | 欧美一区二区在线看 | 狠狠操狠狠操 | 在线观看亚洲视频 | wwwwww色| 精品一二三区视频 | 国产69久久久欧美一级 | 国产精品免费久久久久 | 91精品国产自产在线观看 | aⅴ视频在线| 视频二区在线视频 | 成人免费xyz网站 | 国产一区 在线播放 | 黄色a一级片 | 久久xx视频| 亚洲成aⅴ人在线观看 | 国产视频一级 | 在线a人片免费观看视频 | 久久综合影院 | 国产专区视频在线观看 | 在线观看日韩 | 国产精品视频区 | 国色天香在线观看 | 国产日韩中文字幕 | 久久久国产高清 | 丁香综合 | 99在线热播精品免费 | 色婷婷综合久久久 | 国产亚洲婷婷免费 | 亚洲黄网址 | av网址最新| 黄色影院在线免费观看 | 日韩欧美一区二区三区视频 | a级国产乱理论片在线观看 特级毛片在线观看 | 99精品国产一区二区三区麻豆 | 波多野结衣在线视频一区 | 欧美专区亚洲专区 | 亚洲精品国产精品国自产观看 | 97国产人人| 蜜臀av网址 | 在线岛国av | 午夜 免费 | 在线免费看黄色 | 首页中文字幕 | 亚洲精品美女在线观看播放 | 日韩视频在线不卡 | 日韩欧美视频在线观看免费 | 国产精品嫩草影院99网站 | 日本中文乱码卡一卡二新区 | 蜜桃麻豆www久久囤产精品 | 日韩试看 | 日韩欧美视频免费观看 | 色综合久久久久久中文网 | 91免费的视频在线播放 | 色资源中文字幕 | 中文字幕视频在线播放 | 97视频免费| 色综合久久中文字幕综合网 | 日韩av不卡在线 | 久久精品播放 | 国产成人免费在线观看 | 精品国产视频一区 | 久草视频免费在线播放 | 国产日韩精品一区二区三区 | 亚洲日本成人网 | 精品国产乱子伦一区二区 | 久久免费视频一区 | 97精品免费视频 | 日韩av免费大片 | 免费网站看av片 | 中文字幕av一区二区三区四区 | 999久久久欧美日韩黑人 | 久久久精品久久日韩一区综合 | 日韩久久一区 | 成人黄色在线播放 | 欧美激情视频在线免费观看 | 国精产品999国精产 久久久久 | 天天拍天天草 | 久久久在线 | 色视频成人在线观看免 | 国产亚洲在线观看 | 超碰人人草人人 | 日韩在线小视频 | 超碰在线日韩 | 精品国产亚洲在线 | 亚洲国产av精品毛片鲁大师 | 97人人视频 | 精品国产伦一区二区三区观看方式 | 69视频网站 | 久久久亚洲电影 | 亚洲国产激情 | 在线观看视频亚洲 | 最新一区二区三区 | 色婷婷免费 | 99国产视频 | 草久久久久 | 欧美激情综合五月色丁香小说 | 91视频-88av | 免费一级日韩欧美性大片 | 永久av免费在线观看 | 在线 成人 | 日韩免费在线观看 | 成年人视频在线免费观看 | 国产一区二区精品久久91 | 激情综合五月天 | 国产精品久久久久久久久久免费看 | 91精品福利在线 | 丁香综合激情 | 亚洲成av片人久久久 | 国产视频久久久久 | 狠狠伊人 | 91精品欧美 | 亚洲婷久久 | 国产日产高清dvd碟片 | 日日色综合 | 亚洲成人高清在线 | 六月婷婷久香在线视频 | www.香蕉视频 | 免费观看国产精品视频 | 高清不卡一区二区在线 | 夜夜骑日日 | 久久久久久免费毛片精品 | av免费电影在线 | 久久免费电影网 | 99久久夜色精品国产亚洲 | 日本精品久久久久久 | 免费人成网ww44kk44 | www黄com| 国产无区一区二区三麻豆 | 日韩特级黄色片 | 毛片永久免费 | 国产精品去看片 | 国产视频资源 | 91视频久久久 |