精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

剖析Buddy算法中內(nèi)存的申請(qǐng)和釋放

原創(chuàng) 精選
存儲(chǔ) 存儲(chǔ)軟件
內(nèi)存的合理利用一直是系統(tǒng)的頭等大事。目前系統(tǒng)中,除了采用Buddy和slab管理內(nèi)存外,還會(huì)采用內(nèi)存水線檢測(cè)處理,PCP機(jī)制,CMA機(jī)制等進(jìn)行內(nèi)存的優(yōu)化。在本文中,我們將從Buddy算法中內(nèi)存的申請(qǐng)和釋放,來探索內(nèi)存的奧秘。

作者 | 趙青窕

審校 | 孫淑娟

內(nèi)存的合理利用一直是系統(tǒng)的頭等大事。目前系統(tǒng)中,除了采用Buddy和slab管理內(nèi)存外,還會(huì)采用內(nèi)存水線檢測(cè)處理,PCP機(jī)制,CMA機(jī)制等進(jìn)行內(nèi)存的優(yōu)化。在本文中,我們將從Buddy算法中內(nèi)存的申請(qǐng)和釋放,來探索內(nèi)存的奧秘。

基本概念

zone:有的地方把zone稱為管理區(qū),每個(gè)node下會(huì)劃分成不同的zone。有的系統(tǒng)會(huì)劃分成3個(gè)zone區(qū),有的會(huì)劃分成2個(gè)zone區(qū)。zone區(qū)的個(gè)數(shù)會(huì)因平臺(tái),內(nèi)核,系統(tǒng)的位數(shù)等有差異。

free_area:每個(gè)zone區(qū)根據(jù)2的order次方(order的范圍從0到MAX_ORDER)進(jìn)一步劃分,劃分后的每個(gè)小區(qū)域通過free_area[order]表示。

如下圖紅色方框中所示,按照紅色方框從左到右分別是node,zone和free_area。

水線:每個(gè)zone存在三個(gè)水線,若當(dāng)前zone中空閑頁(yè)高于WMARK_HIGH,則當(dāng)前zone區(qū)的空閑內(nèi)存較多;若空閑頁(yè)低于WMARK_LOW,則交換守護(hù)進(jìn)程開始將內(nèi)存交換到磁盤上;若空閑頁(yè)低于WMARK_MIN,則內(nèi)存回收系統(tǒng)還需要大量回收內(nèi)存。

order:每個(gè)zone區(qū)根據(jù)order,把內(nèi)存按照2的order繼續(xù)劃分為不同的area。

PCP鏈表:該鏈表中的每一個(gè)成員大小均是2的0次方個(gè)頁(yè)面,每次申請(qǐng)和釋放1個(gè)頁(yè)面,都會(huì)優(yōu)先考慮PCP。當(dāng)PCP為空時(shí),會(huì)從Buddy中申請(qǐng);當(dāng)PCP中頁(yè)面比較多,超過限制時(shí),會(huì)把頁(yè)面釋放到Buddy中。 

內(nèi)存申請(qǐng)

比較常用的內(nèi)存申請(qǐng)函數(shù)是kmalloc,當(dāng)申請(qǐng)的內(nèi)存大于KMALLOC_MAX_CACHE_SIZE時(shí),會(huì)通過函數(shù)kmalloc_large從Buddy中申請(qǐng)內(nèi)存,否則從slab中申請(qǐng)內(nèi)存。本文中暫不分析從slab申請(qǐng)內(nèi)存的情況。

kmalloc_large函數(shù)實(shí)現(xiàn)如下,Buddy算法中,內(nèi)存的分配和釋放均離不開order,我們可以看到,在該函數(shù)內(nèi)部通過size來計(jì)算出對(duì)應(yīng)的order,就很好地把Buddy和slab連接在一起了。

static __always_inline void *kmalloc_large(size_t size, gfp_t flags)
{
unsigned int order = get_order(size);
return kmalloc_order_trace(size, flags, order);
}

函數(shù)kmalloc_order_trace會(huì)調(diào)用函數(shù)alloc_pages,進(jìn)而調(diào)用函數(shù)struct page *__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int preferred_nid, nodemask_t *nodemask)來實(shí)現(xiàn)內(nèi)存的分配。實(shí)際上,Buddy提供的對(duì)外申請(qǐng)內(nèi)存函數(shù)是alloc_pages,但其內(nèi)部實(shí)現(xiàn)大部分情況下均是通過__alloc_pages_nodemask來實(shí)現(xiàn)。該函數(shù)分三步進(jìn)行處理,分別如下:

  • 構(gòu)建內(nèi)存分配的上下文結(jié)構(gòu),內(nèi)核中采用結(jié)構(gòu)體struct alloc_context來表示
  • 快速分配
  • 慢速分配

