久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

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

编程问答

伙伴分配器的内核实现

發(fā)布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 伙伴分配器的内核实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

主要參考了《深入linux內(nèi)核》和《Linux內(nèi)核深度解析》,另外簡單淺析了一下相關(guān)內(nèi)容

文章目錄

  • 伙伴分配器
    • 基本的伙伴分配器
    • 分區(qū)的伙伴分配器
      • 管理分區(qū)內(nèi)存的鏈表
      • 根據(jù)分配標(biāo)志獲取首選區(qū)域類型
      • 備用區(qū)域列表(從其他節(jié)點或區(qū)域借用物理頁)
      • 區(qū)域水線
        • 相關(guān)數(shù)據(jù)結(jié)構(gòu)
        • 計算水位線
        • 水位的變化
      • 防止過度借用
      • /proc/zoneinfo
    • 根據(jù)可移動性分組
    • 每處理器頁集合(分配單頁優(yōu)化)
    • 分配標(biāo)志位
    • 復(fù)合頁
    • 對高階原子分配的優(yōu)化處理(MIGRATE_HIGHATOMIC)
    • 分配頁
      • 分配接口
      • 核心函數(shù)的實現(xiàn)__alloc_pages_nodemask
      • 快速分配 get_page_from_freelist
      • 慢速分配 __alloc_pages_slowpath
    • 釋放頁
      • free_hot_cold_page
      • __free_pages_ok

伙伴分配器

當(dāng)系統(tǒng)內(nèi)核初始化完畢后,使用頁分配器管理物理頁,使用的頁分配器是伙伴分配器,伙伴分配器的特點是算法簡單且高效。

基本的伙伴分配器

連續(xù)的物理頁稱為頁塊(page block)。階(order)是伙伴分配器的一個專業(yè)術(shù)語,是頁的數(shù)量單位,2 ^ n個連續(xù)頁稱為 n 階頁塊。 滿足以下條件的兩個n階頁塊稱為伙伴(buddy):

1、兩個頁塊是相鄰的,即物理地址是連續(xù)的;

2、頁塊的第一頁的物理頁號必須是2n的整數(shù)倍;

3、如果合并成(n+1)階頁塊,第一頁的物理頁號必須是2n+1的整數(shù)倍。

伙伴分配器分配和釋放物理頁的數(shù)量單位為階。分配n階頁塊的過程如下:

1、查看是否有空閑的n階頁塊,如果有直接分配;否則,繼續(xù)執(zhí)行下一步;

2、查看是否存在空閑的 n+1 階頁塊,如果有,把 n+1 階頁塊分裂為兩個n階頁塊,一個插入空閑n階頁塊鏈表,另一個分配出去;否則繼續(xù)執(zhí)行下一步。

3、查看是否存在空閑的 n+2 階頁塊,如果有把 n+2 階頁塊分裂為兩個(n+2)階頁塊,一個插入空閑 n+1 階頁塊鏈表,另一個分裂為兩個n階頁塊,一個插入空間n階頁塊鏈表,另一個分配出去;如果沒有,繼續(xù)查看更高階是否存在空閑頁塊。

分區(qū)的伙伴分配器

內(nèi)核在基本的伙伴分配器基礎(chǔ)改進擴展

  • 支持內(nèi)存節(jié)點和區(qū)域,稱為分區(qū)的伙伴分配器(zond buddy allocator) ;

  • 為了預(yù)防內(nèi)存碎片,把物理頁根據(jù)可移動性分組;(分成不同的鏈表管理)

  • 針對分配單頁做了性能優(yōu)化,為了減少處理器之間的鎖競爭,在內(nèi)存區(qū)域增加1個每處理器頁集合。

管理分區(qū)內(nèi)存的鏈表

分區(qū)的伙伴分配器專注于某個內(nèi)存節(jié)點的某個區(qū)域。內(nèi)存區(qū)域的結(jié)構(gòu)體成員free_area用來維護空閑頁塊,數(shù)組下標(biāo)對應(yīng)頁塊的階數(shù)。 系統(tǒng)內(nèi)存中的每個物理內(nèi)存頁(頁幀),都對應(yīng)于一個struct page實例,,每個內(nèi)存域都關(guān)聯(lián)了一個struct zone的實例,其中保存了用于管理伙伴數(shù)據(jù)的主要數(shù)數(shù)組。

struct zone {/* Read-mostly fields */.../* free areas of different sizes */struct free_area free_area[MAX_ORDER]; // 不同長度的空閑區(qū)域... };struct free_area {struct list_head free_list[MIGRATE_TYPES]; // MIGRATE_TYPESunsigned long nr_free; };

MAX_ORDER是最大階數(shù),實際上是可分配的最大階數(shù)減1,默認(rèn)值是11,意味著伙伴分配器一次最多可以分配2^10頁。

#ifndef CONFIG_FORCE_MAX_ZONEORDER #define MAX_ORDER 11 #else #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER #endif

根據(jù)分配標(biāo)志獲取首選區(qū)域類型

申請頁時,最低的4個標(biāo)志位用來指定首選的內(nèi)存區(qū)域類型,內(nèi)核源碼如下:

include\linux\gfp.h

標(biāo)志組合

#define ___GFP_DMA 0x01u #define ___GFP_HIGHMEM 0x02u #define ___GFP_DMA32 0x04u #define ___GFP_MOVABLE 0x08u

內(nèi)存區(qū)域類型

為什么要使用OPT_ZONE_DMA,而不使用ZONE_DMA?

因為DMA區(qū)域是可選的,如果不存在只能訪問16MB以下物理內(nèi)存的外圍設(shè)備,那么不需要定義DMA區(qū)域,OPT_ZONE_DMA就是ZONE_NORMAL,
從普通區(qū)域申請頁。高端內(nèi)存區(qū)域和DMA32區(qū)域也是可選的。

#ifdef CONFIG_HIGHMEM #define OPT_ZONE_HIGHMEM ZONE_HIGHMEM #else #define OPT_ZONE_HIGHMEM ZONE_NORMAL #endif#ifdef CONFIG_ZONE_DMA #define OPT_ZONE_DMA ZONE_DMA #else #define OPT_ZONE_DMA ZONE_NORMAL #endif#ifdef CONFIG_ZONE_DMA32 #define OPT_ZONE_DMA32 ZONE_DMA32 #else #define OPT_ZONE_DMA32 ZONE_NORMAL #endif

內(nèi)核使用宏GFP_ZONE_TABLE定義了標(biāo)志組合到區(qū)域類型的映射表,其中GFP_ZONES_SHIFT是區(qū)域類型占用的位數(shù),GFP_ZONE_TABLE把每種標(biāo)志組合映射到32位整數(shù)的某個位置,偏移是(標(biāo)志組合*區(qū)域類型位數(shù)),從這個偏移開始的GFP_ZONES_SHIFT個二進制位存放區(qū)域類型。

宏GFP_ZONE_TABLE是一個常量,編譯器在編譯時會進行優(yōu)化,直接計算出結(jié)果,不會等到運行程序的時候才計算數(shù)值。

#define GFP_ZONE_TABLE ( \(ZONE_NORMAL << 0 * GFP_ZONES_SHIFT) \| (OPT_ZONE_DMA << ___GFP_DMA * GFP_ZONES_SHIFT) \| (OPT_ZONE_HIGHMEM << ___GFP_HIGHMEM * GFP_ZONES_SHIFT) \| (OPT_ZONE_DMA32 << ___GFP_DMA32 * GFP_ZONES_SHIFT) \| (ZONE_NORMAL << ___GFP_MOVABLE * GFP_ZONES_SHIFT) \| (OPT_ZONE_DMA << (___GFP_MOVABLE | ___GFP_DMA) * GFP_ZONES_SHIFT) \| (ZONE_MOVABLE << (___GFP_MOVABLE | ___GFP_HIGHMEM) * GFP_ZONES_SHIFT)\| (OPT_ZONE_DMA32 << (___GFP_MOVABLE | ___GFP_DMA32) * GFP_ZONES_SHIFT)\ )

內(nèi)核使用函數(shù)gfp_zone()根據(jù)分配標(biāo)志得到首選的區(qū)域類型

  • 先分離出區(qū)域標(biāo)志位
  • 然后算出在映射表中的偏移(區(qū)域標(biāo)志位 * 區(qū)域類型位數(shù))
  • 接著把映射表右移偏移值,最后取出最低的區(qū)域類型位數(shù)(作為zone_type所對應(yīng)的類型)。
static inline enum zone_type gfp_zone(gfp_t flags) {enum zone_type z;int bit = (__force int) (flags & GFP_ZONEMASK);z = (GFP_ZONE_TABLE >> (bit * GFP_ZONES_SHIFT)) &((1 << GFP_ZONES_SHIFT) - 1);VM_BUG_ON((GFP_ZONE_BAD >> bit) & 1);return z; }

備用區(qū)域列表(從其他節(jié)點或區(qū)域借用物理頁)

如果首選的內(nèi)存節(jié)點或區(qū)域不能滿足分配請求,可以從備用的內(nèi)存區(qū)域借用物理頁。

借用必須遵守相應(yīng)的規(guī)則:

  • 一個內(nèi)存節(jié)點的某個區(qū)域類型可以從另一個內(nèi)存節(jié)點的相同區(qū)域類型借用物理頁,比如節(jié)點0的普通區(qū)域可以從節(jié)點1的普通區(qū)域借用物理頁;
  • 高區(qū)域類型**(高地址的區(qū)域類型)可以從低區(qū)域類型(低地址的區(qū)域類型)**借用物理頁,比如普通區(qū)域可以從DMA區(qū)域借用物理頁;
  • 低區(qū)域類型不能從高區(qū)域類型借用物理頁,比如DMA區(qū)域不能從普通區(qū)域借用物理頁。

內(nèi)存節(jié)點的pg_data_t實例已定義備用區(qū)域列表,內(nèi)核源碼如下:

include\linux\mmzone.h

typedef struct pglist_data {struct zone node_zones[MAX_NR_ZONES]; // 內(nèi)存區(qū)域數(shù)組struct zonelist node_zonelists[MAX_ZONELISTS]; // 備用區(qū)域列表int nr_zones; // 該節(jié)點包含的內(nèi)存區(qū)域數(shù)量 #ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */struct page *node_mem_map; // 頁描述符數(shù)組 #ifdef CONFIG_PAGE_EXTENSIONstruct page_ext *node_page_ext; // 頁的擴展屬性 #endif #endif...unsigned long node_start_pfn; // 該節(jié)點的起始物理頁號unsigned long node_present_pages; /// 物理頁的總數(shù)unsigned long node_spanned_pages; // 物理頁的總長度,包括空洞int node_id; // 節(jié)點標(biāo)識符... } pg_data_t;

struct zonelist node_zonelists[MAX_ZONELISTS]; 中的成員項

enum {ZONELIST_FALLBACK, // 包含所有內(nèi)存點的備用區(qū)域列表 #ifdef CONFIG_NUMA/** The NUMA zonelists are doubled because we need zonelists that* restrict the allocations to a single node for __GFP_THISNODE.*/ZONELIST_NOFALLBACK, // 只包含當(dāng)前內(nèi)存節(jié)點的備用區(qū)域列表 #endifMAX_ZONELISTS }; struct zoneref {struct zone *zone; // 內(nèi)存區(qū)的數(shù)據(jù)結(jié)構(gòu)int zone_idx; // 成員zone指向的內(nèi)存區(qū)域的類型 };

UMA系統(tǒng)只有一個備用區(qū)域列表,按區(qū)域類型從高到低排序。假設(shè)UMA系統(tǒng)包含普通區(qū)域和DMA區(qū)域,那么備用區(qū)域列表:{普通區(qū)域,DMA區(qū)域}。

**NUMA系統(tǒng)每個內(nèi)存節(jié)點有兩個備用區(qū)域列表:一個包含所有內(nèi)存節(jié)點的區(qū)域,另一個只包含當(dāng)前內(nèi)存節(jié)點的區(qū)域。**如果申請頁時指定標(biāo)志
__GFP_THISNODE,要求只能從指定內(nèi)存節(jié)點分配物理頁,就需要使用指定內(nèi)存節(jié)點的第二個備用區(qū)域列表。

包含所有內(nèi)存節(jié)點的備用區(qū)域列表有兩種排序方法:
a.節(jié)點優(yōu)先順序

  • 先根據(jù)節(jié)點距離從小到大排序,然后在每個節(jié)點里面根據(jù)區(qū)域類型從高到低排序。
  • 優(yōu)點是優(yōu)先選擇距離近的內(nèi)存,缺點是在高區(qū)域耗盡以前使用低區(qū)域。

b.區(qū)域優(yōu)先順序

  • 先根據(jù)區(qū)域類型從高到低排序,然后在每個區(qū)域類型里面根據(jù)節(jié)點距離從小到大排序。
  • 優(yōu)點是減少低區(qū)域耗盡的概率,缺點是不能保證優(yōu)先選擇距離近的內(nèi)存。

默認(rèn)的排序方法就是自動選擇最優(yōu)的排序方法:比如是64位系統(tǒng),因為需要DMA和DMA32區(qū)域的備用相對少,所以選擇節(jié)點優(yōu)先順序;如果是32位系統(tǒng),選擇區(qū)域優(yōu)先順序。

區(qū)域水線

首選的內(nèi)存區(qū)域什么情況下從備用區(qū)域借用物理頁呢?

每個內(nèi)存區(qū)域有3個水線

a.高水線(high):如果內(nèi)存區(qū)域的空閑頁數(shù)大于高水線,說明內(nèi)存區(qū)域的內(nèi)存充足;

b.低水線(low):如果內(nèi)存區(qū)域的空閑頁數(shù)小于低水線,說明內(nèi)存區(qū)域的內(nèi)存輕微不足;

c.最低水線(min):如果內(nèi)存區(qū)域的空閑頁數(shù)小于最低水線,說明內(nèi)存區(qū)域的內(nèi)存嚴(yán)重不足。(需要開啟回收內(nèi)存的工作)

struct zone {/* Read-mostly fields *//* zone watermarks, access with *_wmark_pages(zone) macros */unsigned long watermark[NR_WMARK]; // 頁分配器使用的水線
  • 最低水線以下的內(nèi)存稱為緊急保留內(nèi)存,在內(nèi)存嚴(yán)重不足的緊急情況下,給承諾“分給我們少量的緊急保留內(nèi)存使用,我可以釋放更多的內(nèi)存”的進程使用。
    • 設(shè)置了進程標(biāo)志位PF_MEMALLOC的進程可以使用緊急保留內(nèi)存,標(biāo)志位PF_MEMALLOC表示承諾“給我少量緊急保留內(nèi)存使用,我可以釋放更多的內(nèi)存”。內(nèi)存管理子系統(tǒng)以外的子系統(tǒng)不應(yīng)該使用這個標(biāo)志位,典型的例子是頁回收內(nèi)核線程kswapd,在回收頁的過程中可能需要申請內(nèi)存。
    • 如果申請頁時設(shè)置了標(biāo)志位__GFP_MEMALLOC,即調(diào)用者承諾“給我少量緊急保留內(nèi)存使用,我可以釋放更多的內(nèi)存”,那么可以使用緊急保留內(nèi)存。

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

watermark水位控制內(nèi)核源碼重要數(shù)據(jù)參數(shù)

enum zone_watermarks {WMARK_MIN,WMARK_LOW,WMARK_HIGH,NR_WMARK };#define min_wmark_pages(z) (z->watermark[WMARK_MIN]) #define low_wmark_pages(z) (z->watermark[WMARK_LOW]) #define high_wmark_pages(z) (z->watermark[WMARK_HIGH]) struct zone {/* Read-mostly fields *//* zone watermarks, access with *_wmark_pages(zone) macros */unsigned long watermark[NR_WMARK]; // 頁分配器使用的水線...unsigned long managed_pages; // 伙伴分配器管理的物理頁的數(shù)量unsigned long spanned_pages; // 當(dāng)前區(qū)域跨越的總頁數(shù),包括空洞unsigned long present_pages; // 當(dāng)前區(qū)域存在的物理頁的數(shù)量,不包括空洞
  • spanned_pages: 代表的是這個zone中所有的頁,包含空洞,計算公式是: zone_end_pfn - zone_start_pfn
  • present_pages: 代表的是這個zone中可用的所有物理頁,計算公式是:spanned_pages-hole_pages
  • managed_pages: 代表的是通過buddy管理的所有可用的頁,計算公式是:present_pages - reserved_pages
  • 三者的關(guān)系是: spanned_pages > present_pages > managed_pages

它們?nèi)咧g的關(guān)系: spanned_pages > present_pages > managed_pages。

計算水位線

內(nèi)核在初始化階段會調(diào)用 init_per_zone_wmark_min 來進行每個zone 的內(nèi)存水位線初始化,同時也會設(shè)置zone的lowmem_reserve 值

計算水線時,有兩個重要的參數(shù)。

min_free_kbytes代表的是系統(tǒng)保留空閑內(nèi)存的最低限,watermark[WMARK_MIN]的值是通過min_free_kbytes計算出來。

(1)min_free_kbytes是最小空閑字節(jié)數(shù)。默認(rèn)值 = 4 * sqrt(lowmem_kbytes),并且限制在范圍[128,65536]以內(nèi)。
其中l(wèi)owmem_kbytes是超過high的水位的頁和,單位是KB。參考文件“mm/page_alloc.c”中的函數(shù)init_per_zone_wmark_min。可以通過文件“/proc/sys/vm/min_free_kbytes”設(shè)置最小空閑字節(jié)數(shù)。

  • int __meminit init_per_zone_wmark_min(void) ...// lowmem中超過高水位的頁的總和,單位kbytes,就是lowmem中超過high的水位的頁乘以4得到lowmem_kybyteslowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10);new_min_free_kbytes = int_sqrt(lowmem_kbytes * 16);// min_free_kybtes最小不能小于128k,最大超過65535kif (new_min_free_kbytes > user_min_free_kbytes) { // int user_min_free_kbytes = -1;min_free_kbytes = new_min_free_kbytes;if (min_free_kbytes < 128)min_free_kbytes = 128;if (min_free_kbytes > 65536)min_free_kbytes = 65536; ...

(2)“watermark_scale_factor"這個系數(shù),其默認(rèn)值為10,對應(yīng)內(nèi)存占比0.1%(10/10000),可通過”/proc/ sys/vm/watermark_scale_factor"設(shè)置,最大為1000。當(dāng)它的值被設(shè)定為1000時,意味著"low"與"min"之間的差值,以及"high"與"low"之間的差值都將是內(nèi)存大小的10%(1000/10000)。

文件“mm/page_alloc.c”中的函數(shù)__setup_per_zone_wmarks()負(fù)責(zé)計算每個內(nèi)存區(qū)域的最低水線、低水線和高水線。

計算最低水線的方法如下:

高端內(nèi)存區(qū)域(ZONE_HIGHMEM):這是32位時代的產(chǎn)物,內(nèi)核和用戶地址空間按1 : 3劃分,內(nèi)核地址空間只有1GB,不能把1GB以上的內(nèi)存直接映射到內(nèi)核地址空間,把不能直接映射的內(nèi)存劃分到高端內(nèi)存區(qū)域(采用間接映射)。通常把DMA區(qū)域、DMA32區(qū)域和普通區(qū)域統(tǒng)稱為低端內(nèi)存區(qū)域。64位系統(tǒng)的內(nèi)核虛擬地址空間非常大,不再需要高端內(nèi)存區(qū)域(內(nèi)核虛擬地址空間夠用)。

Linux的內(nèi)核空間(低端內(nèi)存、高端內(nèi)存)

  • (1)min_free_pages = min_free_kbytes對應(yīng)的頁數(shù)==(動態(tài)變化)==。

    • min_free_kbytes = 4 * sqrt(lowmem_kbytes),lowmem_kbytes中和 managed 與 當(dāng)前high水位的差值,詳解nr_free_zone_pages函數(shù)(mm\page_alloc.c)
    • 高水線比較大的時候,最低水線比較小,因為kswap線程在很早就開啟了
    • 高水線比較小的時候,最低水線比較大,因為kswap線程開啟比較晚,需要保留足夠內(nèi)存給它用
  • (2)lowmem_pages = 所有低端內(nèi)存區(qū)域中伙伴分配器管理的頁數(shù)總和。

  • (3)高端內(nèi)存區(qū)域的最低水線 = zone->managed_pages/1024,并且限制在范圍[32, 128]以內(nèi)(zone->managed_pages是該內(nèi)存區(qū)域中伙伴分配器管理的頁數(shù),在內(nèi)核初始化的過程中引導(dǎo)內(nèi)存分配器分配出去的物理頁,不受伙伴分配器管理)。

  • (4)低端內(nèi)存區(qū)域的最低水線 = min_free_pages * zone->managed_pages / lowmem_pages,即把min_free_pages按比例分配到每個低端內(nèi)存區(qū)域。

計算低水線和高水線的方法如下:

  • (1)增量 = (最低水線 / 4, zone->managed_pages * watermark_scale_factor / 10000)取最大值。

  • (2)低水線 = 最低水線 + 增量。

  • (3)高水線 = 最低水線 + 增量 * 2。

如果(最低水線 / 4)比較大,那么計算公式簡化如下:

(1)低水線 = 最低水線 * 5/4。

(2)高水線 = 最低水線 * 3/2。

如下圖

水位的變化

下面這張時序圖能很好地表示水位的變化:

剩余內(nèi)存高于pages_high,說明剩余內(nèi)存比較多,沒有內(nèi)存壓力;
剩余內(nèi)存小于pages_high,說明內(nèi)存有一定壓力,但還可以滿足新內(nèi)存請求;
剩余內(nèi)存小于pages_low,說明內(nèi)存壓力比較大,剩余內(nèi)存不多了。這時,kswapd0 會被喚醒,執(zhí)行內(nèi)存回收,直至剩余內(nèi)存大于pages_high;
剩余內(nèi)存小于pages_min,說明進程可用的內(nèi)存都耗盡,僅內(nèi)核才可以分配內(nèi)存;

如果內(nèi)存消耗導(dǎo)致剩余內(nèi)存達到或超過了pages_min時,就會觸發(fā)直接回收(direct page reclaim);

防止過度借用

和高區(qū)域類型相比,低區(qū)域類型的內(nèi)存相對少,是稀缺資源,而且有特殊用途,例如DMA區(qū)域用于外圍設(shè)備和內(nèi)存之間的數(shù)據(jù)傳輸。為了防止高區(qū)域類型過度借用低區(qū)域類型的物理頁,低區(qū)域類型需要采取防衛(wèi)措施,保留一定數(shù)量的物理頁。

一個內(nèi)存節(jié)點的某個區(qū)域類型從另一個內(nèi)存節(jié)點的相同區(qū)域類型借用物理頁,后者應(yīng)該毫無保留地借用。

內(nèi)存區(qū)域有一個數(shù)組用于存放保留頁數(shù):

include/linux/mmzone.h struct zone {long lowmem_reserve[MAX_NR_ZONES];} ____cacheline_internodealigned_in_smp;

zone[i]->lowmem_reserve[j]表示區(qū)域類型i應(yīng)該保留多少頁不能借給區(qū)域類型j,僅當(dāng)j大于i時有意義。
zone[i]->lowmem_reserve[j]的計算規(guī)則如下:

(i < j):zone[i]->lowmem_reserve[j]= (當(dāng)前內(nèi)存節(jié)點上從zone[i + 1] 到zone[j]伙伴分配器管理的頁數(shù)總和)/ sysctl_lowmem_reserve_ratio[i] (i = j):zone[i]->lowmem_reserve[j]= 0(相同的區(qū)域類型不應(yīng)該保留) (i > j):zone[i]->lowmem_reserve[j]= 0(沒意義,不會出現(xiàn)低區(qū)域類型從高區(qū)域類型借用物理頁的情況

數(shù)組sysctl_lowmem_reserve_ratio存放各種區(qū)域類型的保留比例,因為內(nèi)核不允許使用浮點數(shù),所以使用倒數(shù)值。DMA區(qū)域和DMA32區(qū)域的默認(rèn)保留比例都是256,普通區(qū)域和高端內(nèi)存區(qū)域的默認(rèn)保留比例都是32。

mm/page_alloc.c int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = { #ifdef CONFIG_ZONE_DMA256, #endif #ifdef CONFIG_ZONE_DMA32256, #endif #ifdef CONFIG_HIGHMEM32, #endif32, };

可以通過文件“/proc/sys/vm/lowmem_reserve_ratio”修改各種區(qū)域類型的保留比例。

/proc/zoneinfo

Linux系統(tǒng)通常將主內(nèi)存劃分為三個區(qū)域。大多數(shù)內(nèi)存分配到ZONE_NORMAL區(qū)域 。 在低端,有16MB的內(nèi)存被分區(qū)到DMA區(qū)域ZONE_DMA中,該內(nèi)存被保留用于特定需要的情況。DMA內(nèi)存最常見的用戶是較舊的外設(shè),它只能尋址24位內(nèi)存。在高端,ZONE_HIGHMEM包含內(nèi)核無法直接尋址的所有內(nèi)存。

并非所有系統(tǒng)都實現(xiàn)所有這些區(qū)域。一些較新的體系結(jié)構(gòu)不支持古老的外圍設(shè)備,而忽略了區(qū)域 ZONE_DMA。
一般來說,64位系統(tǒng)沒有尋址問題,也不需要ZONE_HIGHMEM。
IA64體系結(jié)構(gòu)決定了ZONE_DMA的另一種實現(xiàn)方式,將其定義為覆蓋4GB以下的所有內(nèi)存。

事實證明,4GB區(qū)域有很多用途。相當(dāng)多的設(shè)備在訪問不能用32位尋址的內(nèi)存時遇到問題。這些設(shè)備的驅(qū)動程序已經(jīng)被強制使用ZONE_DMA、I/O存儲器管理單元(在有ZONE_DMA的系統(tǒng)上)或緩沖區(qū)。這些解決方案都不是理想的:ZONE_DMA是一個小而稀缺的資源,IOMMU空間也可能稀缺,反彈緩沖區(qū)也很慢。如果在4GB邊界下可靠地分配DMA內(nèi)存,所有這些問題都可以避免。

在64位Linux操作系統(tǒng)上,分區(qū)如下:
最開始的16M內(nèi)存是DMA ZONE 內(nèi)存,DMA32 ZONE為16M~4G,高于4G的內(nèi)存為Normal ZONE。

root:/ # cat /proc/zoneinfo pages free 87512min 2702low 10899high 11574spanned 2094976 ==> spanned_pagespresent 1959807 ==> present_pagesmanaged 1911161 ==> managed_pagesprotection: (0, 0) ... Node 0, zone DMA32 ... Node 0, zone Normal ... Node 0, zone Movable ... Node 0, zone Device ...

內(nèi)存水位watermark

根據(jù)可移動性分組

在系統(tǒng)長時間運行后,物理內(nèi)存可能出現(xiàn)很多碎片,可用物理頁很多,但是最大的連續(xù)物理內(nèi)存可能只有一頁。

  • 內(nèi)存碎片對用戶程序不是問題,因為用戶程序可以通過頁表把連續(xù)的虛擬頁映射到不連續(xù)的物理頁。但是內(nèi)存碎片對內(nèi)核是一個問題,因為內(nèi)核使用直接映射的虛擬地址空間,連續(xù)的虛擬頁必須映射到連續(xù)的物理頁。內(nèi)存碎片是伙伴分配器的一個弱點。

為了預(yù)防內(nèi)存碎片,內(nèi)核根據(jù)可移動性把物理頁分為3種類型。

  • (1)不可移動頁:位置必須固定,不能移動,直接映射到內(nèi)核虛擬地址空間的頁屬于這一類。
  • (2)可移動頁:使用頁表映射的頁屬于這一類,可以移動到其他位置,然后修改頁表映射。
  • (3)可回收頁:不能移動,但可以回收,需要數(shù)據(jù)的時候可以重新從數(shù)據(jù)源獲取。后備存儲設(shè)備支持的頁屬于這一類。

內(nèi)核把具有相同可移動性的頁分組。為什么這種方法可以減少碎片?試想:如果不可移動頁出現(xiàn)在可移動內(nèi)存區(qū)域的中間,會阻止可移動內(nèi)存區(qū)域合并。這種方法把不可移動頁聚集在一起,可以防止不可移動頁出現(xiàn)在可移動內(nèi)存區(qū)域的中間。

內(nèi)核定義了以下遷移類型:

include/linux/mmzone.h

enum migratetype {MIGRATE_UNMOVABLE, /* 不可移動 */MIGRATE_MOVABLE, /* 可移動 */MIGRATE_RECLAIMABLE, /* 可回收 */MIGRATE_PCPTYPES, /* 定義內(nèi)存區(qū)域的每處理器頁集合中鏈表的數(shù)量 */MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES,/* 高階原子分配,即階數(shù)大于0,并且分配頁時不能睡眠等待 */ #ifdef CONFIG_CMAMIGRATE_CMA, /* 連續(xù)內(nèi)存分配器 */ #endif #ifdef CONFIG_MEMORY_ISOLATIONMIGRATE_ISOLATE, /* 隔離,不能從這里分配 */ #endifMIGRATE_TYPES };

前面3種是真正的遷移類型,后面的遷移類型都有特殊用途:

  • MIGRATE_HIGHATOMIC用于高階原子分配(參考3.7.5節(jié)的“對高階原子分配的優(yōu)化處理”),
  • MIGRATE_CMA用于連續(xù)內(nèi)存分配器(參考3.20節(jié)),
  • MIGRATE_ISOLATE用來隔離物理頁(由連續(xù)內(nèi)存分配器、內(nèi)存熱插拔和從內(nèi)存硬件錯誤恢復(fù)等功能使用)。

對伙伴分配器的數(shù)據(jù)結(jié)構(gòu)的主要調(diào)整是把空閑鏈表拆分成每種遷移類型一條空閑鏈表。

struct free_area {struct list_head free_list[MIGRATE_TYPES];unsigned long nr_free; };

只有當(dāng)物理內(nèi)存足夠大且每種遷移類型有足夠多的物理頁時,根據(jù)可移動性分組才有意義。

  • 全局變量page_group_by_mobility_disabled表示是否禁用根據(jù)可移動性分組。
  • vm_total_pages是所有內(nèi)存區(qū)域里面高水線以上的物理頁總數(shù),
  • pageblock_order是按可移動性分組的階數(shù),pageblock_nr_pages是pageblock_order對應(yīng)的頁數(shù)。

如果所有內(nèi)存區(qū)域里面高水線以上的物理頁總數(shù)小于(pageblock_nr_pages * 遷移類型數(shù)量),那么禁用根據(jù)可移動性分組。

mm/page_alloc.c void __ref build_all_zonelists(pg_data_t *pgdat, struct zone *zone) {if (vm_total_pages < (pageblock_nr_pages * MIGRATE_TYPES))page_group_by_mobility_disabled = 1;elsepage_group_by_mobility_disabled = 0;

pageblock_order是按可移動性分組的階數(shù),簡稱分組階數(shù),可以理解為一種遷移類型的一個頁塊的最小長度。如果內(nèi)核支持巨型頁,那么pageblock_order是巨型頁的階數(shù),否則pageblock_order是伙伴分配器的最大分配階。

申請頁時,可以使用標(biāo)志__GFP_MOVABLE指定申請可移動頁,使用標(biāo)志__GFP_RECLAIMABLE指定申請可回收頁,如果沒有指定這兩個標(biāo)志,表示
申請不可移動頁。函數(shù)gfpflags_to_migratetype用來把分配標(biāo)志轉(zhuǎn)換成遷移類型:

include/linux/gfp.h

/* 把分配標(biāo)志轉(zhuǎn)換成遷移類型 */ #define GFP_MOVABLE_MASK (__GFP_RECLAIMABLE|__GFP_MOVABLE) #define GFP_MOVABLE_SHIFT 3static inline int gfpflags_to_migratetype(const gfp_t gfp_flags) {if (unlikely(page_group_by_mobility_disabled))return MIGRATE_UNMOVABLE;/* 根據(jù)可移動性分組 */return (gfp_flags & GFP_MOVABLE_MASK) >> GFP_MOVABLE_SHIFT; }

如果禁用根據(jù)可移動性分組,那么總是申請不可移動頁。

申請某種遷移類型的頁時,如果這種遷移類型的頁用完了,可以從其他遷移類型盜用(steal)物理頁。內(nèi)核定義了每種遷移類型的備用類型優(yōu)先級列表:

static int fallbacks[MIGRATE_TYPES][4] = {[MIGRATE_UNMOVABLE] = { MIGRATE_RECLAIMABLE, MIGRATE_MOVABLE, MIGRATE_TYPES },[MIGRATE_RECLAIMABLE] = { MIGRATE_UNMOVABLE, MIGRATE_MOVABLE, MIGRATE_TYPES },[MIGRATE_MOVABLE] = { MIGRATE_RECLAIMABLE, MIGRATE_UNMOVABLE, MIGRATE_TYPES }, #ifdef CONFIG_CMA[MIGRATE_CMA] = { MIGRATE_TYPES }, /* 從不使用 */ #endif #ifdef CONFIG_MEMORY_ISOLATION[MIGRATE_ISOLATE] = { MIGRATE_TYPES }, /* 從不使用 */ #endif };

不可移動類型的備用類型按優(yōu)先級從高到低是:可回收類型和可移動類型。
可回收類型的備用類型按優(yōu)先級從高到低是:不可移動類型和可移動類型。
可移動類型的備用類型按優(yōu)先級從高到低是:可回收類型和不可移動類型。
如果需要從備用類型盜用物理頁,那么從最大的頁塊開始盜用,以避免產(chǎn)生碎片。

釋放物理頁的時候,需要把物理頁插入物理頁所屬遷移類型的空閑鏈表,內(nèi)核怎么知道物理頁的遷移類型?
內(nèi)存區(qū)域的zone結(jié)構(gòu)體的成員pageblock_flags指向頁塊標(biāo)志位圖,頁塊的大小是分組階數(shù)pageblock_order (MAX_ORDER-1),我們把這種頁塊稱為分組頁塊。

struct zone {#ifndef CONFIG_SPARSEMEM/** 分組頁塊的標(biāo)志參考文件pageblock-flags.h。* 如果使用稀疏內(nèi)存模型,這個位圖在結(jié)構(gòu)體mem_section中。*/unsigned long *pageblock_flags; #endif /* CONFIG_SPARSEMEM */} ____cacheline_internodealigned_in_smp;

每個分組頁塊在位圖中占用4位,其中3位用來存放頁塊的遷移類型。

include/linux/pageblock-flags.h

/* 影響一個頁塊的位索引 */ enum pageblock_bits {PB_migrate, // 0 ~ 2PB_migrate_end = PB_migrate + 3 - 1, /* 遷移類型需要3位 */PB_migrate_skip,/* 如果被設(shè)置,內(nèi)存碎片整理跳過這個頁塊。*/NR_PAGEBLOCK_BITS };

函數(shù) set_pageblock_migratetype()用來在頁塊標(biāo)志位圖中設(shè)置頁塊的遷移類型,函數(shù)get_pageblock_migratetype()用來獲取頁塊的遷移類型。
內(nèi)核在初始化時,把所有頁塊初始化為可移動類型,其他遷移類型的頁是盜用(被拿走)產(chǎn)生的。

mm/page_alloc.c
free_area_init_core() -> free_area_init_core() -> memmap_init() -> memmap_init_zone()

void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,unsigned long start_pfn, enum memmap_context context) {for (pfn = start_pfn; pfn < end_pfn; pfn++) {if (!(pfn & (pageblock_nr_pages - 1))) { /* 如果是分組頁塊的第一頁 */struct page *page = pfn_to_page(pfn);__init_single_page(page, pfn, zone, nid);set_pageblock_migratetype(page, MIGRATE_MOVABLE); // 設(shè)置遷移類型} else {__init_single_pfn(pfn, zone, nid);}} }

可以通過文件“/proc/pagetypeinfo”查看各種遷移類型的頁的分布情況。

每處理器頁集合(分配單頁優(yōu)化)

內(nèi)核針對分配單頁做了性能優(yōu)化,為了減少處理器之間的鎖競爭,在內(nèi)存區(qū)域增加 1個每處理器頁集合

include/linux/mmzone.h struct zone {struct per_cpu_pageset __percpu *pageset; /* 在每個處理器上有一個頁集合 */} ____cacheline_internodealigned_in_smp; struct per_cpu_pageset {struct per_cpu_pages pcp;}; struct per_cpu_pages {int count; /* 鏈表里面頁的數(shù)量 */int high; /* 如果頁的數(shù)量達到高水線,需要返還給伙伴分配器 */int batch; /* 批量添加或刪除的頁數(shù)量 */struct list_head lists[MIGRATE_PCPTYPES]; /* 每種遷移類型一個頁鏈表 */ };

內(nèi)存區(qū)域在每個處理器上有一個頁集合,頁集合中每種遷移類型有一個頁鏈表。

頁集合有高水線和批量值,頁集合中的頁數(shù)量不能超過高水線。申請單頁加入頁鏈表,或者從頁鏈表返還給伙伴分配器,都是采用批量操作,一次
操作的頁數(shù)量是批量值。

默認(rèn)的批量值batch的計算方法如下。
(1)batch = zone->managed_pages / 1024,其中zone->managed_pages是內(nèi)存區(qū)域中由伙伴分配器管理的頁數(shù)量。
(2)如果batch超過(512 * 1024) / PAGE_SIZE,那么把batch設(shè)置為(512 * 1024) / PAGE_SIZE,其中PAGE_SIZE是頁長度。
(3)batch = batch / 4。
(4)如果batch小于1,那么把batch設(shè)置為1。
(5)batch = rounddown_pow_of_two(batch * 1.5) ? 1,其中rounddown_pow_of_two()用來把數(shù)值向下對齊到2的n次冪。

默認(rèn)的高水線是批量值的6倍。

  • 可以通過文件“/proc/sys/vm/percpu_pagelist_fraction”修改比例值,最小值是8,默認(rèn)值是0。高水線等于(伙伴分配器管理的頁數(shù)量 / 比例值),同時把批量值設(shè)置為高水線的1/4。

從某個內(nèi)存區(qū)域申請某種遷移類型的單頁時,從當(dāng)前處理器的頁集合中該遷移類型的頁鏈表分配頁,如果頁鏈表是空的,先批量申請頁加入頁鏈表,然后分配一頁。

緩存熱頁是指剛剛訪問過物理頁,物理頁的數(shù)據(jù)還在處理器的緩存中。如果要申請緩存熱頁,從頁鏈表首部分配頁;如果要申請緩存冷頁,從頁鏈表尾部分配頁。

釋放單頁時,把頁加入當(dāng)前處理器的頁集合中。如果釋放緩存熱頁,加入頁鏈表首部;如果釋放緩存冷頁,加入頁鏈表尾部。如果頁集合中的頁數(shù)量大于或等于高水線,那么批量返還給伙伴分配器。

分配標(biāo)志位

分配頁的函數(shù)都帶一個分配標(biāo)志位參數(shù),分配標(biāo)志位分為以下5類(標(biāo)志位名稱中的GFP是Get Free Pages的縮寫)。

(1)區(qū)域修飾符:指定從哪個區(qū)域類型分配頁,“ 根據(jù)可移動性分組” 已經(jīng)描述了根據(jù)分配標(biāo)志得到首選區(qū)域類型的方法。

(2)頁移動性和位置提示:指定頁的遷移類型和從哪些內(nèi)存節(jié)點分配頁。

(3)高優(yōu)先級修飾符。

(4)回收修飾符。

(5)行動修飾符。
__GFP_COLD:調(diào)用者不期望分配的頁很快被使用,盡可能分配緩存冷頁(數(shù)據(jù)不在處理器的緩存中)。
__GFP_NOWARN:如果分配失敗,不要打印警告信息。
__GFP_COMP:把分配的頁塊組成復(fù)合頁(compound page)。
__GFP_ZERO:把頁用零初始化。

因為這些標(biāo)志位總是組合使用,所以內(nèi)核定義了一些標(biāo)志位組合。常用的標(biāo)志位組合如下。

(1)GFP_ATOMIC:原子分配,分配內(nèi)核使用的頁,不能睡眠。調(diào)用者是高優(yōu)先級的,允許異步回收頁。

(2)GFP_KERNEL:分配內(nèi)核使用的頁,可能睡眠。從低端內(nèi)存區(qū)域分配頁,允許異步回收頁和直接回收頁,允許讀寫存儲設(shè)備,允許調(diào)用到底層文件系統(tǒng)。

(3)GFP_NOWAIT:分配內(nèi)核使用的頁,不能等待。允許異步回收頁,不允許直接回收頁,不允許讀寫存儲設(shè)備,不允許調(diào)用到底層文件系統(tǒng)。

(4)GFP_NOIO:不允許讀寫存儲設(shè)備,允許異步回收頁和直接回收頁。
請盡量避免直接使用這個標(biāo)志位,應(yīng)該使用函數(shù)memalloc_noio_save和memalloc_noio_restore標(biāo)記一個不能讀寫存儲設(shè)備的范圍,前者設(shè)置進程標(biāo)志位PF_MEMALLOC_NOIO,后者清除進程標(biāo)志位PF_MEMALLOC_NOIO。

(5)GFP_NOFS:不允許調(diào)用到底層文件系統(tǒng),允許異步回收頁和直接回收頁,允許讀寫存儲設(shè)備。請盡量避免直接使用這個標(biāo)志位,應(yīng)該使用函數(shù)memalloc_nofs_save和memalloc_nofs_restore標(biāo)記一個不能調(diào)用到文件系統(tǒng)的范圍,前者設(shè)置進程標(biāo)志位PF_MEMALLOC_NOFS,后者清除進程標(biāo)志位PF_MEMALLOC_NOFS。

(6)GFP_USER:分配用戶空間使用的頁,內(nèi)核或硬件也可以直接訪問,從普通區(qū)域分配,允許異步回收頁和直接回收頁,允許讀寫存儲設(shè)備,允許調(diào)用到文件系統(tǒng),允許實施cpuset內(nèi)存分配策略。

(7)GFP_HIGHUSER:分配用戶空間使用的頁,內(nèi)核不需要直接訪問,從高端內(nèi)存區(qū)域分配,物理頁在使用的過程中不可以移動。

(9)GFP_TRANSHUGE_LIGHT:分配用戶空間使用的巨型頁,把分配的頁塊組成復(fù)合頁,禁止使用緊急保留內(nèi)存,禁止打印警告信息,不允許異步回收頁和直接回收頁。

(10)GFP_TRANSHUGE:分配用戶空間使用的巨型頁,和GFP_TRANSHUGE_LIGHT的區(qū)別是允許直接回收頁。

復(fù)合頁

如果設(shè)置了標(biāo)志位__GFP_COMP并且分配了一個階數(shù)大于0的頁塊,頁分配器會把頁塊組成復(fù)合頁(compound page)。復(fù)合頁最常見的用處是創(chuàng)建巨型頁。

復(fù)合頁的第一頁叫首頁(head page),其他頁都叫尾頁(tail page)。一個由n階頁塊組成的復(fù)合頁的結(jié)構(gòu)如圖3.19所示。

(1)首頁設(shè)置標(biāo)志PG_head。

(2)第一個尾頁的成員compound_mapcount表示復(fù)合頁的映射計數(shù),即多少個虛擬頁映射到這個物理頁,初始值是?1。這個成員和成員mapping組成一個聯(lián)合體,占用相同的位置,其他尾頁把成員mapping設(shè)置為一個有毒的地址。

(3)第一個尾頁的成員 compound_dtor 存放復(fù)合頁釋放函數(shù)數(shù)組的索引,成員compound_order存放復(fù)合頁的階數(shù)n。這兩個成員和成員lru.prev占用相同的位置。

(4)所有尾頁的成員compound_head存放首頁的地址,并且把最低位設(shè)置為1。這個成員和成員lru.next占用相同的位置。判斷一個頁是復(fù)合頁的成員的方法是:頁設(shè)置了標(biāo)志位PG_head(針對首頁),或者頁的成員compound_head的最低位是1(針對尾頁)。

include/linux/mm_types.h

結(jié)構(gòu)體page中復(fù)合頁的成員如下:

struct page {unsigned long flags;union {struct address_space *mapping;atomic_t compound_mapcount; /* 映射計數(shù),第一個尾頁 *//* page_deferred_list().next -- 第二個尾頁 */};union {struct list_head lru;/* 復(fù)合頁的尾頁 */struct {unsigned long compound_head; /* 首頁的地址,并且設(shè)置最低位 *//* 第一個尾頁 */ #ifdef CONFIG_64BITunsigned int compound_dtor; /* 復(fù)合頁釋放函數(shù)數(shù)組的索引 */unsigned int compound_order; /* 復(fù)合頁的階數(shù) */ #elseunsigned short int compound_dtor;unsigned short int compound_order;#endif};};}

對高階原子分配的優(yōu)化處理(MIGRATE_HIGHATOMIC)

高階原子分配:階數(shù)大于0,并且調(diào)用者設(shè)置了分配標(biāo)志位__GFP_ATOMIC,要求不能睡眠。

頁分配器對高階原子分配做了優(yōu)化處理==(保留一些頁專門供其分配加快分配速度)==,增加了高階原子類型(MIGRATE_HIGHATOMIC),在內(nèi)存區(qū)域的結(jié)構(gòu)體中增加1個成員“nr_reserved_highatomic”,用來記錄高階原子類型的總頁數(shù),并且限制其數(shù)量:zone->nr_reserved_highatomic < (zone->managed_pages / 100) + pageblock_nr_pages,即必須小于(伙伴分配器管理的總頁數(shù) / 100 + 分組階數(shù)對應(yīng)的頁數(shù))。

include/linux/mmzone.h

struct zone {unsigned long nr_reserved_highatomic;} ____cacheline_internodealigned_in_smp;

執(zhí)行高階原子分配時,先從高階原子類型分配頁,如果分配失敗,從調(diào)用者指定的遷移類型分配頁。分配成功以后,如果內(nèi)存區(qū)域中高階原子類型的總頁數(shù)小于限制,并且頁塊的遷移類型不是高階原子類型、隔離類型和CMA遷移類型,那么把頁塊的遷移類型轉(zhuǎn)換為高階原子類型,并且把頁塊中沒有分配出去的頁移到高階原子類型的空閑鏈表中。

當(dāng)內(nèi)存嚴(yán)重不足時,直接回收頁以后仍然分配失敗,針對高階原子類型的頁數(shù)超過pageblock_nr_pages的目標(biāo)區(qū)域,把高階原子類型的頁塊轉(zhuǎn)換成申請的遷移類型,然后重試分配,其代碼如下:

mm/page_alloc.c

static inline struct page * __alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,unsigned int alloc_flags, const struct alloc_context *ac,unsigned long *did_some_progress) {struct page *page = NULL;bool drained = false;*did_some_progress = __perform_reclaim(gfp_mask, order, ac);/* 直接回收頁 */if (unlikely(!(*did_some_progress)))return NULL; retry:page = get_page_from_freelist(gfp_mask, order, alloc_flags, ac);if (!page && !drained) {/* 把高階原子類型的頁塊轉(zhuǎn)換成申請的遷移類型 */unreserve_highatomic_pageblock(ac, false);drain_all_pages(NULL);drained = true;goto retry;}return page; }

如果直接回收頁沒有進展超過16次,那么針對目標(biāo)區(qū)域,不再為高階原子分配保留頁,把高階原子類型的頁塊轉(zhuǎn)換成申請的遷移類型,其代碼如下

mm/page_alloc.c

static inline bool should_reclaim_retry(gfp_t gfp_mask, unsigned order,struct alloc_context *ac, int alloc_flags,bool did_some_progress, int *no_progress_loops) {if (did_some_progress && order <= PAGE_ALLOC_COSTLY_ORDER)*no_progress_loops = 0;else(*no_progress_loops)++;if (*no_progress_loops > MAX_RECLAIM_RETRIES) {/* 在調(diào)用內(nèi)存耗盡殺手之前,用完為高階原子分配保留的頁 */return unreserve_highatomic_pageblock(ac, true);}}

分配頁

分配接口

頁分配器提供了以下分配頁的接口。

(1)alloc_pages(gfp_mask, order)請求分配一個階數(shù)為order的頁塊,返回一個page實例。

(2)alloc_page(gfp_mask)是函數(shù)alloc_pages在階數(shù)為0情況下的簡化形式,只分配一頁。

(3)__get_free_pages(gfp_mask, order)對函數(shù)alloc_pages做了封裝,只能從低端內(nèi)存區(qū)域分配頁,并且返回虛擬地址。

(4)__get_free_page(gfp_mask)是函數(shù)__get_free_pages在階數(shù)為0情況下的簡化形式,只分配一頁。

(5)get_zeroed_page(gfp_mask)是函數(shù)__get_free_pages在為參數(shù)gfp_mask設(shè)置了標(biāo)志位__GFP_ZERO且階數(shù)為0情況下的簡化形式,只分配一頁,并且用零初始化。

核心函數(shù)的實現(xiàn)__alloc_pages_nodemask

在Linux內(nèi)核中,所有分配頁的函數(shù)最終都會調(diào)用到__alloc_pages_nodemask,此函數(shù)被稱為分區(qū)的伙伴分配器的心臟

struct page *__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, struct zonelist *zonelist, nodemask_t *nodemask)

(1)gfp_mask:分配標(biāo)志位。
(2)order:階數(shù)。
(3)zonelist:首選內(nèi)存節(jié)點的備用區(qū)域列表。如果指定了標(biāo)志位__GFP_THISNODE,選擇pg_data_t.node_zonelists[ZONELIST_NOFALLBACK],否則選擇
pg_data_t.node_zonelists [ZONELIST_FALLBACK]。
(4)nodemask:允許從哪些內(nèi)存節(jié)點分配頁,如果調(diào)用者沒有要求,可以傳入空指針

算法流程:

1、根據(jù)分配標(biāo)志位得到首選區(qū)域類型和遷移類型;

2、執(zhí)行快速路徑,使用低水線嘗試第一次分配;

3、如果快速路徑分配失敗,才執(zhí)行慢速路徑

頁分配器內(nèi)部的標(biāo)志位:

mm\internal.h

/* The ALLOC_WMARK bits are used as an index to zone->watermark */ #define ALLOC_WMARK_MIN WMARK_MIN // 使用最低水線 #define ALLOC_WMARK_LOW WMARK_LOW // 低水線 #define ALLOC_WMARK_HIGH WMARK_HIGH // 高水線 #define ALLOC_NO_WATERMARKS 0x04 // 完全不檢查水線/* Mask to get the watermark bits */ #define ALLOC_WMARK_MASK (ALLOC_NO_WATERMARKS-1) // 得到水線位的掩碼#define ALLOC_HARDER 0x10 // 試圖更努力分配 #define ALLOC_HIGH 0x20 // 調(diào)用者是高優(yōu)先級 #define ALLOC_CPUSET 0x40 // 檢查cpuset是否允許進程從某個內(nèi)存節(jié)點分配頁 #define ALLOC_CMA 0x80 // 允許從CMA(連續(xù)內(nèi)存分配器)遷移類型分配

快速分配 get_page_from_freelist

/** get_page_from_freelist goes through the zonelist trying to allocate* a page.*/ static struct page * get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,const struct alloc_context *ac) {struct zoneref *z = ac->preferred_zoneref;struct zone *zone;struct pglist_data *last_pgdat_dirty_limit = NULL;/*掃描備用區(qū)域列表中每個滿足條件的區(qū)域:區(qū)域類型小于或等待首選區(qū)域類型,并且內(nèi)存節(jié)點在節(jié)點掩碼中的相應(yīng)位被設(shè)置處理。*/for_next_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high_zoneidx,ac->nodemask) {struct page *page;unsigned long mark;/*如果編譯了cpuset功能,調(diào)用者設(shè)置ALLOC_CPUSET要求使用cpuset檢查,并且cpuset不允許當(dāng)前進程從這個內(nèi)存節(jié)點分配,那么不能從這個區(qū)域分配頁*/if (cpusets_enabled() &&(alloc_flags & ALLOC_CPUSET) &&!__cpuset_zone_allowed(zone, gfp_mask))continue;/*如果調(diào)用者設(shè)置標(biāo)志位_GFP_MRITE,表示文件系統(tǒng)申請分配一個頁頁緩存頁用來寫文件,那么檢查內(nèi)存節(jié)點的臟頁數(shù)量是否超過限制。如果超過就不能從這個區(qū)域分配頁*/if (ac->spread_dirty_pages) {if (last_pgdat_dirty_limit == zone->zone_pgdat)continue;if (!node_dirty_ok(zone->zone_pgdat)) {last_pgdat_dirty_limit = zone->zone_pgdat;continue;}}/* 檢查水線,如果(區(qū)域的空閑頁數(shù) - 申請的頁數(shù))小于水線 */mark = zone->watermark[alloc_flags & ALLOC_WMARK_MASK];if (!zone_watermark_fast(zone, order, mark,ac_classzone_idx(ac), alloc_flags)) {int ret;/* Checked here to keep the fast path fast */BUILD_BUG_ON(ALLOC_NO_WATERMARKS < NR_WMARK);if (alloc_flags & ALLOC_NO_WATERMARKS)goto try_this_zone;/* 如果沒有開啟節(jié)點回收功能,或者當(dāng)前節(jié)點和首選節(jié)點之間的距離大于回收距離,不能從這個區(qū)域分配頁 */if (node_reclaim_mode == 0 ||!zone_allows_reclaim(ac->preferred_zoneref->zone, zone))continue;/* 從節(jié)點回收沒有映射到里進程虛擬地址空間的文件頁的塊分配器申請的頁,然后重新檢查水線, */ret = node_reclaim(zone->zone_pgdat, gfp_mask, order);switch (ret) {case NODE_RECLAIM_NOSCAN:/* did not scan */continue;case NODE_RECLAIM_FULL:/* scanned but unreclaimable */continue;default:/* did we reclaim enough */if (zone_watermark_ok(zone, order, mark,ac_classzone_idx(ac), alloc_flags))goto try_this_zone;continue;}}try_this_zone:/* 直接從當(dāng)前區(qū)域分配頁,調(diào)用rmqueue來分配 */page = rmqueue(ac->preferred_zoneref->zone, zone, order,gfp_mask, alloc_flags, ac->migratetype);// 如果分配成功,調(diào)用函數(shù)prep_new_page以初始化頁。如果是高階原子分配,并且區(qū)域中高階原子類型的頁數(shù)沒有超過限制,那么把分配的頁所屬的頁塊轉(zhuǎn)換為高階原子類型。if (page) {prep_new_page(page, order, gfp_mask, alloc_flags);/** If this is a high-order atomic allocation then check* if the pageblock should be reserved for the future*/if (unlikely(order && (alloc_flags & ALLOC_HARDER)))reserve_highatomic_pageblock(page, zone, order);return page;}}return NULL; }

慢速分配 __alloc_pages_slowpath

如果低水線分配失敗,則執(zhí)行慢速路徑,慢速路徑是在函數(shù)__alloc_pages_slowpath中實現(xiàn)的,執(zhí)行流程如下圖

1)如果允許異步回收頁,那么針對每個目標(biāo)區(qū)域,喚醒區(qū)域所屬內(nèi)存節(jié)點的頁回收線程。
2)使用最低水線嘗試分配。
3)針對申請階數(shù)大于0:如果允許直接回收頁,那么執(zhí)行異步模式的內(nèi)存碎片整理,然后嘗試分配。
4)如果調(diào)用者承諾“給我少量緊急保留內(nèi)存使用,我可以釋放更多的內(nèi)存”,那么在忽略水線的情況下嘗試分配。
5)直接回收頁,然后嘗試分配。
6)針對申請階數(shù)大于0:執(zhí)行同步模式的內(nèi)存碎片整理,然后嘗試分配。
7)如果多次嘗試直接回收頁和同步模式的內(nèi)存碎片整理,仍然分配失敗,那么使用殺傷力比較大的內(nèi)存耗盡殺手選擇一個進程殺死,然后嘗試分配。

頁分配器認(rèn)為階數(shù)大于3是昂貴的分配,有些地方做了特殊處理。

static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,struct alloc_context *ac) {bool can_direct_reclaim = gfp_mask & __GFP_DIRECT_RECLAIM;const bool costly_order = order > PAGE_ALLOC_COSTLY_ORDER;struct page *page = NULL;unsigned int alloc_flags;unsigned long did_some_progress;enum compact_priority compact_priority;enum compact_result compact_result;int compaction_retries;int no_progress_loops;unsigned long alloc_start = jiffies;unsigned int stall_timeout = 10 * HZ;unsigned int cpuset_mems_cookie;// 申請階數(shù)不能超過頁分配器支持的最大分配階if (order >= MAX_ORDER) {WARN_ON_ONCE(!(gfp_mask & __GFP_NOWARN));return NULL;}/** We also sanity check to catch abuse of atomic reserves being used by* callers that are not in atomic context.*/if (WARN_ON_ONCE((gfp_mask & (__GFP_ATOMIC|__GFP_DIRECT_RECLAIM)) ==(__GFP_ATOMIC|__GFP_DIRECT_RECLAIM)))gfp_mask &= ~__GFP_ATOMIC;retry_cpuset:compaction_retries = 0;no_progress_loops = 0;compact_priority = DEF_COMPACT_PRIORITY;/* 后面可能檢查cpuset是否允許當(dāng)前進程從哪些內(nèi)存節(jié)點申請頁,需要讀當(dāng)前進程的成員mems_allowed,使用順序鎖保護 */cpuset_mems_cookie = read_mems_allowed_begin();/** The fast path uses conservative alloc_flags to succeed only until* kswapd needs to be woken up, and to avoid the cost of setting up* alloc_flags precisely. So we do that now.*/// 把分配標(biāo)志位轉(zhuǎn)換成內(nèi)部分配標(biāo)志位alloc_flags = gfp_to_alloc_flags(gfp_mask);/** We need to recalculate the starting point for the zonelist iterator* because we might have used different nodemask in the fast path, or* there was a cpuset modification and we are retrying - otherwise we* could end up iterating over non-eligible zones endlessly.*/// 獲取首選的內(nèi)存區(qū)域ac->preferred_zoneref = first_zones_zonelist(ac->zonelist,ac->high_zoneidx, ac->nodemask);if (!ac->preferred_zoneref->zone)goto nopage;// 異步回收頁,喚醒頁回收機制if (gfp_mask & __GFP_KSWAPD_RECLAIM)wake_all_kswapds(order, ac);/** The adjusted alloc_flags might result in immediate success, so try* that first*/// 使用最低水線分配頁page = get_page_from_freelist(gfp_mask, order, alloc_flags, ac);if (page)goto got_pg;/** For costly allocations, try direct compaction first, as it's likely* that we have enough base pages and don't need to reclaim. For non-* movable high-order allocations, do that as well, as compaction will* try prevent permanent fragmentation by migrating from blocks of the* same migratetype.* Don't try this for allocations that are allowed to ignore* watermarks, as the ALLOC_NO_WATERMARKS attempt didn't yet happen.*/// 針對申請的階數(shù)大于0,滿足3個條件 if (can_direct_reclaim &&(costly_order ||(order > 0 && ac->migratetype != MIGRATE_MOVABLE))&& !gfp_pfmemalloc_allowed(gfp_mask)) {page = __alloc_pages_direct_compact(gfp_mask, order,alloc_flags, ac,INIT_COMPACT_PRIORITY,&compact_result);if (page)goto got_pg;/** Checks for costly allocations with __GFP_NORETRY, which* includes THP page fault allocations*/if (costly_order && (gfp_mask & __GFP_NORETRY)) {/** If compaction is deferred for high-order allocations,* it is because sync compaction recently failed. If* this is the case and the caller requested a THP* allocation, we do not want to heavily disrupt the* system, so we fail the allocation instead of entering* direct reclaim.*/if (compact_result == COMPACT_DEFERRED)goto nopage;/** Looks like reclaim/compaction is worth trying, but* sync compaction could be very expensive, so keep* using async compaction.*/compact_priority = INIT_COMPACT_PRIORITY;}}retry:/* Ensure kswapd doesn't accidentally go to sleep as long as we loop */// 確保頁回收線程在我們循環(huán)的時候不會意外地睡眠if (gfp_mask & __GFP_KSWAPD_RECLAIM)wake_all_kswapds(order, ac);if (gfp_pfmemalloc_allowed(gfp_mask))alloc_flags = ALLOC_NO_WATERMARKS;/** Reset the zonelist iterators if memory policies can be ignored.* These allocations are high priority and system rather than user* orientated.*/if (!(alloc_flags & ALLOC_CPUSET) || (alloc_flags & ALLOC_NO_WATERMARKS)) {ac->zonelist = node_zonelist(numa_node_id(), gfp_mask);ac->preferred_zoneref = first_zones_zonelist(ac->zonelist,ac->high_zoneidx, ac->nodemask);}/* Attempt with potentially adjusted zonelist and alloc_flags */// 使用可能調(diào)整過的區(qū)域列表和分配標(biāo)志page = get_page_from_freelist(gfp_mask, order, alloc_flags, ac);if (page)goto got_pg;/* Caller is not willing to reclaim, we can't balance anything */if (!can_direct_reclaim)goto nopage;/* Make sure we know about allocations which stall for too long */if (time_after(jiffies, alloc_start + stall_timeout)) {warn_alloc(gfp_mask & ~__GFP_NOWARN, ac->nodemask,"page allocation stalls for %ums, order:%u",jiffies_to_msecs(jiffies-alloc_start), order);stall_timeout += 10 * HZ;}/* Avoid recursion of direct reclaim */if (current->flags & PF_MEMALLOC)goto nopage;/* Try direct reclaim and then allocating */// 直接回收頁page = __alloc_pages_direct_reclaim(gfp_mask, order, alloc_flags, ac,&did_some_progress);if (page)goto got_pg;/* Try direct compaction and then allocating */// 針對申請階數(shù)大于0,執(zhí)行同步的內(nèi)存碎片整理page = __alloc_pages_direct_compact(gfp_mask, order, alloc_flags, ac,compact_priority, &compact_result);if (page)goto got_pg;/* Do not loop if specifically requested */// 如果調(diào)用者不要求重試,則放棄if (gfp_mask & __GFP_NORETRY)goto nopage;/** Do not retry costly high order allocations unless they are* __GFP_REPEAT*/if (costly_order && !(gfp_mask & __GFP_REPEAT))goto nopage;if (should_reclaim_retry(gfp_mask, order, ac, alloc_flags,did_some_progress > 0, &no_progress_loops))goto retry;/** It doesn't make any sense to retry for the compaction if the order-0* reclaim is not able to make any progress because the current* implementation of the compaction depends on the sufficient amount* of free memory (see __compaction_suitable)*/// 申請階數(shù)大于0: 判斷是否應(yīng)該重試內(nèi)存碎片整理if (did_some_progress > 0 &&should_compact_retry(ac, order, alloc_flags,compact_result, &compact_priority,&compaction_retries))goto retry;/** It's possible we raced with cpuset update so the OOM would be* premature (see below the nopage: label for full explanation).*/// 如果cpuset修改允許當(dāng)前進程從那些內(nèi)存節(jié)點申請頁if (read_mems_allowed_retry(cpuset_mems_cookie))goto retry_cpuset;/* Reclaim has failed us, start killing things */// 使用內(nèi)存耗盡殺手選擇一個進程殺死page = __alloc_pages_may_oom(gfp_mask, order, ac, &did_some_progress);if (page)goto got_pg;/* Avoid allocations with no watermarks from looping endlessly */// 如果當(dāng)前進程正在被內(nèi)存耗盡殺手殺死,并且忽略水線或者不允緊急保留內(nèi)存if (test_thread_flag(TIF_MEMDIE) &&(alloc_flags == ALLOC_NO_WATERMARKS ||(gfp_mask & __GFP_NOMEMALLOC)))goto nopage;/* Retry as long as the OOM killer is making progress */// 如果內(nèi)存耗盡殺手取得進展,則重試if (did_some_progress) {no_progress_loops = 0;goto retry;}nopage:/** When updating a task's mems_allowed or mempolicy nodemask, it is* possible to race with parallel threads in such a way that our* allocation can fail while the mask is being updated. If we are about* to fail, check if the cpuset changed during allocation and if so,* retry.*/if (read_mems_allowed_retry(cpuset_mems_cookie))goto retry_cpuset;/** Make sure that __GFP_NOFAIL request doesn't leak out and make sure* we always retry*/if (gfp_mask & __GFP_NOFAIL) {/** All existing users of the __GFP_NOFAIL are blockable, so warn* of any new users that actually require GFP_NOWAIT*/if (WARN_ON_ONCE(!can_direct_reclaim))goto fail;/** PF_MEMALLOC request from this context is rather bizarre* because we cannot reclaim anything and only can loop waiting* for somebody to do a work for us*/WARN_ON_ONCE(current->flags & PF_MEMALLOC);/** non failing costly orders are a hard requirement which we* are not prepared for much so let's warn about these users* so that we can identify them and convert them to something* else.*/WARN_ON_ONCE(order > PAGE_ALLOC_COSTLY_ORDER);/** Help non-failing allocations by giving them access to memory* reserves but do not use ALLOC_NO_WATERMARKS because this* could deplete whole memory reserves which would just make* the situation worse*/page = __alloc_pages_cpuset_fallback(gfp_mask, order, ALLOC_HARDER, ac);if (page)goto got_pg;cond_resched();goto retry;} fail:warn_alloc(gfp_mask, ac->nodemask,"page allocation failure: order:%u", order); got_pg:return page; }

釋放頁

在CPU 訪問內(nèi)存時,因于這個操作比較慢,為了加快速度,
根據(jù)本地性原則,CPU在訪問主內(nèi)存時的時候會把附近的一塊數(shù)據(jù)都加載到CPU 的Cache 里,之后讀這與這塊數(shù)據(jù)都是在Cache 里做。

Linux 本來有伙伴系統(tǒng)分配內(nèi)存頁,為了加快單個內(nèi)存頁的分配
Linux 在每個 inode 里 為每個CPU 分配了一個per_cpu_pageset (暫且叫頁緩存吧)。
每個 頁緩存包含一個冷頁緩存 和 一個熱頁緩存。

  • 如果申請完一個內(nèi)存頁就立即用來寫數(shù)據(jù),用熱頁緩存。
  • 如果申請完一個內(nèi)存頁,暫時用不到 或者 給 DMA用,用冷頁緩存。
  • 這主要是因為 內(nèi)核 用free_page 釋放單個內(nèi)存頁的時候會調(diào)用 free_hot_page。
    剛釋放的內(nèi)存頁大概率還在CPU 的Cache 里,也就是說熱頁緩存里的頁很可能還在CPU 的 Cache里,
    所以申請熱頁緩存并且立即使用會直接訪問 CPU 的Cache 速度會比較快。

    頁分配器提供釋放頁的接口:

    (1)void __free_pages(struct page *page, unsigned int order),第一個參數(shù)是第一個物理頁的page實例的地址,第二個參數(shù)是階數(shù)。

    (2)void free_pages(unsigned long addr, unsigned int order),第一個參數(shù)是第一個物理頁的起始內(nèi)核虛擬地址,第二個參數(shù)是階數(shù)。

    函數(shù)__free_pages的代碼如下:

    void __free_pages(struct page *page, unsigned int order) {// 引用計數(shù)減一,為0 執(zhí)行操作if (put_page_testzero(page)) {if (order == 0)free_hot_cold_page(page, false); // 返還給伙伴分配器else__free_pages_ok(page, order); // 返還} }

    首先把頁的引用計數(shù)減1,只有頁的引用計數(shù)變成零,才真正釋放頁:如果階數(shù)是0,不還給伙伴分配器,而是當(dāng)作緩存熱頁添加到每處理器頁集合中;如果階數(shù)大于0,調(diào)用函數(shù)__free_pages_ok以釋放頁。

    free_hot_cold_page

    函數(shù)free_hot_cold_page把一頁添加到每處理器頁集合中,如果頁集合中的頁數(shù)量大于或等于高水線,那么批量返還給伙伴分配器。第二個參數(shù)cold表示緩存冷熱程度,主動釋放的頁作為緩存熱頁,回收的頁作為緩存冷頁,因為回收的是最近最少使用的頁。

    mm/page_alloc.c void free_hot_cold_page(struct page *page, bool cold) {struct zone *zone = page_zone(page);struct per_cpu_pages *pcp;unsigned long flags;unsigned long pfn = page_to_pfn(page);int migratetype;if (!free_pcp_prepare(page))return;migratetype = get_pfnblock_migratetype(page, pfn);/* 得到頁所屬頁塊的遷移類型 */set_pcppage_migratetype(page, migratetype);/* page->index保存真實的遷移類型 */local_irq_save(flags);__count_vm_event(PGFREE);/** 每處理器集合只存放不可移動、可回收和可移動這3種類型的頁,* 如果頁的類型不是這3種類型,處理方法是:* (1)如果是隔離類型的頁,不需要添加到每處理器頁集合,直接釋放;* (2)其他類型的頁添加到可移動類型鏈表中,page->index保存真實的遷移類型。*/if (migratetype >= MIGRATE_PCPTYPES) {if (unlikely(is_migrate_isolate(migratetype))) {free_one_page(zone, page, pfn, 0, migratetype);goto out;}migratetype = MIGRATE_MOVABLE;}/* 添加到對應(yīng)遷移類型的鏈表中,如果是緩存熱頁,添加到首部,否則添加到尾部 */pcp = &this_cpu_ptr(zone->pageset)->pcp;if (!cold)list_add(&page->lru, &pcp->lists[migratetype]);elselist_add_tail(&page->lru, &pcp->lists[migratetype]);pcp->count++;/* 如果頁集合中的頁數(shù)量大于或等于高水線,那么批量返還給伙伴分配器 */if (pcp->count >= pcp->high) {unsigned long batch = READ_ONCE(pcp->batch);free_pcppages_bulk(zone, batch, pcp);pcp->count -= batch;} out:local_irq_restore(flags); }

    __free_pages_ok

    函數(shù)__free_pages_ok負(fù)責(zé)釋放階數(shù)大于 0 的頁塊,最終調(diào)用到釋放頁的核心函數(shù)__free_one_page,算法是:如果伙伴是空閑的,并且伙伴在同一個內(nèi)存區(qū)域,那么和伙伴合并,注意隔離類型的頁塊和其他類型的頁塊不能合并。算法還做了優(yōu)化處理:

    假設(shè)最后合并成的頁塊階數(shù)是order,如果order小于(MAX_ORDER?2),則檢查(order+1)階的伙伴是否空閑,如果空閑,那么order階的伙伴可能正在釋放,很快就可以合并成(order+2)階的頁塊。為了防止當(dāng)前頁塊很快被分配出去,把當(dāng)前頁塊添加到空閑鏈表的尾部。

    mm/page_alloc.c __free_pages_ok() -> free_one_page() -> __free_one_page() static inline void __free_one_page(struct page *page,unsigned long pfn,struct zone *zone, unsigned int order,int migratetype) {unsigned long combined_pfn;unsigned long uninitialized_var(buddy_pfn);struct page *buddy;unsigned int max_order;/* pageblock_order是按可移動性分組的階數(shù) */max_order = min_t(unsigned int, MAX_ORDER, pageblock_order + 1);…continue_merging:/*如果伙伴是空閑的,和伙伴合并,重復(fù)這個操作直到階數(shù)等于(max_order-1)。*/while (order < max_order - 1) {buddy_pfn = __find_buddy_pfn(pfn, order);/* 得到伙伴的起始物理頁號 */buddy = page + (buddy_pfn - pfn); /* 得到伙伴的第一頁的page實例 */if (!pfn_valid_within(buddy_pfn))goto done_merging;/* 檢查伙伴是空閑的并且在相同的內(nèi)存區(qū)域 */if (!page_is_buddy(page, buddy, order))goto done_merging;/** 開啟了調(diào)試頁分配的配置宏CONFIG_DEBUG_PAGEALLOC,伙伴充當(dāng)警戒頁。*/if (page_is_guard(buddy)) {clear_page_guard(zone, buddy, order, migratetype);} else {/* 伙伴是空閑的,把伙伴從空閑鏈表中刪除 */list_del(&buddy->lru);zone->free_area[order].nr_free--;rmv_page_order(buddy);}combined_pfn = buddy_pfn & pfn;page = page + (combined_pfn - pfn);pfn = combined_pfn;order++;}if (max_order < MAX_ORDER) {/** 運行到這里,意味著階數(shù)大于或等于分組階數(shù)pageblock_order,* 阻止把隔離類型的頁塊和其他類型的頁塊合并*/if (unlikely(has_isolate_pageblock(zone))) {int buddy_mt;buddy_pfn = __find_buddy_pfn(pfn, order);buddy = page + (buddy_pfn - pfn);buddy_mt = get_pageblock_migratetype(buddy);/*如果一個是隔離類型的頁塊,另一個是其他類型的頁塊,不能合并 */if (migratetype != buddy_mt&& (is_migrate_isolate(migratetype) ||is_migrate_isolate(buddy_mt)))goto done_merging;}/* 如果兩個都是隔離類型的頁塊,或者都是其他類型的頁塊,那么繼續(xù)合并 */max_order++;goto continue_merging;} done_merging:set_page_order(page, order);/** 最后合并成的頁塊階數(shù)是order,如果order小于(MAX_ORDER-2),* 則檢查(order+1)階的伙伴是否空閑,如果空閑,那么order階的伙伴可能正在釋放,* 很快就可以合并成(order+2)階的頁塊。為了防止當(dāng)前頁塊很快被分配出去,* 把當(dāng)前頁塊添加到空閑鏈表的尾部*/if ((order < MAX_ORDER-2) && pfn_valid_within(buddy_pfn)) {struct page *higher_page, *higher_buddy;combined_pfn = buddy_pfn & pfn;higher_page = page + (combined_pfn - pfn);buddy_pfn = __find_buddy_pfn(combined_pfn, order + 1);higher_buddy = higher_page + (buddy_pfn - combined_pfn);if (pfn_valid_within(buddy_pfn) &&page_is_buddy(higher_page, higher_buddy, order + 1)) {list_add_tail(&page->lru,&zone->free_area[order].free_list[migratetype]);goto out;}}/* 添加到空閑鏈表的首部 */list_add(&page->lru, &zone->free_area[order].free_list[migratetype]); out:zone->free_area[order].nr_free++; }

    總結(jié)

    以上是生活随笔為你收集整理的伙伴分配器的内核实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    人人妻人人澡人人爽人人精品浪潮 | 亚洲国产精品一区二区第一页 | 国产乱人伦偷精品视频 | 樱花草在线社区www | 亚洲成a人片在线观看无码3d | 国产熟妇另类久久久久 | av无码不卡在线观看免费 | 久久国产自偷自偷免费一区调 | 中国女人内谢69xxxx | a国产一区二区免费入口 | 国产精品久久久午夜夜伦鲁鲁 | 荫蒂被男人添的好舒服爽免费视频 | 中文字幕乱码亚洲无线三区 | 国产成人人人97超碰超爽8 | 中文字幕人成乱码熟女app | 欧美大屁股xxxxhd黑色 | 欧美日韩一区二区三区自拍 | 久久天天躁夜夜躁狠狠 | 色综合天天综合狠狠爱 | 伊人久久大香线焦av综合影院 | 国产农村乱对白刺激视频 | 在线看片无码永久免费视频 | 色欲av亚洲一区无码少妇 | 又粗又大又硬又长又爽 | 精品人妻人人做人人爽夜夜爽 | 久久人人爽人人爽人人片av高清 | 乌克兰少妇性做爰 | √8天堂资源地址中文在线 | 精品偷拍一区二区三区在线看 | 国产精品理论片在线观看 | 九月婷婷人人澡人人添人人爽 | 狠狠躁日日躁夜夜躁2020 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 夜夜躁日日躁狠狠久久av | 国内精品一区二区三区不卡 | 亚洲国产成人av在线观看 | 清纯唯美经典一区二区 | 精品国产精品久久一区免费式 | 国产在线aaa片一区二区99 | 久久国产精品二国产精品 | 欧美丰满老熟妇xxxxx性 | 99久久精品无码一区二区毛片 | 少女韩国电视剧在线观看完整 | 丰满护士巨好爽好大乳 | 性欧美疯狂xxxxbbbb | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品国产品国语在线观看 | 伦伦影院午夜理论片 | 国产乱人伦av在线无码 | 国产一区二区三区精品视频 | 国产成人一区二区三区在线观看 | 呦交小u女精品视频 | 老太婆性杂交欧美肥老太 | 国产精品美女久久久 | 亚洲成a人一区二区三区 | 国产偷抇久久精品a片69 | 欧美自拍另类欧美综合图片区 | 无码av免费一区二区三区试看 | 麻花豆传媒剧国产免费mv在线 | 狠狠躁日日躁夜夜躁2020 | 国产成人无码区免费内射一片色欲 | 性欧美熟妇videofreesex | 久久精品一区二区三区四区 | 国产精品无码一区二区桃花视频 | 老熟女重囗味hdxx69 | 国产精品毛片一区二区 | 乱码av麻豆丝袜熟女系列 | 亚洲精品成人福利网站 | 初尝人妻少妇中文字幕 | 婷婷色婷婷开心五月四房播播 | 人妻aⅴ无码一区二区三区 | 精品国产麻豆免费人成网站 | 无码纯肉视频在线观看 | 国产真实夫妇视频 | 免费看男女做好爽好硬视频 | 欧美熟妇另类久久久久久多毛 | 九月婷婷人人澡人人添人人爽 | 精品久久久中文字幕人妻 | 久久99精品久久久久久 | 麻豆国产人妻欲求不满谁演的 | 色婷婷久久一区二区三区麻豆 | 亚洲va欧美va天堂v国产综合 | 99久久久无码国产aaa精品 | 中文字幕无码日韩欧毛 | 精品一区二区三区无码免费视频 | 亚洲国产成人a精品不卡在线 | 色一情一乱一伦一视频免费看 | 一二三四在线观看免费视频 | 欧美性生交活xxxxxdddd | 内射老妇bbwx0c0ck | 欧美激情一区二区三区成人 | 精品国产精品久久一区免费式 | 久久婷婷五月综合色国产香蕉 | 国产69精品久久久久app下载 | 又大又黄又粗又爽的免费视频 | 人妻有码中文字幕在线 | 在线成人www免费观看视频 | 久青草影院在线观看国产 | 国产成人无码av一区二区 | 精品厕所偷拍各类美女tp嘘嘘 | 未满小14洗澡无码视频网站 | www一区二区www免费 | 亚洲中文字幕无码中文字在线 | 免费无码肉片在线观看 | 久久国产36精品色熟妇 | 亚洲色欲色欲天天天www | 丰满人妻被黑人猛烈进入 | 国产莉萝无码av在线播放 | 少妇人妻大乳在线视频 | 亚洲热妇无码av在线播放 | 帮老师解开蕾丝奶罩吸乳网站 | 无码福利日韩神码福利片 | 99久久精品日本一区二区免费 | 偷窥日本少妇撒尿chinese | 国产亚av手机在线观看 | 窝窝午夜理论片影院 | 天天拍夜夜添久久精品大 | 国产精品欧美成人 | 熟妇人妻激情偷爽文 | 亚洲国产午夜精品理论片 | 欧美三级不卡在线观看 | 亚洲国产精品久久人人爱 | 中文字幕人妻无码一区二区三区 | 兔费看少妇性l交大片免费 | 国产精品鲁鲁鲁 | 久久精品国产一区二区三区肥胖 | 色综合久久久无码中文字幕 | 色欲久久久天天天综合网精品 | 亚洲の无码国产の无码步美 | 巨爆乳无码视频在线观看 | 97精品人妻一区二区三区香蕉 | 国产网红无码精品视频 | 波多野结衣av一区二区全免费观看 | 国产一精品一av一免费 | 人人妻人人澡人人爽欧美精品 | 强伦人妻一区二区三区视频18 | 精品欧洲av无码一区二区三区 | 欧美丰满熟妇xxxx | 色综合久久久无码网中文 | 久久久久久久人妻无码中文字幕爆 | 在线精品国产一区二区三区 | 欧美第一黄网免费网站 | 免费观看又污又黄的网站 | 成年美女黄网站色大免费全看 | 国产偷国产偷精品高清尤物 | 中文字幕无码日韩欧毛 | 老司机亚洲精品影院无码 | 亚洲爆乳大丰满无码专区 | 18黄暴禁片在线观看 | 在线精品亚洲一区二区 | 无码乱肉视频免费大全合集 | 中文字幕中文有码在线 | 1000部夫妻午夜免费 | 4hu四虎永久在线观看 | 国产人妻久久精品二区三区老狼 | 国产av人人夜夜澡人人爽麻豆 | 欧美精品一区二区精品久久 | 中文字幕中文有码在线 | 成人女人看片免费视频放人 | 色综合视频一区二区三区 | 1000部夫妻午夜免费 | 久久99精品久久久久婷婷 | 亚洲精品成人av在线 | 亚洲一区av无码专区在线观看 | 综合人妻久久一区二区精品 | 久久精品人人做人人综合 | 99精品国产综合久久久久五月天 | 中文精品无码中文字幕无码专区 | 精品无人区无码乱码毛片国产 | 全球成人中文在线 | 国产手机在线αⅴ片无码观看 | 国产激情无码一区二区 | 国产亚洲欧美在线专区 | 婷婷色婷婷开心五月四房播播 | 无码帝国www无码专区色综合 | 久久www免费人成人片 | 国产欧美精品一区二区三区 | 国内少妇偷人精品视频 | 国产色在线 | 国产 | 老司机亚洲精品影院无码 | 无遮无挡爽爽免费视频 | 天天综合网天天综合色 | 色综合视频一区二区三区 | 在线播放无码字幕亚洲 | 无码国内精品人妻少妇 | 俄罗斯老熟妇色xxxx | 欧美国产日韩久久mv | 久激情内射婷内射蜜桃人妖 | 国产精品无码一区二区三区不卡 | 少妇邻居内射在线 | 国产精品久久久av久久久 | 中文字幕无码视频专区 | 久久99精品久久久久久动态图 | 中文字幕av日韩精品一区二区 | 国精产品一品二品国精品69xx | 未满成年国产在线观看 | 国产av无码专区亚洲a∨毛片 | www成人国产高清内射 | 午夜无码区在线观看 | 中文字幕人妻无码一区二区三区 | 亚洲欧美综合区丁香五月小说 | 牲交欧美兽交欧美 | 久久精品一区二区三区四区 | 丝袜 中出 制服 人妻 美腿 | 国产成人综合色在线观看网站 | 亚洲色www成人永久网址 | 久久99精品国产.久久久久 | 学生妹亚洲一区二区 | 精品国产麻豆免费人成网站 | 国产区女主播在线观看 | 97精品国产97久久久久久免费 | 亚洲精品美女久久久久久久 | 亚洲一区二区三区 | 少妇太爽了在线观看 | 免费观看的无遮挡av | 欧美成人高清在线播放 | аⅴ资源天堂资源库在线 | 国产97色在线 | 免 | 国色天香社区在线视频 | 又大又紧又粉嫩18p少妇 | 色狠狠av一区二区三区 | 久久精品中文字幕大胸 | 欧美激情一区二区三区成人 | 欧美日韩久久久精品a片 | 日本熟妇浓毛 | 国产精品办公室沙发 | 国产av剧情md精品麻豆 | 一本久久a久久精品亚洲 | 扒开双腿疯狂进出爽爽爽视频 | 国产凸凹视频一区二区 | 国产av久久久久精东av | 色狠狠av一区二区三区 | 99久久久无码国产精品免费 | 双乳奶水饱满少妇呻吟 | 黑人巨大精品欧美一区二区 | 欧美日韩久久久精品a片 | 精品偷自拍另类在线观看 | 国产色精品久久人妻 | 国产精品-区区久久久狼 | 亚洲 日韩 欧美 成人 在线观看 | 麻豆av传媒蜜桃天美传媒 | 国产农村妇女高潮大叫 | 国产亲子乱弄免费视频 | 久久国产精品精品国产色婷婷 | 中国女人内谢69xxxxxa片 | 夜精品a片一区二区三区无码白浆 | 亚洲精品综合五月久久小说 | 午夜免费福利小电影 | 亚洲码国产精品高潮在线 | 少妇人妻大乳在线视频 | 中文精品无码中文字幕无码专区 | 免费人成在线视频无码 | 少妇愉情理伦片bd | a片免费视频在线观看 | 国产午夜视频在线观看 | 亚洲国产综合无码一区 | 亚洲 激情 小说 另类 欧美 | 久久久无码中文字幕久... | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 少妇太爽了在线观看 | 一个人看的视频www在线 | 国产av剧情md精品麻豆 | 日本精品久久久久中文字幕 | 亚洲日韩一区二区三区 | 成人无码精品一区二区三区 | 亚洲精品一区二区三区婷婷月 | 男人和女人高潮免费网站 | 一本一道久久综合久久 | 中文字幕乱码亚洲无线三区 | 九九综合va免费看 | 国产精品沙发午睡系列 | 国产色在线 | 国产 | 一本无码人妻在中文字幕免费 | 久在线观看福利视频 | 性生交大片免费看l | 人人澡人人妻人人爽人人蜜桃 | 丰满人妻精品国产99aⅴ | 亚洲另类伦春色综合小说 | 女人被爽到呻吟gif动态图视看 | 中文字幕无码av波多野吉衣 | 呦交小u女精品视频 | 国产卡一卡二卡三 | 又紧又大又爽精品一区二区 | 国产精品内射视频免费 | 强奷人妻日本中文字幕 | 久久精品国产大片免费观看 | 日本精品少妇一区二区三区 | 5858s亚洲色大成网站www | 久久久久久亚洲精品a片成人 | 噜噜噜亚洲色成人网站 | 成人精品一区二区三区中文字幕 | 精品乱子伦一区二区三区 | 国模大胆一区二区三区 | 亚洲成a人片在线观看日本 | 国产精品多人p群无码 | 99国产精品白浆在线观看免费 | 国内精品久久久久久中文字幕 | 国产综合在线观看 | 亚洲成a人片在线观看日本 | 国产精品18久久久久久麻辣 | 国产亚洲精品久久久久久国模美 | 亚洲欧洲中文日韩av乱码 | 18禁黄网站男男禁片免费观看 | 国产免费无码一区二区视频 | 欧美成人午夜精品久久久 | 7777奇米四色成人眼影 | 久久www免费人成人片 | 未满成年国产在线观看 | 内射欧美老妇wbb | 欧美人妻一区二区三区 | 亚洲成a人片在线观看无码3d | 少妇的肉体aa片免费 | 国产精品久久久久久久9999 | 国产精品无码成人午夜电影 | 99久久精品无码一区二区毛片 | 我要看www免费看插插视频 | 久久久久成人精品免费播放动漫 | 国产办公室秘书无码精品99 | 国产真实夫妇视频 | 青青久在线视频免费观看 | 99久久精品日本一区二区免费 | 亚洲人成无码网www | 一个人看的www免费视频在线观看 | 国产av无码专区亚洲awww | 欧洲熟妇精品视频 | 久久国内精品自在自线 | 真人与拘做受免费视频 | 99麻豆久久久国产精品免费 | 欧美日韩亚洲国产精品 | 亚洲中文无码av永久不收费 | 亚洲精品一区二区三区在线观看 | 最近免费中文字幕中文高清百度 | 国产亚洲视频中文字幕97精品 | 国产精品亚洲а∨无码播放麻豆 | 九九热爱视频精品 | 亚洲国产精品无码一区二区三区 | 乱人伦中文视频在线观看 | 牲欲强的熟妇农村老妇女 | 窝窝午夜理论片影院 | 丰满人妻翻云覆雨呻吟视频 | 人人澡人人妻人人爽人人蜜桃 | 亲嘴扒胸摸屁股激烈网站 | 国产黑色丝袜在线播放 | 国产人妻人伦精品1国产丝袜 | 亚洲精品一区国产 | 男人和女人高潮免费网站 | 粉嫩少妇内射浓精videos | 亚洲区欧美区综合区自拍区 | 九九久久精品国产免费看小说 | 久久久久国色av免费观看性色 | 麻豆国产人妻欲求不满谁演的 | 精品国产av色一区二区深夜久久 | 人人妻人人澡人人爽精品欧美 | 欧美人与禽zoz0性伦交 | 久久国产精品偷任你爽任你 | 窝窝午夜理论片影院 | 人人妻人人藻人人爽欧美一区 | 成人免费视频一区二区 | 人人澡人摸人人添 | www国产亚洲精品久久网站 | 久久精品国产一区二区三区 | 窝窝午夜理论片影院 | 黑人粗大猛烈进出高潮视频 | 久久99精品久久久久婷婷 | 国产精品亚洲五月天高清 | 中文字幕无码免费久久99 | 久久99久久99精品中文字幕 | 国精品人妻无码一区二区三区蜜柚 | 1000部啪啪未满十八勿入下载 | 亚洲精品中文字幕久久久久 | 国产情侣作爱视频免费观看 | 欧美亚洲日韩国产人成在线播放 | 无码午夜成人1000部免费视频 | 国产精品久久久久久亚洲毛片 | 欧美人与动性行为视频 | 久久久久久久久888 | 色综合久久88色综合天天 | 婷婷综合久久中文字幕蜜桃三电影 | 婷婷丁香六月激情综合啪 | 永久免费观看美女裸体的网站 | 强辱丰满人妻hd中文字幕 | 18黄暴禁片在线观看 | 国产精品.xx视频.xxtv | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美日韩一区二区综合 | 伦伦影院午夜理论片 | 日韩精品无码一区二区中文字幕 | 99久久99久久免费精品蜜桃 | 无套内谢老熟女 | 秋霞成人午夜鲁丝一区二区三区 | 成人一区二区免费视频 | 国产成人综合美国十次 | 老头边吃奶边弄进去呻吟 | 国产激情艳情在线看视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 麻豆果冻传媒2021精品传媒一区下载 | 欧美喷潮久久久xxxxx | 精品无码国产一区二区三区av | 任你躁国产自任一区二区三区 | 亚洲 欧美 激情 小说 另类 | 国产亚洲日韩欧美另类第八页 | 国产精品亚洲一区二区三区喷水 | 永久免费观看美女裸体的网站 | 日日摸日日碰夜夜爽av | 搡女人真爽免费视频大全 | 亚洲 a v无 码免 费 成 人 a v | 成人片黄网站色大片免费观看 | 嫩b人妻精品一区二区三区 | 正在播放东北夫妻内射 | 国产亚洲精品精品国产亚洲综合 | 亚洲高清偷拍一区二区三区 | 丰满岳乱妇在线观看中字无码 | 日韩成人一区二区三区在线观看 | 国产偷国产偷精品高清尤物 | 人妻互换免费中文字幕 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲第一无码av无码专区 | 日本护士xxxxhd少妇 | 国产av一区二区精品久久凹凸 | 国模大胆一区二区三区 | 人人妻人人澡人人爽欧美精品 | 国产艳妇av在线观看果冻传媒 | 亚洲熟熟妇xxxx | 高潮毛片无遮挡高清免费 | 性做久久久久久久久 | 日韩精品无码免费一区二区三区 | 亚洲精品www久久久 | 亚洲 a v无 码免 费 成 人 a v | 天堂在线观看www | 内射巨臀欧美在线视频 | 久青草影院在线观看国产 | 亚洲一区二区三区 | 国产精品鲁鲁鲁 | 亚洲 a v无 码免 费 成 人 a v | ass日本丰满熟妇pics | 国产高清不卡无码视频 | 亚洲s色大片在线观看 | 亚洲成熟女人毛毛耸耸多 | 国产熟妇高潮叫床视频播放 | 人人妻人人澡人人爽人人精品浪潮 | 最新国产麻豆aⅴ精品无码 | 色婷婷久久一区二区三区麻豆 | 国语精品一区二区三区 | 久激情内射婷内射蜜桃人妖 | 婷婷五月综合激情中文字幕 | 国产熟妇另类久久久久 | 樱花草在线播放免费中文 | 丰满妇女强制高潮18xxxx | 天堂无码人妻精品一区二区三区 | 亚洲日韩av一区二区三区中文 | 麻豆精品国产精华精华液好用吗 | 女人和拘做爰正片视频 | 亚洲日本va中文字幕 | 青草视频在线播放 | 久久久精品成人免费观看 | 国产精品久久久一区二区三区 | 国内老熟妇对白xxxxhd | 国产福利视频一区二区 | 久久熟妇人妻午夜寂寞影院 | 成 人 网 站国产免费观看 | 日本www一道久久久免费榴莲 | a片免费视频在线观看 | 国产真人无遮挡作爱免费视频 | 欧美成人午夜精品久久久 | 无遮挡啪啪摇乳动态图 | 特级做a爰片毛片免费69 | 午夜福利一区二区三区在线观看 | 99国产精品白浆在线观看免费 | 国产乱人伦av在线无码 | 精品熟女少妇av免费观看 | 久久精品国产大片免费观看 | 欧美性猛交内射兽交老熟妇 | 全球成人中文在线 | 无遮挡国产高潮视频免费观看 | 国内老熟妇对白xxxxhd | 中文字幕久久久久人妻 | 日本一区二区三区免费高清 | 美女黄网站人色视频免费国产 | 国产超级va在线观看视频 | 又大又硬又爽免费视频 | 久久亚洲国产成人精品性色 | 色综合久久久无码中文字幕 | 免费看男女做好爽好硬视频 | 国产猛烈高潮尖叫视频免费 | 伊人久久大香线蕉亚洲 | 久久国产精品萌白酱免费 | 内射后入在线观看一区 | 久精品国产欧美亚洲色aⅴ大片 | 又粗又大又硬又长又爽 | 婷婷丁香五月天综合东京热 | 亚洲精品久久久久中文第一幕 | 久久午夜无码鲁丝片秋霞 | 欧美日韩在线亚洲综合国产人 | 欧美乱妇无乱码大黄a片 | 欧美性猛交xxxx富婆 | 免费人成网站视频在线观看 | 午夜性刺激在线视频免费 | 国产一区二区三区影院 | 对白脏话肉麻粗话av | 久久99精品国产麻豆蜜芽 | 国产99久久精品一区二区 | 波多野结衣av在线观看 | 欧洲vodafone精品性 | 蜜臀aⅴ国产精品久久久国产老师 | 131美女爱做视频 | 日本一卡二卡不卡视频查询 | 成人无码精品一区二区三区 | 最近的中文字幕在线看视频 | 青春草在线视频免费观看 | 日日碰狠狠丁香久燥 | 丝袜 中出 制服 人妻 美腿 | 中文字幕无线码 | 精品无码一区二区三区的天堂 | 任你躁在线精品免费 | 久久综合香蕉国产蜜臀av | 日本va欧美va欧美va精品 | 亚洲精品国产品国语在线观看 | 双乳奶水饱满少妇呻吟 | 国产精品人人妻人人爽 | 又紧又大又爽精品一区二区 | 亚洲国产日韩a在线播放 | www成人国产高清内射 | 激情人妻另类人妻伦 | 午夜嘿嘿嘿影院 | 成人三级无码视频在线观看 | 国产 浪潮av性色四虎 | 又粗又大又硬毛片免费看 | 亚洲理论电影在线观看 | 久久久久久久久888 | 欧美熟妇另类久久久久久不卡 | 三上悠亚人妻中文字幕在线 | 日韩视频 中文字幕 视频一区 | 国产精品欧美成人 | 乌克兰少妇性做爰 | 久久久www成人免费毛片 | 最近中文2019字幕第二页 | 嫩b人妻精品一区二区三区 | 国内少妇偷人精品视频免费 | 国产成人无码专区 | 欧美性生交活xxxxxdddd | 无码人妻出轨黑人中文字幕 | 久久久久久久久蜜桃 | 亚洲国精产品一二二线 | 久久久成人毛片无码 | 天天拍夜夜添久久精品大 | 国精产品一品二品国精品69xx | 国内综合精品午夜久久资源 | 双乳奶水饱满少妇呻吟 | 精品国产精品久久一区免费式 | av人摸人人人澡人人超碰下载 | 奇米影视888欧美在线观看 | 色窝窝无码一区二区三区色欲 | 欧美人与物videos另类 | 亚洲综合伊人久久大杳蕉 | 狂野欧美激情性xxxx | 99久久精品午夜一区二区 | 国产精品久久久午夜夜伦鲁鲁 | 伊人久久婷婷五月综合97色 | 熟妇激情内射com | 亚洲色大成网站www | 久久精品国产一区二区三区肥胖 | 亚洲中文字幕无码中字 | 一个人免费观看的www视频 | 俄罗斯老熟妇色xxxx | 中文字幕无码乱人伦 | 国产成人精品一区二区在线小狼 | 亚洲 a v无 码免 费 成 人 a v | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亲嘴扒胸摸屁股激烈网站 | 鲁鲁鲁爽爽爽在线视频观看 | 国产精品无套呻吟在线 | 亚洲s码欧洲m码国产av | 国内精品九九久久久精品 | 国产性生大片免费观看性 | 老子影院午夜精品无码 | 美女黄网站人色视频免费国产 | 国产无套粉嫩白浆在线 | 国产午夜视频在线观看 | 亚洲乱码国产乱码精品精 | 欧美放荡的少妇 | 欧美黑人性暴力猛交喷水 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲一区二区观看播放 | 国产精品99久久精品爆乳 | 在线天堂新版最新版在线8 | 午夜福利不卡在线视频 | 中文字幕中文有码在线 | 免费男性肉肉影院 | 免费观看的无遮挡av | 精品少妇爆乳无码av无码专区 | 久久精品国产99久久6动漫 | 中国女人内谢69xxxxxa片 | 日韩av激情在线观看 | 澳门永久av免费网站 | 色五月五月丁香亚洲综合网 | 久久久久99精品国产片 | 在线天堂新版最新版在线8 | 国产亚av手机在线观看 | 日韩人妻系列无码专区 | 中文字幕无码人妻少妇免费 | 水蜜桃av无码 | 东京热一精品无码av | 国产成人无码专区 | 在线播放免费人成毛片乱码 | 国精产品一品二品国精品69xx | 国产亚洲日韩欧美另类第八页 | 精品无人国产偷自产在线 | 十八禁真人啪啪免费网站 | 久久婷婷五月综合色国产香蕉 | 最近免费中文字幕中文高清百度 | 精品 日韩 国产 欧美 视频 | 欧美freesex黑人又粗又大 | 中文字幕无码免费久久99 | 精品无码一区二区三区的天堂 | 少妇人妻av毛片在线看 | 久久精品中文字幕大胸 | 丰满岳乱妇在线观看中字无码 | 最新国产麻豆aⅴ精品无码 | 国产成人人人97超碰超爽8 | 无码国产激情在线观看 | 免费无码av一区二区 | 内射巨臀欧美在线视频 | 亚洲精品综合一区二区三区在线 | 99久久人妻精品免费二区 | 久久久久久久女国产乱让韩 | 美女毛片一区二区三区四区 | 国产超碰人人爽人人做人人添 | 国产成人一区二区三区别 | 麻豆成人精品国产免费 | 国产乱人无码伦av在线a | 免费看少妇作爱视频 | 国产成人无码午夜视频在线观看 | 激情内射亚州一区二区三区爱妻 | 高潮喷水的毛片 | 蜜桃视频插满18在线观看 | 人妻天天爽夜夜爽一区二区 | 欧美 日韩 人妻 高清 中文 | 国产在线精品一区二区三区直播 | 亚洲成av人片在线观看无码不卡 | 中文字幕无码热在线视频 | 噜噜噜亚洲色成人网站 | 国内综合精品午夜久久资源 | 国产亚洲精品久久久久久 | 麻豆国产人妻欲求不满谁演的 | 国产精品丝袜黑色高跟鞋 | 国产av人人夜夜澡人人爽麻豆 | 少妇激情av一区二区 | 乱码午夜-极国产极内射 | 高潮毛片无遮挡高清免费视频 | 东北女人啪啪对白 | 在线播放免费人成毛片乱码 | 久久久久久九九精品久 | 2020久久超碰国产精品最新 | 97人妻精品一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 色妞www精品免费视频 | 日韩亚洲欧美精品综合 | 天堂无码人妻精品一区二区三区 | 中文精品久久久久人妻不卡 | 国产农村妇女高潮大叫 | 成人av无码一区二区三区 | 免费国产黄网站在线观看 | 性开放的女人aaa片 | 黑人玩弄人妻中文在线 | 波多野结衣av在线观看 | 97久久国产亚洲精品超碰热 | 熟妇人妻无乱码中文字幕 | 无人区乱码一区二区三区 | 国产成人综合色在线观看网站 | 国产免费无码一区二区视频 | 中文无码成人免费视频在线观看 | 成人无码精品1区2区3区免费看 | 午夜丰满少妇性开放视频 | 香蕉久久久久久av成人 | 亚洲伊人久久精品影院 | 99久久久无码国产aaa精品 | 午夜免费福利小电影 | 玩弄少妇高潮ⅹxxxyw | 精品熟女少妇av免费观看 | 国产乡下妇女做爰 | 无遮挡国产高潮视频免费观看 | 亚洲欧洲日本综合aⅴ在线 | 扒开双腿吃奶呻吟做受视频 | 精品国产一区二区三区av 性色 | 国产九九九九九九九a片 | 亚洲精品一区国产 | 国产精品亚洲一区二区三区喷水 | 国产偷自视频区视频 | 亚洲无人区午夜福利码高清完整版 | 特黄特色大片免费播放器图片 | 亚洲色欲色欲欲www在线 | 欧美成人免费全部网站 | 亚洲国产成人a精品不卡在线 | 成人片黄网站色大片免费观看 | 国产精品免费大片 | 99久久精品午夜一区二区 | 亚洲gv猛男gv无码男同 | 国产精品久免费的黄网站 | 狠狠cao日日穞夜夜穞av | 精品久久久中文字幕人妻 | 日本乱人伦片中文三区 | 免费看男女做好爽好硬视频 | 亚洲精品一区二区三区四区五区 | 欧美 丝袜 自拍 制服 另类 | 成人性做爰aaa片免费看 | 精品久久久中文字幕人妻 | 亚洲日韩av一区二区三区中文 | 亚洲春色在线视频 | 免费无码av一区二区 | 老子影院午夜伦不卡 | 国产一区二区不卡老阿姨 | 一个人看的视频www在线 | 国产精品理论片在线观看 | 精品久久久久香蕉网 | 亚洲s色大片在线观看 | 99re在线播放 | 国产精品久久久 | 扒开双腿吃奶呻吟做受视频 | 漂亮人妻洗澡被公强 日日躁 | 久久精品女人天堂av免费观看 | 一个人看的www免费视频在线观看 | 最新国产乱人伦偷精品免费网站 | 成人一区二区免费视频 | 亚洲一区二区观看播放 | 久久97精品久久久久久久不卡 | 亚洲综合色区中文字幕 | 免费国产成人高清在线观看网站 | 国产成人综合在线女婷五月99播放 | 亚洲娇小与黑人巨大交 | 成熟女人特级毛片www免费 | 国产午夜精品一区二区三区嫩草 | 在线播放免费人成毛片乱码 | 乱人伦中文视频在线观看 | 国产午夜亚洲精品不卡下载 | 国产极品美女高潮无套在线观看 | 国精产品一区二区三区 | 97资源共享在线视频 | 国产精品久久久久9999小说 | 伊人久久大香线蕉亚洲 | 久久五月精品中文字幕 | 欧美老妇交乱视频在线观看 | 又黄又爽又色的视频 | 日韩人妻少妇一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 377p欧洲日本亚洲大胆 | 少妇激情av一区二区 | 久久人人爽人人爽人人片av高清 | 日韩欧美成人免费观看 | 青春草在线视频免费观看 | 欧美日本精品一区二区三区 | 乌克兰少妇xxxx做受 | 99国产欧美久久久精品 | 啦啦啦www在线观看免费视频 | 狠狠噜狠狠狠狠丁香五月 | 亚洲色偷偷偷综合网 | 精品国偷自产在线 | 国产麻豆精品一区二区三区v视界 | aⅴ在线视频男人的天堂 | 久久久久久久女国产乱让韩 | 久久亚洲日韩精品一区二区三区 | 亚洲男人av天堂午夜在 | 久久人妻内射无码一区三区 | 亚洲乱码国产乱码精品精 | 5858s亚洲色大成网站www | 国产精品无码一区二区三区不卡 | 丰满人妻被黑人猛烈进入 | 亚洲欧美中文字幕5发布 | 中文字幕精品av一区二区五区 | 亚洲人成影院在线观看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 一本精品99久久精品77 | 女人和拘做爰正片视频 | 欧美阿v高清资源不卡在线播放 | 天天躁夜夜躁狠狠是什么心态 | 国产精品内射视频免费 | 国内精品久久久久久中文字幕 | 熟女少妇人妻中文字幕 | 成人无码精品一区二区三区 | 国产疯狂伦交大片 | 自拍偷自拍亚洲精品10p | av在线亚洲欧洲日产一区二区 | 国产深夜福利视频在线 | 国产va免费精品观看 | 欧美激情综合亚洲一二区 | 亚洲精品一区二区三区大桥未久 | 欧美日韩久久久精品a片 | 久久精品国产99久久6动漫 | 久久国产精品偷任你爽任你 | 亚洲性无码av中文字幕 | 人人澡人人妻人人爽人人蜜桃 | 亚无码乱人伦一区二区 | 国内少妇偷人精品视频免费 | a片免费视频在线观看 | аⅴ资源天堂资源库在线 | 好男人www社区 | 久精品国产欧美亚洲色aⅴ大片 | 99精品国产综合久久久久五月天 | 欧美国产日韩亚洲中文 | 成人亚洲精品久久久久软件 | 久久久精品欧美一区二区免费 | 午夜熟女插插xx免费视频 | 波多野结衣av一区二区全免费观看 | 亚洲经典千人经典日产 | 中文字幕无码人妻少妇免费 | 极品尤物被啪到呻吟喷水 | 色综合久久久久综合一本到桃花网 | 日韩视频 中文字幕 视频一区 | 99精品久久毛片a片 | 国产精品无套呻吟在线 | 亚洲va中文字幕无码久久不卡 | 欧美日本日韩 | 亚洲精品中文字幕乱码 | 国内精品人妻无码久久久影院 | 西西人体www44rt大胆高清 | 未满成年国产在线观看 | 欧美国产日韩久久mv | 丰满人妻被黑人猛烈进入 | 成人综合网亚洲伊人 | 亚洲熟熟妇xxxx | www国产精品内射老师 | 亚洲人成网站在线播放942 | aⅴ亚洲 日韩 色 图网站 播放 | 永久免费观看国产裸体美女 | 国产成人精品无码播放 | 东北女人啪啪对白 | 麻豆国产人妻欲求不满 | 久久综合激激的五月天 | 人妻少妇精品视频专区 | 日本在线高清不卡免费播放 | 人人爽人人爽人人片av亚洲 | 丝袜美腿亚洲一区二区 | 曰韩无码二三区中文字幕 | 国产另类ts人妖一区二区 | 日产精品99久久久久久 | 国产精品国产三级国产专播 | 18黄暴禁片在线观看 | 少妇人妻av毛片在线看 | 亚洲爆乳精品无码一区二区三区 | 国产激情艳情在线看视频 | 玩弄少妇高潮ⅹxxxyw | 国产激情精品一区二区三区 | 亚洲中文字幕无码中文字在线 | 亚洲国产精品无码久久久久高潮 | 欧美日韩人成综合在线播放 | v一区无码内射国产 | 色一情一乱一伦一区二区三欧美 | 人妻少妇精品无码专区动漫 | 人人爽人人澡人人人妻 | 亚洲а∨天堂久久精品2021 | 国产精品.xx视频.xxtv | 国产成人综合在线女婷五月99播放 | 大地资源网第二页免费观看 | 欧美精品免费观看二区 | 国产乱人偷精品人妻a片 | 波多野结衣高清一区二区三区 | 久久精品一区二区三区四区 | 国产亚洲精品久久久久久大师 | 精品成人av一区二区三区 | 天天拍夜夜添久久精品大 | 特黄特色大片免费播放器图片 | a片在线免费观看 | 亚洲欧美精品aaaaaa片 | 中国女人内谢69xxxx | 国产乱码精品一品二品 | 精品一区二区三区波多野结衣 | 国产av剧情md精品麻豆 | 亚洲欧美国产精品久久 | 国产精品igao视频网 | 中文字幕av伊人av无码av | 日产精品高潮呻吟av久久 | 日本精品人妻无码免费大全 | 亚洲理论电影在线观看 | 国产乱人伦av在线无码 | 国产真人无遮挡作爱免费视频 | 激情内射亚州一区二区三区爱妻 | 中文字幕乱妇无码av在线 | 九九在线中文字幕无码 | 无码人妻久久一区二区三区不卡 | 九九在线中文字幕无码 | 在线精品国产一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 欧美性猛交xxxx富婆 | 亚洲の无码国产の无码步美 | 亚洲经典千人经典日产 | 亚洲色在线无码国产精品不卡 | 亚洲爆乳大丰满无码专区 | 黄网在线观看免费网站 | 亚洲啪av永久无码精品放毛片 | 国产偷抇久久精品a片69 | 国产精品二区一区二区aⅴ污介绍 | aⅴ亚洲 日韩 色 图网站 播放 | 婷婷五月综合缴情在线视频 | 中文无码精品a∨在线观看不卡 | 久青草影院在线观看国产 | 99精品视频在线观看免费 | 国产午夜视频在线观看 | 午夜无码区在线观看 | 免费中文字幕日韩欧美 | 国产精品理论片在线观看 | 精品成在人线av无码免费看 | 久久99精品国产麻豆蜜芽 | 欧美老妇交乱视频在线观看 | 久久99精品久久久久久 | 欧美日韩在线亚洲综合国产人 | 日本饥渴人妻欲求不满 | 亚洲狠狠色丁香婷婷综合 | 丰满岳乱妇在线观看中字无码 | 免费国产黄网站在线观看 | www国产精品内射老师 | 亚洲无人区午夜福利码高清完整版 | 无套内谢的新婚少妇国语播放 | 无遮挡国产高潮视频免费观看 | 国产超级va在线观看视频 | 又大又硬又爽免费视频 | 亚洲中文无码av永久不收费 | 5858s亚洲色大成网站www | 国产区女主播在线观看 | 在线精品国产一区二区三区 | 成人三级无码视频在线观看 | 亚洲精品一区二区三区婷婷月 | 国产精品久久久av久久久 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产电影无码午夜在线播放 | 成人欧美一区二区三区黑人免费 | 无人区乱码一区二区三区 | 亚洲一区二区观看播放 | 国产综合色产在线精品 | 亚洲中文字幕无码中文字在线 | 国产99久久精品一区二区 | 无码国模国产在线观看 | 日本欧美一区二区三区乱码 | 无码人妻久久一区二区三区不卡 | 亚洲狠狠色丁香婷婷综合 | 少妇一晚三次一区二区三区 | 又湿又紧又大又爽a视频国产 | 婷婷色婷婷开心五月四房播播 | 午夜福利试看120秒体验区 | 在线天堂新版最新版在线8 | 真人与拘做受免费视频一 | 日韩亚洲欧美精品综合 | 久久久久成人片免费观看蜜芽 | 18无码粉嫩小泬无套在线观看 | 国内少妇偷人精品视频免费 | 熟女少妇在线视频播放 | 性欧美videos高清精品 | 成人试看120秒体验区 | 国产凸凹视频一区二区 | 亚洲阿v天堂在线 | 欧美人与牲动交xxxx | 婷婷综合久久中文字幕蜜桃三电影 | 小sao货水好多真紧h无码视频 | 亚洲熟妇自偷自拍另类 | 亚洲精品国产第一综合99久久 | 国内少妇偷人精品视频 | 77777熟女视频在线观看 а天堂中文在线官网 | 丰满妇女强制高潮18xxxx | 中文精品久久久久人妻不卡 | 亚洲日韩中文字幕在线播放 | 最新版天堂资源中文官网 | 久久久久se色偷偷亚洲精品av | 成人免费视频在线观看 | 日韩精品乱码av一区二区 | 粉嫩少妇内射浓精videos | 无码午夜成人1000部免费视频 | 国产亚洲精品久久久闺蜜 | 乱人伦中文视频在线观看 | 欧美亚洲日韩国产人成在线播放 | 久久精品女人天堂av免费观看 | 欧美日韩久久久精品a片 | 狠狠色色综合网站 | 搡女人真爽免费视频大全 | 蜜臀aⅴ国产精品久久久国产老师 | 婷婷五月综合激情中文字幕 | 亚洲国产av精品一区二区蜜芽 | 中文字幕无线码免费人妻 | 在线欧美精品一区二区三区 | 国产成人无码av片在线观看不卡 | 国产性生交xxxxx无码 | 131美女爱做视频 | 国产人成高清在线视频99最全资源 | 成人无码影片精品久久久 | 秋霞成人午夜鲁丝一区二区三区 | 中文毛片无遮挡高清免费 | 俺去俺来也www色官网 | 成 人 免费观看网站 | 亚洲综合另类小说色区 | 亚洲第一无码av无码专区 | 伊人久久大香线蕉av一区二区 | 亚洲精品一区二区三区四区五区 | 无码国产色欲xxxxx视频 | 亚洲无人区一区二区三区 | 亚洲自偷自拍另类第1页 | 中国大陆精品视频xxxx | 一本久久a久久精品亚洲 | 日韩欧美中文字幕公布 | 天天拍夜夜添久久精品 | 99在线 | 亚洲 | 亚洲一区二区三区播放 | 亚洲成av人影院在线观看 | 乱人伦人妻中文字幕无码久久网 | 国产乱人伦偷精品视频 | 女人高潮内射99精品 | 在线欧美精品一区二区三区 | 无码人妻久久一区二区三区不卡 | 久久久久久久久蜜桃 | 欧美xxxx黑人又粗又长 | 中文字幕 亚洲精品 第1页 | 国产精品a成v人在线播放 | 日日摸天天摸爽爽狠狠97 | 亚洲第一无码av无码专区 | 人人澡人人妻人人爽人人蜜桃 | 国产精品久久久av久久久 | 成人片黄网站色大片免费观看 | 久久精品国产大片免费观看 | 久久精品国产99久久6动漫 | 无码人妻少妇伦在线电影 | 丰满少妇弄高潮了www | 中文字幕无码免费久久99 | 中文字幕人成乱码熟女app | 双乳奶水饱满少妇呻吟 | 精品无码国产自产拍在线观看蜜 | 无码中文字幕色专区 | 亚洲色大成网站www国产 | 男女下面进入的视频免费午夜 | 人人澡人摸人人添 | 97se亚洲精品一区 | 熟妇人妻中文av无码 | 曰本女人与公拘交酡免费视频 | 性色欲情网站iwww九文堂 | 亚洲天堂2017无码中文 | 国内老熟妇对白xxxxhd | 国产精品鲁鲁鲁 | 国产亚洲欧美日韩亚洲中文色 | 高清国产亚洲精品自在久久 | 亚洲精品欧美二区三区中文字幕 | 久久久久亚洲精品中文字幕 | 国产精品自产拍在线观看 | 97色伦图片97综合影院 | 在线观看欧美一区二区三区 | 国色天香社区在线视频 | 色婷婷欧美在线播放内射 | 精品亚洲韩国一区二区三区 | 亚洲の无码国产の无码影院 | 国产区女主播在线观看 | 日本爽爽爽爽爽爽在线观看免 | 久久久久亚洲精品中文字幕 | 中国女人内谢69xxxxxa片 | 无码av免费一区二区三区试看 | 人妻互换免费中文字幕 | 亚洲国产精品久久久久久 | 少妇愉情理伦片bd | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 精品乱码久久久久久久 | 国产精品久久精品三级 | 特黄特色大片免费播放器图片 | 又大又紧又粉嫩18p少妇 | 精品欧美一区二区三区久久久 | 免费看男女做好爽好硬视频 | 色综合久久88色综合天天 | 成人免费视频视频在线观看 免费 | 亚洲欧洲日本综合aⅴ在线 | 亚洲精品一区三区三区在线观看 | 欧美熟妇另类久久久久久不卡 | 日韩精品无码一区二区中文字幕 | 日韩成人一区二区三区在线观看 | 熟女俱乐部五十路六十路av | 国产疯狂伦交大片 | 俄罗斯老熟妇色xxxx | 人人爽人人澡人人人妻 | 久久成人a毛片免费观看网站 | 激情亚洲一区国产精品 | 国产偷国产偷精品高清尤物 | 小sao货水好多真紧h无码视频 | 亚洲天堂2017无码 | 亚洲 日韩 欧美 成人 在线观看 | 少妇被黑人到高潮喷出白浆 | 精品一区二区三区无码免费视频 | 国产精品亚洲五月天高清 | 欧美日韩久久久精品a片 | 2020久久超碰国产精品最新 | 人妻少妇精品无码专区二区 | 亚洲国产日韩a在线播放 | 色婷婷av一区二区三区之红樱桃 | 国产精品99久久精品爆乳 | 九九综合va免费看 | 国产无av码在线观看 | 中文字幕无码av波多野吉衣 | 国产精品美女久久久久av爽李琼 | 日韩少妇内射免费播放 | 亚洲中文字幕无码一久久区 | 国产成人无码a区在线观看视频app | 97久久国产亚洲精品超碰热 | 高清国产亚洲精品自在久久 | 中文字幕亚洲情99在线 | 亲嘴扒胸摸屁股激烈网站 | 色窝窝无码一区二区三区色欲 | 欧美成人高清在线播放 | 色偷偷人人澡人人爽人人模 | 最新国产麻豆aⅴ精品无码 | 无码人妻丰满熟妇区毛片18 | 欧美性生交xxxxx久久久 | 中文字幕日韩精品一区二区三区 | 任你躁在线精品免费 | 天堂久久天堂av色综合 | 最新版天堂资源中文官网 | 樱花草在线社区www | 3d动漫精品啪啪一区二区中 | 亚洲国产精品无码久久久久高潮 | 精品国产成人一区二区三区 | 天天拍夜夜添久久精品 | 国产色xx群视频射精 | 对白脏话肉麻粗话av | 成人毛片一区二区 | 日日碰狠狠丁香久燥 | 天堂а√在线地址中文在线 | 强奷人妻日本中文字幕 | 亚洲男人av香蕉爽爽爽爽 | 色婷婷综合中文久久一本 | 久久99精品国产.久久久久 | 亚洲国产成人a精品不卡在线 | 亚洲综合在线一区二区三区 | 国产精品人人爽人人做我的可爱 | 丁香花在线影院观看在线播放 | 成人无码视频免费播放 | 欧美老人巨大xxxx做受 | 搡女人真爽免费视频大全 | 久久99热只有频精品8 | 无码人妻精品一区二区三区下载 | 成人女人看片免费视频放人 | 日本饥渴人妻欲求不满 | 国产精品亚洲а∨无码播放麻豆 | 国产精品久久久久久久9999 | 成人动漫在线观看 | 国内综合精品午夜久久资源 | 97夜夜澡人人双人人人喊 | 在线亚洲高清揄拍自拍一品区 | 亚洲无人区一区二区三区 | 国产无套粉嫩白浆在线 | 婷婷五月综合缴情在线视频 | 秋霞成人午夜鲁丝一区二区三区 | 成人无码精品1区2区3区免费看 | 成人免费无码大片a毛片 | 欧美国产亚洲日韩在线二区 | 大胆欧美熟妇xx | 亚洲理论电影在线观看 | 秋霞特色aa大片 | 夜夜夜高潮夜夜爽夜夜爰爰 | 日日天干夜夜狠狠爱 | 天堂久久天堂av色综合 | 久久久久久av无码免费看大片 | 97精品人妻一区二区三区香蕉 | 一本久道高清无码视频 | 狠狠亚洲超碰狼人久久 | 国产欧美亚洲精品a | 亚洲熟女一区二区三区 | 欧美日本精品一区二区三区 | 亚洲国产精品久久久天堂 | 国产激情一区二区三区 | 国精产品一区二区三区 | 18禁止看的免费污网站 | 无码纯肉视频在线观看 | 少妇无码吹潮 | 又粗又大又硬毛片免费看 | 玩弄少妇高潮ⅹxxxyw | 国产精品人人妻人人爽 | 久久综合给久久狠狠97色 | 夜精品a片一区二区三区无码白浆 | 好爽又高潮了毛片免费下载 | 精品欧美一区二区三区久久久 | 无码午夜成人1000部免费视频 | 日日摸日日碰夜夜爽av | 在线成人www免费观看视频 | 国产做国产爱免费视频 | 水蜜桃亚洲一二三四在线 | 久久精品视频在线看15 | 国产 浪潮av性色四虎 | 丁香啪啪综合成人亚洲 | 色情久久久av熟女人妻网站 | 精品国产一区二区三区av 性色 | 男人的天堂2018无码 | 日韩少妇白浆无码系列 | 99久久久国产精品无码免费 | 一个人看的www免费视频在线观看 | 国精产品一区二区三区 | 人人妻人人藻人人爽欧美一区 | 亚洲va中文字幕无码久久不卡 | 55夜色66夜色国产精品视频 | 亚洲七七久久桃花影院 | 国产精品美女久久久网av | 欧美国产日产一区二区 | 亚洲国产日韩a在线播放 | 亚洲熟妇色xxxxx亚洲 | 久久天天躁狠狠躁夜夜免费观看 | 少女韩国电视剧在线观看完整 | 亚洲精品久久久久久一区二区 | 东京热一精品无码av | 九九久久精品国产免费看小说 | 初尝人妻少妇中文字幕 | 最近免费中文字幕中文高清百度 | 国产成人无码av片在线观看不卡 | 18黄暴禁片在线观看 | 亚洲中文字幕乱码av波多ji | 亚洲精品成人av在线 | 大胆欧美熟妇xx | 少妇久久久久久人妻无码 | 国产精品高潮呻吟av久久4虎 | 亲嘴扒胸摸屁股激烈网站 | 日韩亚洲欧美中文高清在线 | 午夜时刻免费入口 | 丰满妇女强制高潮18xxxx | 丰满少妇女裸体bbw | 午夜理论片yy44880影院 | 久久zyz资源站无码中文动漫 | 国产无套内射久久久国产 | 亚洲国产精品一区二区美利坚 | 99精品视频在线观看免费 | 捆绑白丝粉色jk震动捧喷白浆 | 日本肉体xxxx裸交 | 激情五月综合色婷婷一区二区 | 亚洲色偷偷偷综合网 | 奇米影视888欧美在线观看 | 粉嫩少妇内射浓精videos | 亚洲aⅴ无码成人网站国产app | 无套内谢的新婚少妇国语播放 | 狂野欧美性猛交免费视频 | 亚洲成色www久久网站 | 一本一道久久综合久久 | 欧美 丝袜 自拍 制服 另类 | 国内少妇偷人精品视频 | 中文字幕无码av波多野吉衣 | 国产亚洲欧美在线专区 | 亚洲精品一区二区三区四区五区 | 波多野结衣高清一区二区三区 | 久精品国产欧美亚洲色aⅴ大片 | 国内精品久久毛片一区二区 | 欧美国产日韩亚洲中文 | 亚洲精品国产精品乱码视色 | 爆乳一区二区三区无码 | 免费乱码人妻系列无码专区 | 久久久久久久久蜜桃 | 99久久精品无码一区二区毛片 | 国产乱码精品一品二品 | 性色欲情网站iwww九文堂 | 少妇人妻大乳在线视频 | 日本又色又爽又黄的a片18禁 | 国产超级va在线观看视频 | 国产成人无码a区在线观看视频app | 久久99精品国产麻豆 | 国产成人精品三级麻豆 | 最新版天堂资源中文官网 | 国产欧美熟妇另类久久久 | 亚洲成在人网站无码天堂 | 久久久久久久女国产乱让韩 | 色综合久久久无码网中文 | 亚洲国产精品无码一区二区三区 | 日韩精品无码一本二本三本色 | 中文字幕色婷婷在线视频 | 久久久久av无码免费网 | 国产精品久久久久久亚洲毛片 | 久久99国产综合精品 | 真人与拘做受免费视频 | 亚洲国产精品久久久天堂 | 无码人妻精品一区二区三区下载 | 中文字幕乱码中文乱码51精品 | 99久久精品国产一区二区蜜芽 | 国产成人无码a区在线观看视频app | 奇米影视888欧美在线观看 | 午夜免费福利小电影 | 国产精品办公室沙发 | 国产精品va在线观看无码 | 天天躁夜夜躁狠狠是什么心态 | 亚洲啪av永久无码精品放毛片 | 老司机亚洲精品影院无码 | 小鲜肉自慰网站xnxx | 国产成人精品三级麻豆 | 久久婷婷五月综合色国产香蕉 | 国产成人综合色在线观看网站 | 51国偷自产一区二区三区 | yw尤物av无码国产在线观看 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品毛多多水多 | 午夜精品一区二区三区的区别 | 色婷婷综合中文久久一本 | 人妻与老人中文字幕 | 精品少妇爆乳无码av无码专区 | 久久99精品久久久久久 | 无码国产色欲xxxxx视频 | 亚洲日本va中文字幕 | 波多野结衣高清一区二区三区 | 久久人人爽人人人人片 | 国产av剧情md精品麻豆 | 国产av一区二区精品久久凹凸 | 中文字幕乱码亚洲无线三区 | 欧美性生交活xxxxxdddd | 美女极度色诱视频国产 | 人妻少妇精品久久 | 丝袜足控一区二区三区 | 成人影院yy111111在线观看 | 日韩人妻无码一区二区三区久久99 | 国产另类ts人妖一区二区 | 久久aⅴ免费观看 | 久激情内射婷内射蜜桃人妖 | 久久久婷婷五月亚洲97号色 | 国产精品福利视频导航 | 帮老师解开蕾丝奶罩吸乳网站 | 麻豆国产人妻欲求不满谁演的 | 亚洲欧美日韩综合久久久 | 亚洲一区二区三区在线观看网站 | 国内精品一区二区三区不卡 | 精品国产av色一区二区深夜久久 | 性色欲情网站iwww九文堂 | 国产精品无码永久免费888 | 亚洲va欧美va天堂v国产综合 | 欧美freesex黑人又粗又大 | 精品人人妻人人澡人人爽人人 | 无码人中文字幕 | 1000部啪啪未满十八勿入下载 | 国产成人无码av一区二区 | 无码乱肉视频免费大全合集 | 国产精品亚洲综合色区韩国 | 久久午夜夜伦鲁鲁片无码免费 | 色综合久久网 | 人人妻人人澡人人爽欧美一区 | 两性色午夜免费视频 | 久久zyz资源站无码中文动漫 | 国产在热线精品视频 | 亚洲熟女一区二区三区 | 中文亚洲成a人片在线观看 | 国产精品资源一区二区 | 国精品人妻无码一区二区三区蜜柚 | 日韩人妻少妇一区二区三区 | 久久精品中文字幕一区 | 亚洲中文字幕乱码av波多ji | 亚洲娇小与黑人巨大交 | 乱人伦中文视频在线观看 | 亚洲日韩中文字幕在线播放 | 丰满肥臀大屁股熟妇激情视频 | 国产色在线 | 国产 | 久久熟妇人妻午夜寂寞影院 | 久久人人97超碰a片精品 | 精品国产乱码久久久久乱码 | 日本一卡二卡不卡视频查询 | 色综合视频一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 亚洲高清偷拍一区二区三区 | 少妇激情av一区二区 | 精品偷拍一区二区三区在线看 | 人人妻在人人 | 中文字幕无码热在线视频 | 无码人妻精品一区二区三区不卡 | a国产一区二区免费入口 | 国产精品亚洲五月天高清 | 伊人久久大香线蕉av一区二区 | 日本高清一区免费中文视频 | 亚洲人成无码网www | 女人被爽到呻吟gif动态图视看 | 成人欧美一区二区三区黑人免费 | 国产精品永久免费视频 | 国模大胆一区二区三区 | av无码久久久久不卡免费网站 | 男女超爽视频免费播放 | 亚洲熟悉妇女xxx妇女av | 色欲综合久久中文字幕网 | 一个人看的www免费视频在线观看 | 亚无码乱人伦一区二区 | 国产精品永久免费视频 | 精品国偷自产在线 | 无码人妻av免费一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 久久精品中文字幕一区 | 亚洲а∨天堂久久精品2021 | 99久久无码一区人妻 | 亚洲一区二区三区含羞草 | 成人亚洲精品久久久久软件 | 亚洲七七久久桃花影院 | 国语自产偷拍精品视频偷 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产亚洲tv在线观看 | 精品欧美一区二区三区久久久 | 国产精品久久国产三级国 | 亚洲自偷自拍另类第1页 | 大乳丰满人妻中文字幕日本 | 国产婷婷色一区二区三区在线 | 国产精品久久久一区二区三区 | 国产精品福利视频导航 | 荫蒂被男人添的好舒服爽免费视频 | 欧美性黑人极品hd | 日本大乳高潮视频在线观看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 小sao货水好多真紧h无码视频 | 丰满人妻精品国产99aⅴ | 人妻熟女一区 | 国产精品久久久久久久9999 | 国产人妻久久精品二区三区老狼 | 激情人妻另类人妻伦 | 超碰97人人做人人爱少妇 | 亚洲一区二区三区无码久久 | 男人的天堂av网站 | 亚洲狠狠婷婷综合久久 | 亚洲男人av香蕉爽爽爽爽 | 性欧美牲交xxxxx视频 | 国产精品香蕉在线观看 | 乱人伦人妻中文字幕无码久久网 | 久久99热只有频精品8 | 日韩av无码一区二区三区不卡 | 玩弄中年熟妇正在播放 | 老司机亚洲精品影院无码 | 亚洲中文字幕成人无码 | 欧洲vodafone精品性 | 色一情一乱一伦 | 精品久久8x国产免费观看 | 亚洲熟女一区二区三区 | 理论片87福利理论电影 | 中文字幕无码日韩欧毛 | 99在线 | 亚洲 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲中文字幕av在天堂 | 成人欧美一区二区三区 | 亚洲一区av无码专区在线观看 | 久久国产精品萌白酱免费 | 国内少妇偷人精品视频免费 | 一本久道久久综合婷婷五月 | 国产成人精品三级麻豆 | 99麻豆久久久国产精品免费 | 无码av岛国片在线播放 | 婷婷五月综合激情中文字幕 | 国产成人无码一二三区视频 | 狂野欧美激情性xxxx | av无码电影一区二区三区 | 久久人妻内射无码一区三区 | 性开放的女人aaa片 | 久久综合激激的五月天 | 国产精品二区一区二区aⅴ污介绍 | 国产成人精品无码播放 | 成人片黄网站色大片免费观看 | 两性色午夜视频免费播放 | 亚洲色大成网站www国产 | 亚洲理论电影在线观看 | 国产精品对白交换视频 | 国内揄拍国内精品少妇国语 | 在线看片无码永久免费视频 | 国产精品.xx视频.xxtv | 国产在线aaa片一区二区99 | 精品国产青草久久久久福利 | 久久久久久a亚洲欧洲av冫 | 午夜精品久久久久久久久 | 亚洲区欧美区综合区自拍区 | 一本久久伊人热热精品中文字幕 | 亚洲 a v无 码免 费 成 人 a v | 清纯唯美经典一区二区 | 亚洲经典千人经典日产 | 日本熟妇人妻xxxxx人hd | 乱人伦人妻中文字幕无码 | 亚洲a无码综合a国产av中文 | 国产精品va在线观看无码 | 四虎4hu永久免费 | 任你躁国产自任一区二区三区 | 曰韩无码二三区中文字幕 | 国产亚洲美女精品久久久2020 | 99久久精品无码一区二区毛片 | 永久免费精品精品永久-夜色 | 国产成人亚洲综合无码 | 成人免费视频在线观看 | 人妻天天爽夜夜爽一区二区 | 中文字幕无码人妻少妇免费 | 波多野结衣一区二区三区av免费 | 亚洲精品久久久久久一区二区 | 98国产精品综合一区二区三区 | 中文字幕久久久久人妻 | 正在播放老肥熟妇露脸 | 亚洲人成网站在线播放942 | 欧美性生交活xxxxxdddd | 婷婷色婷婷开心五月四房播播 | 少妇无码av无码专区在线观看 | 久久亚洲中文字幕精品一区 | 久久无码专区国产精品s | 国产情侣作爱视频免费观看 | 亚洲の无码国产の无码步美 | 国产精品国产自线拍免费软件 | 中文精品久久久久人妻不卡 | 亚洲欧美综合区丁香五月小说 | 国色天香社区在线视频 | 久久久国产一区二区三区 | 国产美女极度色诱视频www | 国内综合精品午夜久久资源 | 中国大陆精品视频xxxx | 日本丰满护士爆乳xxxx | 色窝窝无码一区二区三区色欲 | 亚洲伊人久久精品影院 | 国产小呦泬泬99精品 | 一本无码人妻在中文字幕免费 | 无码人妻久久一区二区三区不卡 | 沈阳熟女露脸对白视频 | 国产成人综合色在线观看网站 | 久久午夜无码鲁丝片 | 无码人妻丰满熟妇区五十路百度 | 乱中年女人伦av三区 | 人妻少妇精品久久 | 亚洲天堂2017无码 | 少妇激情av一区二区 | 精品国产精品久久一区免费式 | 国产办公室秘书无码精品99 | 97久久国产亚洲精品超碰热 | 亚洲色大成网站www国产 | 国产在线精品一区二区高清不卡 | 国产精品理论片在线观看 | 久久久久久国产精品无码下载 | 久久视频在线观看精品 | 久久久无码中文字幕久... | 狠狠色噜噜狠狠狠7777奇米 | 永久免费观看国产裸体美女 | 亚洲 欧美 激情 小说 另类 | 乌克兰少妇性做爰 | 国产成人综合色在线观看网站 | 亚洲高清偷拍一区二区三区 | 久久久亚洲欧洲日产国码αv | 婷婷六月久久综合丁香 | 亚洲成av人片在线观看无码不卡 | 亚洲午夜福利在线观看 | 熟妇人妻中文av无码 | 日韩少妇白浆无码系列 | www国产精品内射老师 | 精品国产青草久久久久福利 | 亚洲aⅴ无码成人网站国产app | 动漫av一区二区在线观看 | 少妇激情av一区二区 | 成人无码视频免费播放 | 无码人妻少妇伦在线电影 | 国产av一区二区精品久久凹凸 | 性色av无码免费一区二区三区 | 亚无码乱人伦一区二区 | 国产精品办公室沙发 | 欧美精品一区二区精品久久 | 婷婷五月综合激情中文字幕 | 亚洲中文字幕无码中字 | 国产办公室秘书无码精品99 | 精品夜夜澡人妻无码av蜜桃 | 少妇无套内谢久久久久 | 成人综合网亚洲伊人 | 九一九色国产 | 色综合天天综合狠狠爱 | 日本又色又爽又黄的a片18禁 | 波多野结衣av一区二区全免费观看 | 日本va欧美va欧美va精品 | 欧美国产亚洲日韩在线二区 | 无码国内精品人妻少妇 | 国产精品人人妻人人爽 | 国产福利视频一区二区 | 天干天干啦夜天干天2017 | 两性色午夜视频免费播放 | 国产在线一区二区三区四区五区 | 亚洲精品午夜国产va久久成人 | 亚洲综合在线一区二区三区 | 亚洲中文字幕av在天堂 | 亚洲日本在线电影 | 一本精品99久久精品77 | 日本一区二区更新不卡 | 亚洲欧洲日本无在线码 | 国产无遮挡又黄又爽免费视频 | 亚洲 另类 在线 欧美 制服 | 亚洲热妇无码av在线播放 | 小鲜肉自慰网站xnxx | 亚洲国产综合无码一区 | 日韩视频 中文字幕 视频一区 | 国产在线无码精品电影网 | 日韩欧美成人免费观看 | 中文无码精品a∨在线观看不卡 | 激情人妻另类人妻伦 | 亚洲综合久久一区二区 | 国产内射爽爽大片视频社区在线 | 国内少妇偷人精品视频免费 | 最近免费中文字幕中文高清百度 | 大肉大捧一进一出视频出来呀 | 精品久久久久久人妻无码中文字幕 | 少妇被粗大的猛进出69影院 | 精品国产成人一区二区三区 | 色婷婷香蕉在线一区二区 | 午夜男女很黄的视频 | 全球成人中文在线 | 老司机亚洲精品影院 | 曰韩少妇内射免费播放 | 欧美变态另类xxxx | 老熟女乱子伦 | 无码一区二区三区在线 | 国产熟妇另类久久久久 | 亚洲欧美色中文字幕在线 | 亚洲精品综合五月久久小说 | 亚洲一区二区三区无码久久 | 99精品国产综合久久久久五月天 | 熟女少妇人妻中文字幕 | 色欲综合久久中文字幕网 | 中文精品久久久久人妻不卡 | 国产亚洲美女精品久久久2020 | 日本www一道久久久免费榴莲 | 最新国产乱人伦偷精品免费网站 | 亚洲の无码国产の无码影院 | 麻豆果冻传媒2021精品传媒一区下载 | 暴力强奷在线播放无码 | 帮老师解开蕾丝奶罩吸乳网站 | 久久久久久a亚洲欧洲av冫 | 国产另类ts人妖一区二区 | 亚洲午夜无码久久 | 青青青手机频在线观看 | 永久免费观看国产裸体美女 | 帮老师解开蕾丝奶罩吸乳网站 | 天天拍夜夜添久久精品 | 在线播放亚洲第一字幕 | 国产suv精品一区二区五 | 午夜精品一区二区三区在线观看 | 国产精品亚洲а∨无码播放麻豆 | 欧美老熟妇乱xxxxx | 无码人妻黑人中文字幕 | 国产真实乱对白精彩久久 | 国产精品亚洲专区无码不卡 | 国产莉萝无码av在线播放 | 日韩亚洲欧美中文高清在线 | 精品成在人线av无码免费看 | 精品久久久久久人妻无码中文字幕 | 小sao货水好多真紧h无码视频 | 久久精品人妻少妇一区二区三区 | 亚洲天堂2017无码 | 国产suv精品一区二区五 | 2020最新国产自产精品 | 日日天日日夜日日摸 | 国产精品无码成人午夜电影 | 精品国产乱码久久久久乱码 | 小sao货水好多真紧h无码视频 | 97资源共享在线视频 | 欧美丰满熟妇xxxx | 性开放的女人aaa片 | 日韩精品乱码av一区二区 | 亚洲一区二区三区在线观看网站 | 精品厕所偷拍各类美女tp嘘嘘 | 大色综合色综合网站 | 四虎国产精品一区二区 | 国产在线精品一区二区高清不卡 | 欧美三级a做爰在线观看 | 欧美老妇与禽交 | 久久人妻内射无码一区三区 | 久青草影院在线观看国产 | 未满成年国产在线观看 | 国产一区二区三区精品视频 | 无码国产乱人伦偷精品视频 | 久久成人a毛片免费观看网站 | 极品尤物被啪到呻吟喷水 | 亚洲成av人片天堂网无码】 | 久久精品人妻少妇一区二区三区 | 特大黑人娇小亚洲女 | 一本大道伊人av久久综合 | 一区二区三区高清视频一 | 欧美日韩一区二区三区自拍 | 鲁一鲁av2019在线 | 无码人妻丰满熟妇区五十路百度 | 无遮挡国产高潮视频免费观看 | 天堂无码人妻精品一区二区三区 | 乱码av麻豆丝袜熟女系列 | 亚洲aⅴ无码成人网站国产app | 欧美亚洲日韩国产人成在线播放 | 88国产精品欧美一区二区三区 | 无码人妻久久一区二区三区不卡 | 啦啦啦www在线观看免费视频 | 7777奇米四色成人眼影 | 久久亚洲中文字幕精品一区 | 成人三级无码视频在线观看 | 好爽又高潮了毛片免费下载 | 国产亚洲精品久久久久久大师 | 99久久亚洲精品无码毛片 | 色五月丁香五月综合五月 | 日本肉体xxxx裸交 | aⅴ亚洲 日韩 色 图网站 播放 | 成人试看120秒体验区 | 大肉大捧一进一出视频出来呀 | 中文字幕+乱码+中文字幕一区 | 国产熟妇高潮叫床视频播放 | 中文字幕av无码一区二区三区电影 | 人妻少妇被猛烈进入中文字幕 |