1.內(nèi)存分配上下文結(jié)構(gòu)

內(nèi)存分析上下文采用結(jié)構(gòu)體struct alloc_context來表示,其結(jié)構(gòu)體定義如下:

/*
* Structure for holding the mostly immutable allocation parameters passed
* between functions involved in allocations, including the alloc_pages*
* family of functions.
*
* nodemask, migratetype and high_zoneidx are initialized only once in
* __alloc_pages_nodemask() and then never change.
*
* zonelist, preferred_zone and classzone_idx are set first in
* __alloc_pages_nodemask() for the fast path, and might be later changed
* in __alloc_pages_slowpath(). All other functions pass the whole strucure
* by a const pointer.
*/
struct alloc_context {
struct zonelist *zonelist;
nodemask_t *nodemask;
struct zoneref *preferred_zoneref;
int migratetype;
enum zone_type high_zoneidx;
bool spread_dirty_pages;
};

各個(gè)成員含義如下:

  • zonelist:用于分配內(nèi)存的zone區(qū)列鏈表。在內(nèi)存分配時(shí),內(nèi)核會(huì)通過函數(shù)numa_node_id()來獲取當(dāng)前CPU的NUMA ID,進(jìn)而根據(jù)這個(gè)ID號(hào)獲取對(duì)應(yīng)的zonelist。內(nèi)存的分配實(shí)際上就是在zonelist找合適的內(nèi)存進(jìn)行分配,該成員在后面兩步中具有關(guān)鍵作用;
  • nodemask:用來指定從哪一個(gè)node中進(jìn)行內(nèi)存分配。若沒有指定,則會(huì)在所有節(jié)點(diǎn)中嘗試分配,通常情況下該值為NULL;
  • high_zoneidx:該成員從字面意思看就是最高的zone區(qū)id號(hào),其實(shí)它表示的是在分配時(shí),所能分配的最高zone區(qū)。通常一般是從HIGH區(qū)---->NORMAL---->DMA的方式進(jìn)行分配。內(nèi)存的需求方在請(qǐng)求進(jìn)行內(nèi)存分配時(shí),會(huì)通過gfp_mask來對(duì)該成員進(jìn)行設(shè)置,Buddy在內(nèi)存分配及逆行內(nèi)存分配時(shí)需要通過函數(shù)gfp_zone(gfp_mask)來提取gfp_mask中對(duì)應(yīng)的high_zoneidx;
  • migratetype:該成員指明了需要內(nèi)存的頁(yè)面遷移類型。Buddy進(jìn)行內(nèi)存分配時(shí)需要通過函數(shù)gfpflags_to_migratetype(gfp_mask)來獲取內(nèi)存請(qǐng)求方的具體需求;
  • preferred_zone:結(jié)合成員high_zoneidx和zonelist,計(jì)算出首先從那個(gè)zone區(qū)開始進(jìn)行內(nèi)存的分配,即第一個(gè)將要被遍歷的zone,內(nèi)核中是通過函數(shù)first_zones_zonelist來計(jì)算該成員的;
  • spread_dirty_pages:當(dāng)申請(qǐng)內(nèi)存時(shí),采用了標(biāo)志__GFP_WRITE,則說明此次申請(qǐng)的物理頁(yè)面將會(huì)生成臟頁(yè),內(nèi)核中就是通過語(yǔ)句ac->spread_dirty_pages = (gfp_mask & __GFP_WRITE)來設(shè)置該成員的。

從上面的結(jié)構(gòu)體struct alloc_context的說明可以看出,該結(jié)構(gòu)體具體細(xì)化了內(nèi)存分配的各種需求,其具體實(shí)現(xiàn)如下圖中紅色方框所示:

2.快速分配

在完成第一步后,就可以通過函數(shù)get_page_from_freelist進(jìn)行一次快速分配。該函數(shù)才是內(nèi)存分配真正的開始位置,接下來我將詳細(xì)說明該過程,為了簡(jiǎn)化描述,同時(shí)為了讓大家容易理解,暫時(shí)不考慮CPUSET的情況。

該函數(shù)本質(zhì)就是從preferred_zone開始,遍歷zonelist,其每一次遍歷時(shí),處理流程如下:

  • 臟頁(yè)面判斷

每個(gè)node節(jié)點(diǎn)會(huì)對(duì)臟頁(yè)數(shù)進(jìn)行限制,當(dāng)超過限制后,將無法申請(qǐng)具有__GFP_WRITE標(biāo)志的內(nèi)存塊,需要跳出當(dāng)前zone區(qū),轉(zhuǎn)而掃描下一個(gè)zone區(qū),其內(nèi)核處理代碼如下圖所示,圖中進(jìn)行了標(biāo)注,方便大家理解。

  • 水位處理

前面小節(jié)中有提到每個(gè)zone中存在三個(gè)水線,在內(nèi)存申請(qǐng)時(shí),默認(rèn)采用WMARK_LOW,使用函數(shù)zone_watermark_fast進(jìn)行水線判斷。

假如通過水線檢測(cè),發(fā)現(xiàn)內(nèi)存不夠,則會(huì)判斷當(dāng)前申請(qǐng)內(nèi)存的請(qǐng)求是否采用ALLOC_NO_WATERMARKS,若采用,則說明當(dāng)前剩余內(nèi)存多少與當(dāng)前申請(qǐng)沒有任何關(guān)系,會(huì)調(diào)用rmqueue進(jìn)行內(nèi)存分配;若沒有ALLOC_NO_WATERMARKS聲明,則進(jìn)行下一步reclaim操作;

假如通過水線檢測(cè),發(fā)現(xiàn)當(dāng)前還有足夠內(nèi)存,則調(diào)用函數(shù)rmqueue進(jìn)行內(nèi)存分配。

  • reclaim操作

reclaim操作首先是通過函數(shù)zone_allows_reclaim來判斷當(dāng)前的node是否支撐reclaim操作,如果不支持,就退出當(dāng)前循環(huán),執(zhí)行下一個(gè)循環(huán)操作;若支持,就調(diào)用node_reclaim執(zhí)行內(nèi)存回收的工作。

當(dāng)函數(shù)node_reclaim返回值是NODE_RECLAIM_NOSCAN或者NODE_RECLAIM_FULL時(shí),表示當(dāng)前雖然內(nèi)存不夠,但我無能為力了。這種情況下,只能退出循環(huán),執(zhí)行下一個(gè)操作;當(dāng)返回值是其余的情況時(shí),就會(huì)重新進(jìn)行水位檢測(cè),若此時(shí)內(nèi)存足夠,則調(diào)用rmqueue進(jìn)行內(nèi)存分配,否則退出循環(huán),執(zhí)行下一個(gè)循環(huán)操作。

假如當(dāng)前系統(tǒng)使用的是非NUMA,則不會(huì)進(jìn)行reclaim操作,當(dāng)水位線檢測(cè)發(fā)現(xiàn)內(nèi)存不夠時(shí),會(huì)跳出循環(huán),嘗試下一個(gè)zone;假如當(dāng)前系統(tǒng)是NUMA,才會(huì)進(jìn)行上述描述中的判斷,來決定是否進(jìn)行內(nèi)存回收。

  • rmqueue內(nèi)存分配處理

在內(nèi)存分配時(shí),分兩種情況進(jìn)行處理,分別是order = 0及order != 0。

當(dāng)order = 0時(shí),會(huì)首先從PCP鏈表中進(jìn)行內(nèi)存申請(qǐng),其具體流程如下:

當(dāng)order != 0,即要申請(qǐng)多頁(yè),下面是其處理過程,根據(jù)實(shí)際情況調(diào)用__rmqueue_smallest,__rmqueue_cma或者_(dá)_rmqueue進(jìn)行內(nèi)存的分配。

對(duì)于設(shè)置了ALLOC_HARDER的情況,先嘗試通過函數(shù)__rmqueue_smallest來分配MIGRATE_HIGHATOMIC類型的內(nèi)存塊,具體實(shí)現(xiàn)就是從zone->free_area[order]中根據(jù)需要的內(nèi)存類型進(jìn)行分配。該函數(shù)實(shí)現(xiàn)比較簡(jiǎn)單,就是遍歷free_area以便找到合適的內(nèi)存塊,下圖是__rmqueue_smallest的實(shí)現(xiàn),增加了注釋方便大家理解。

假如通過上面的__rmqueue_smallest沒有找到合適的內(nèi)存塊,在申請(qǐng)內(nèi)存時(shí),使用標(biāo)志__GFP_CMA申請(qǐng)的MIGRATE_MOVABLE,則再次使用函數(shù)__rmqueue_cma申請(qǐng)內(nèi)存,實(shí)際上__rmqueue_cma內(nèi)部是調(diào)用__rmqueue_smallest(zone, order, MIGRATE_CMA)實(shí)現(xiàn)的。

若上面的兩步__rmqueue_smallest,__rmqueue_cma均失敗,則會(huì)調(diào)用__rmqueue。該函數(shù)內(nèi)部實(shí)際上也是通過__rmqueue_smallest實(shí)現(xiàn)的,當(dāng)__rmqueue_smallest只會(huì)從指定的migtatetype中進(jìn)行分配,當(dāng)分配失敗后,會(huì)通過函數(shù)__rmqueue_fallback從后備fallbacks中找到一個(gè)遷移類型頁(yè)塊,將其遷移到目標(biāo)遷移類型中后重新進(jìn)行分配。

至此快速分配結(jié)束,若已經(jīng)分配到內(nèi)存,則會(huì)退出分配流程,否則進(jìn)行下一步操作:慢速分配。

3.慢速分配

慢速分配是通過函數(shù)__alloc_pages_slowpath來實(shí)現(xiàn)的。從快速分配發(fā)現(xiàn)無法分配到需要的內(nèi)存,緊接著內(nèi)核通過慢速分配對(duì)內(nèi)存進(jìn)行整理,嘗試找到合適的內(nèi)存。其整理過程包含:

  • 重新計(jì)算內(nèi)存分配上下文;
  • 如果設(shè)置了__GFP_KSWAPD_RECLAIM,則會(huì)調(diào)用函數(shù)wake_all_kswapds來喚醒負(fù)責(zé)換出內(nèi)存頁(yè)的守護(hù)進(jìn)程kswapds;
  • 因更新了內(nèi)存分配上下文,因此再次使用快速分配嘗試內(nèi)存分配。若分配成功,則退出本次分配;否則繼續(xù)進(jìn)行下一步操作;
  • 若申請(qǐng)內(nèi)存時(shí),設(shè)置了__GFP_DIRECT_RECLAIM,且非pfmemalloc情況下,會(huì)通過函數(shù)__alloc_pages_direct_compact進(jìn)行內(nèi)存壓縮后,再次嘗試分配頁(yè)面。若分配成功則退出;否則進(jìn)入下一步;
  • 接下來的操作代碼中采用了retry代碼標(biāo)簽,這個(gè)過程比較繁瑣,其本質(zhì)就是采用各種內(nèi)存優(yōu)化手段盡量促使本次分配成功,優(yōu)化手段主要有以下四種:
  • 通過函數(shù)__alloc_pages_direct_reclaim嘗試進(jìn)行內(nèi)存回收后,再分配內(nèi)存;
  • 通過函數(shù)__alloc_pages_direct_compact嘗試進(jìn)行內(nèi)存整合后,再分配內(nèi)存;
  • 通過函數(shù)__alloc_pages_may_oom嘗試殺掉一些優(yōu)先級(jí)不高的進(jìn)程后,再分配內(nèi)存;
  • 在retry過程中,仍會(huì)調(diào)用wake_all_kswapds來喚醒kswapds,防止意外休眠。

這四種方式都會(huì)伴隨著調(diào)用函數(shù)get_page_from_freelist來進(jìn)行內(nèi)存分配。

至此內(nèi)存分配函數(shù)就完成了。從上面的描述可以看出,當(dāng)內(nèi)存足夠時(shí),通常情況下快速分配就足夠了。只有在內(nèi)存不夠時(shí),會(huì)進(jìn)行慢速分配,慢速分配里面進(jìn)行內(nèi)存回收,整理等操作后再進(jìn)行分配。若此時(shí)還沒有足夠的內(nèi)存可以分配,說明內(nèi)存耗盡,可能是因?yàn)閮?nèi)存泄漏導(dǎo)致內(nèi)存不足,這個(gè)時(shí)候就需要去定位內(nèi)存泄漏問題了。

內(nèi)存釋放

Buddy中內(nèi)存釋放入口函數(shù)是free_pages。該函數(shù)的實(shí)現(xiàn)如下,從下面的函數(shù)中可以看出最后是通過free_unref_page或者_(dá)_free_pages_ok來實(shí)現(xiàn)的,其余的部分均合法性判斷。

void free_pages(unsigned long addr, unsigned int order)
{
if (addr != 0) {
VM_BUG_ON(!virt_addr_valid((void *)addr));
__free_pages(virt_to_page((void *)addr), order);
}
}

void __free_pages(struct page *page, unsigned int order)
{
if (put_page_testzero(page))
free_the_page(page, order);
}

static inline void free_the_page(struct page *page, unsigned int order)
{
if (order == 0) /* Via pcp? */
free_unref_page(page);
else
__free_pages_ok(page, order);
}

函數(shù)free_pages 接受兩個(gè)參數(shù),分別是虛擬地址和需要釋放的頁(yè)面數(shù),該函數(shù)內(nèi)部利用virt_to_page把虛擬地址轉(zhuǎn)化成Buddy算法需要的struct page結(jié)構(gòu)體。

__free_pages函數(shù)先將對(duì)應(yīng)的struct page->_refcount 減去1,之后檢測(cè)_refcount是否為0,若為0,繼續(xù)進(jìn)行釋放操作,否則不進(jìn)行內(nèi)存釋放操作。通過該函數(shù)__free_pages可以看到,不管是否進(jìn)行了內(nèi)存釋放操作,該函數(shù)都可以正常退出且沒有返回值。假如內(nèi)存釋放操作異常,就會(huì)引發(fā)內(nèi)存泄漏問題,且代碼中沒有任何日志和錯(cuò)誤碼,這種泄漏通常很難排查。

free_the_page是真正的內(nèi)存釋放函數(shù),該函數(shù)根據(jù)order的不同,分別進(jìn)行兩種不同的處理:

  • order為0的情況
  • order不為0的情況

接下來我們分別來了解這兩種情況的處理方式。

1.order為0的情況

函數(shù)內(nèi)存會(huì)根據(jù)order是否為0來進(jìn)行相應(yīng)的操作,對(duì)于order = 0的情況,此處是調(diào)用函數(shù)free_unref_page。有些內(nèi)核中會(huì)調(diào)用函數(shù)free_hot_cold_page(page, false)來實(shí)現(xiàn),但不管調(diào)用哪一個(gè)函數(shù),其內(nèi)部均是進(jìn)行相應(yīng)的判斷后,通過把page插入PCP鏈表相應(yīng)位置處實(shí)現(xiàn)。實(shí)際上內(nèi)核在把內(nèi)存釋放到PCP鏈表時(shí),會(huì)進(jìn)行PCP鏈表成員個(gè)數(shù)pcp->count的判斷,當(dāng)pcp->count >= pcp->high時(shí),會(huì)調(diào)用函數(shù)free_pcppages_bulk釋放一部分PCP中的頁(yè)面到 Buddy 子系統(tǒng)中。

此處我們需要注意,并不是所有order = 0的內(nèi)存全部釋放到PCP鏈表中,在結(jié)構(gòu)體struct page中有個(gè)成員index,該成員指明了該部分內(nèi)存的類型,若類型為MIGRATE_ISOLATE,則其內(nèi)存(實(shí)際上是一個(gè)頁(yè)面)會(huì)釋放到Buddy中,若類型對(duì)應(yīng)的數(shù)據(jù)大于或等于MIGRATE_PCPTYPES,則釋放到類型為MIGRATE_MOVABLE的PCP鏈表中,其余的釋放到對(duì)應(yīng)類型的PCP鏈表中。下圖是order = 0時(shí)的核心處理代碼,圖中已經(jīng)標(biāo)注了各個(gè)關(guān)鍵地方,供大家參考。

2.order不為0的情況

當(dāng)order不為0時(shí),會(huì)通過函數(shù)__free_pages_ok調(diào)用free_one_page來實(shí)現(xiàn)。其核心代碼如下圖所示,圖中對(duì)代碼進(jìn)行了標(biāo)注,從其代碼我們可以發(fā)現(xiàn)其實(shí)現(xiàn)是通過while循環(huán)來查找可以合并的頁(yè)塊,查找的方式就是按照order的次序挨個(gè)查找,其整個(gè)流程就是查找--->確認(rèn)--->刪除--->合并。

此時(shí),我們來思考一個(gè)問題,有些特殊內(nèi)存區(qū)是無法進(jìn)行合并的,在內(nèi)核代碼中特別表明了如下注釋:

/* If we are here, it means order is >= pageblock_order.
* We want to prevent merge between freepages on isolate
* pageblock and normal pageblock. Without this, pageblock
* isolation could cause incorrect freepage or CMA accounting.
*
* We don't want to hit this code for the more frequent
* low-order merging.
*/

其對(duì)應(yīng)的代碼處理如下圖所示,其代碼主要目的有兩點(diǎn),其一是保證可以充分地進(jìn)行頁(yè)塊的合并,從而盡量減少內(nèi)存碎片化;其二是保證特殊用途的內(nèi)存塊不受影響。

最后根據(jù)實(shí)際情況,通過函數(shù)list_add(&page->lru, &zone->free_area[order].free_list[migratetype])或者函數(shù)list_add_tail(&page->lru,&zone->free_area[order].free_list[migratetype])把合并后的page添加到對(duì)應(yīng)的鏈表中。

總結(jié)

不同平臺(tái),不同內(nèi)核版本的系統(tǒng),在內(nèi)存處理上或許會(huì)存在或多或少的差異,但其核心思想是相同的。通過本文,我們可以詳細(xì)地了解Buddy中內(nèi)存申請(qǐng)和釋放的處理方式,以及當(dāng)內(nèi)存不足時(shí),Buddy是如何處理的。

作者介紹

趙青窕,51CTO社區(qū)編輯,從事多年驅(qū)動(dòng)開發(fā)。研究興趣包含安全OS和網(wǎng)絡(luò)安全領(lǐng)域,發(fā)表過網(wǎng)絡(luò)相關(guān)專利。

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2024-01-01 18:59:15

KubernetesCPU內(nèi)存

2018-12-06 10:22:54

Linux內(nèi)核內(nèi)存

2022-07-19 13:31:18

Buddy算法內(nèi)存管理框架

2022-07-10 20:47:39

linux中虛擬內(nèi)存

2016-08-11 14:49:34

Java垃圾回收機(jī)制異常

2013-06-04 14:21:20

Vector內(nèi)存釋放

2024-05-06 11:19:20

內(nèi)存池計(jì)算機(jī)編程

2022-05-18 10:49:57

運(yùn)維數(shù)據(jù)

2018-01-19 10:37:00

2020-10-23 06:56:00

C語(yǔ)言動(dòng)態(tài)字符串

2021-05-17 09:28:59

鴻蒙HarmonyOS應(yīng)用

2021-05-21 09:25:11

鴻蒙HarmonyOS應(yīng)用

2009-06-10 22:03:40

JavaScript內(nèi)IE內(nèi)存泄漏

2011-08-16 15:13:49

IOS編程內(nèi)存

2012-09-13 15:37:21

linux內(nèi)存

2024-12-12 09:24:28

RocksDB服務(wù)器

2017-05-04 20:15:51

iOSNSTimer循環(huán)引用

2022-11-11 08:00:00

決策樹機(jī)器學(xué)習(xí)監(jiān)督學(xué)習(xí)

2024-02-05 21:07:51

C++內(nèi)存編程語(yǔ)言

2023-10-18 13:31:00

Linux內(nèi)存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产综合在线视频| 91精品国产综合久久久蜜臀粉嫩| 国产精品播放| www.youjizz.com亚洲| 精品嫩草影院| 欧美性少妇18aaaa视频| 亚洲电影网站| 国产精品人人爽| 天天做天天爱综合| 亚洲精品一区在线观看| 97在线免费公开视频| av电影在线观看网址| 国产在线视视频有精品| 午夜精品一区二区三区av| wwwwww日本| 懂色av色香蕉一区二区蜜桃| 亚洲成人免费av| 日韩精品福利视频| www.激情五月| 日韩av中文在线观看| 欧美高清视频在线| 久久性爱视频网站| 色999韩欧美国产综合俺来也| 日韩一区在线看| julia一区二区中文久久94| 手机看片久久久| 一区二区三区网站| 亚洲精品影视在线观看| 国内精品国产三级国产aⅴ久| www中文字幕在线观看| 中文文精品字幕一区二区| 成人自拍爱视频| 一区二区视频播放| 国产精品久久777777毛茸茸| 麻豆成人在线看| 人妻aⅴ无码一区二区三区| 人人九九精品视频| 欧美在线999| 欧美乱大交xxxxx潮喷l头像| 91大神xh98hx在线播放| 26uuu久久天堂性欧美| 亚洲伊人一本大道中文字幕| 男人天堂视频在线| av成人国产| 欧美成人第一页| 成人性生交大片免费看无遮挡aⅴ| 综合伊人久久| 欧美高清dvd| 亚洲一区二区蜜桃| 69久成人做爰电影| 亚洲成av人在线观看| 99精品一级欧美片免费播放| av电影在线观看| 国产视频一区在线播放| 久久精品综合一区| 99国产精品99| 精品亚洲成a人| 国产日韩欧美在线视频观看| 日本成人一级片| 噜噜噜在线观看免费视频日韩| 中文字幕欧美专区| 超碰男人的天堂| 日韩免费一级| 欧美一区欧美二区| xxx中文字幕| 精品国产三区在线| 欧美一区二区三区四区视频| 欧美一级视频在线| 日韩三区四区| 欧美精品日韩综合在线| gai在线观看免费高清| 香蕉久久一区| 91精品国产色综合久久不卡电影 | 欧美日韩看看2015永久免费| 精品欧美一区二区三区精品久久 | 永久久久久久久| 综合五月婷婷| 国产最新精品视频| 天天干天天干天天操| 欧美亚洲网站| 国产精品99久久久久久久久久久久| 成年人视频免费| 日本成人在线电影网| 国产欧美一区二区三区四区| 亚洲在线精品视频| 国产成人在线电影| 国产精品一区二区av| 国产成人av免费看| 成人在线视频首页| 精品久久久久亚洲| 亚洲AV无码乱码国产精品牛牛| 成熟亚洲日本毛茸茸凸凹| 国产伦精品一区二区三区照片91 | 久久国产日韩欧美| 国产在线观看免费| 中文字幕日韩av资源站| 久久男人资源站| 亚洲天堂电影| 欧美裸体bbwbbwbbw| 制服下的诱惑暮生| 亚洲人成伊人成综合图片| 伊人久久五月天| 三级影片在线看| 国产精品一二| 国产欧美亚洲精品| 亚洲国产剧情在线观看| 91美女片黄在线观看91美女| 亚洲激情一区二区三区| 欧美精品videosex| 欧美亚洲一区二区在线| 四川一级毛毛片| 免费成人高清在线视频theav| 少妇高潮久久久久久潘金莲| 青青草原在线免费观看| 亚洲欧美大片| 91视频免费在线| 亚洲色图21p| 中文字幕欧美一区| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 免费日韩成人| 亚洲电影在线观看| 亚洲区一区二区三| 久久动漫亚洲| 成人av资源| 淫片在线观看| 色猫猫国产区一区二在线视频| 天天干天天色天天干| 日韩av三区| 免费av一区二区| 伊人成年综合网| 高清视频一区二区| 在线码字幕一区| 欧美大片高清| 亚洲国产精品va在看黑人| 久草福利资源在线| 久久综合导航| 久久综合久久久| 精品精品导航| 欧美一卡2卡3卡4卡| 懂色av粉嫩av浪潮av| 鲁大师影院一区二区三区| 国产有色视频色综合| a黄色片在线观看| 欧美三区在线观看| 人妻少妇一区二区| 一本色道久久综合| 国产高清一区视频| 天堂av最新在线| 欧美一区二区三区四区五区| 国产成人免费在线观看视频| 日本视频一区二区三区| 日韩av电影在线观看| 午夜伦理福利在线| 日韩av一区在线观看| 欧美一级高潮片| 国产成人精品三级| 久久久久久久香蕉| 日韩欧美中文字幕在线视频 | 欧美色欧美亚洲另类二区| 国产av自拍一区| 石原莉奈在线亚洲三区| 日韩av一区二区三区在线| 欧美特大特白屁股xxxx| 亚洲理论在线a中文字幕| 韩国av中文字幕| 91视频精品在这里| 精品一卡二卡三卡| 免费日韩一区二区三区| 午夜精品三级视频福利| 香蕉av一区二区三区| 亚洲综合视频在线| 亚洲熟女一区二区| 国产精品一区亚洲| 日本免费高清一区| 国产a亚洲精品| 久久精品91久久久久久再现| 国产日本精品视频| 亚洲综合清纯丝袜自拍| 五月天丁香社区| 亚洲视频成人| 日韩av电影免费播放| 色8久久久久| 久久久久久亚洲| 天堂av电影在线观看| 色偷偷一区二区三区| 美国黄色特级片| 国产一区二区导航在线播放| 国产传媒久久久| 男人的天堂久久| 国产精品免费观看在线| 成人直播在线| 亚洲国产精品热久久| 在线精品免费视| 国产精品久久久久一区二区三区共 | 国产噜噜噜噜久久久久久久久| 日本精品在线| 日韩亚洲欧美成人一区| 日韩福利片在线观看| 国产日韩欧美麻豆| 波多野结衣中文字幕在线播放| 在线精品亚洲| 亚洲一区二区免费视频软件合集| 日本精品一区二区三区在线观看视频| 91国内在线视频| 天堂地址在线www| 亚洲国产精品yw在线观看| 欧美成人精品网站| 亚洲一区免费视频| 久操视频在线观看免费| 国产精品2024| 一级特黄性色生活片| 欧美特黄一区| 亚洲欧洲日韩精品| 免费成人蒂法| 5g国产欧美日韩视频| 香蕉视频亚洲一级| 久久久久久久国产精品视频| 91亚洲欧美| 日韩不卡在线观看| 国产精品一级二级| 色8久久精品久久久久久蜜| 岛国毛片在线观看| 26uuu精品一区二区在线观看| 国产精欧美一区二区三区白种人| 国产欧美日韩一级| 黄色a级片免费看| 欧美超碰在线| 免费成人av网站| 丁香五月缴情综合网| 国产日韩综合一区二区性色av| 在线观看的黄色| 国产+成+人+亚洲欧洲| a毛片在线观看| xvideos亚洲| seseavlu视频在线| 日韩精品在线观| 欧美一级淫片免费视频魅影视频| 欧美高清一级片在线| 亚洲男人天堂网址| 高潮白浆女日韩av免费看| 国产一级一片免费播放| 亚洲男人的天堂av| 人人干在线观看| 中文字幕不卡在线| 精品无码一区二区三区| 97久久精品人人爽人人爽蜜臀| 欧美色图校园春色| 韩国成人福利片在线播放| 国产一二三区av| 久久婷婷丁香| 国产主播在线看| 亚洲欧美久久久| 日韩欧美在线播放视频| 亚洲综合不卡| 日韩av黄色网址| 午夜亚洲激情| 欧美视频第三页| 久久伊人亚洲| 五月婷婷激情久久| 麻豆一区二区三区| 亚洲欧美国产中文| 久久精品99国产精品日本| 午夜免费看视频| 久久99国产精品久久| 手机版av在线| 黑人巨大精品欧美黑白配亚洲| 天堂一区在线观看| 国产在线精品一区二区| 一本一道久久a久久综合蜜桃| 麻豆国产91在线播放| 九九热精品国产| 国产成人精品亚洲午夜麻豆| 熟女人妻一区二区三区免费看| 韩国成人在线视频| 黄色一级片免费的| 国产成人亚洲精品青草天美 | 精品国产乱码一区二区三区| 91成人伦理在线电影| 国产精品高潮呻吟久久久久| 精品久久久久久一区| 国产剧情一区| 午夜啪啪免费视频| 黄色亚洲免费| 日韩av片在线看| 日韩av中文字幕一区二区 | 99riav视频在线观看| 97在线免费视频| 69堂精品视频在线播放| 国产欧美日韩中文字幕在线| 视频一区视频二区欧美| 亚洲一区二区免费| 欧美色图婷婷| 亚洲高清精品中出| 婷婷久久国产对白刺激五月99| 免费的一级黄色片| 美女国产精品| 女人扒开腿免费视频app| 99re这里只有精品首页| 日本黄色小视频在线观看| 亚洲精品免费播放| 久久久久久久久久久影院| 91精品国产综合久久久久| 午夜av免费在线观看| 视频在线观看99| aaa在线播放视频| 国产一区视频在线| 国产精品天天看天天狠| 一本久道久久综合| 99精品免费| 天天碰免费视频| 国产乱对白刺激视频不卡| 午夜免费福利影院| 中文字幕永久在线不卡| 国产香蕉视频在线| 欧美人妖巨大在线| 人操人视频在线观看| 久久成人这里只有精品| 欧美中文字幕精在线不卡| www 成人av com| 欧美成人milf| 手机看片福利盒子久久| 成人免费不卡视频| 欧美性生交大片| 在线这里只有精品| 手机av在线免费观看| 久久综合伊人77777尤物| 成人性生交大片免费看网站| 国产精品劲爆视频| 视频福利一区| 国产精品69久久久| 国产一区亚洲一区| 夜夜春很很躁夜夜躁| 无吗不卡中文字幕| 精品久久久无码中文字幕| 中文字幕自拍vr一区二区三区| 625成人欧美午夜电影| 激情视频在线观看一区二区三区| 女同性一区二区三区人了人一| 五月婷婷狠狠操| 2021国产精品久久精品| 久久中文字幕在线观看| 91精品午夜视频| 欧美成人精品一区二区男人看| 国产精品精品久久久| 国产精品流白浆在线观看| 激情五月五月婷婷| 青青草成人在线观看| 在线免费观看麻豆| 欧美色视频日本版| 天堂av在线7| 欧美一级大胆视频| 色婷婷av一区二区三区丝袜美腿| 青草视频在线观看视频| 粉嫩欧美一区二区三区高清影视| 欧美性生交大片| 3d动漫精品啪啪一区二区竹菊| 香蕉视频在线免费看| 国产噜噜噜噜噜久久久久久久久 | gogo在线观看| 96国产粉嫩美女| 最新欧美人z0oozo0| 岛国av免费在线| 一区二区三区在线不卡| 东京热一区二区三区四区| 日韩电影大片中文字幕| 亚洲成人人体| 偷拍盗摄高潮叫床对白清晰| 国产传媒一区在线| 性无码专区无码| 中文字幕亚洲图片| 日韩免费高清视频网站| 亚洲精品无码久久久久久| 中文字幕av不卡| www.国产三级| 日本一区二区在线播放| 手机亚洲手机国产手机日韩| 风韵丰满熟妇啪啪区老熟熟女| 精品久久久久久中文字幕| 电影av在线| 99超碰麻豆| 肉丝袜脚交视频一区二区| 91麻豆免费视频网站| 日韩国产在线看| 色婷婷成人网| 男女午夜激情视频| 最新日韩av在线| 色网站免费观看| 国产玖玖精品视频| 亚洲一区二区免费看| 亚洲欧美精品久久| 国产偷亚洲偷欧美偷精品| 9999在线精品视频| 99re在线视频免费观看| 一区二区三区四区亚洲| 国产三级在线看| 国产一区二区精品免费| 精品一区二区三区香蕉蜜桃| 久草国产精品视频| 美女久久久久久久久久久| 国产精品密蕾丝视频下载|