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

Linux內核中的RCU鎖:解鎖高效并發的奧秘

系統 Linux
我們使用 RCU 來保護鏈表的訪問。添加節點時,我們不需要獲取鎖來保護共享資源。刪除節點時,我們使用了 list_del_rcu 來刪除節點,并使用 call_rcu 函數來安排釋放內存的回調函數。

在 Linux 內核這片充滿挑戰與機遇的技術海洋中,高效的并發控制始終是開發者們不懈追求的目標。多處理器環境下,數據的一致性與并發訪問的安全性,猶如兩座巍峨的高山,橫亙在每一位內核開發者的前行道路上。傳統的鎖機制,如自旋鎖、互斥鎖和讀寫鎖等,雖各有其用武之地,但在面對復雜多變的應用場景時,往往會暴露出性能瓶頸或使用局限性。

它以獨特的設計理念和巧妙的工作機制,在眾多鎖機制中脫穎而出,尤其在處理讀多寫少的場景時,展現出了無與倫比的性能優勢。從文件系統到網絡協議棧,從進程管理到內核數據結構維護,RCU 鎖的身影無處不在,默默支撐著 Linux 內核高效穩定地運行。今天,讓我們深入探討一種別具一格且高效強大的鎖機制 ——RCU 鎖。

一、RCU鎖的概述

RCU,即 Read - Copy - Update,從字面上看,它的操作似乎僅包含讀取、復制和更新三個簡單步驟,但實際機制遠比這復雜。它專為讀多寫少的場景而設計,核心思想是允許讀操作無鎖并發執行,極大地提升讀操作的效率。對于寫操作,它則采用了一種獨特的策略:先復制數據,在副本上進行修改,待所有讀操作完成后,再將新副本替換舊數據。

在 RCU 機制中,讀取共享數據結構的操作是無鎖的,因此讀取操作可以并發進行,不會相互干擾。寫入共享數據結構的操作則使用了延遲刪除的策略,即寫入操作并不直接修改共享數據結構,而是將要刪除的數據結構標記為“已刪除”,并在之后的某個時間點(通常是在不會干擾讀取操作的時候)真正刪除這些數據結構。

RCU 機制的實現依賴于一些底層機制,比如內存屏障、原子操作等。在 Linux 內核中,RCU 機制被廣泛應用于多個子系統,比如進程管理、網絡協議棧等,以提高內核的并發性能。

在RCU的實現過程中,我們主要解決以下問題:

  • 在讀取過程中,另外一個線程刪除了一個節點。刪除線程可以把這個節點從鏈表中移除,但它不能直接銷毀這個節點,必須等到所有的讀取線程讀取完成以后,才進行銷毀操作。RCU中把這個過程稱為寬限期(Grace period)。
  • 在讀取過程中,另外一個線程插入了一個新節點,而讀線程讀到了這個節點,那么需要保證讀到的這個節點是完整的。這里涉及到了發布-訂閱機制(Publish-Subscribe Mechanism)。
  • 保證讀取鏈表的完整性。新增或者刪除一個節點,不至于導致遍歷一個鏈表從中間斷開。但是RCU并不保證一定能讀到新增的節點或者不讀到要被刪除的節點。

二、RCU鎖的工作原理

RCU(Read-Copy Update),顧名思義就是讀-拷貝修改,它是基于其原理命名的。對于被RCU保護的共享數據結構,讀者不需要獲得任何鎖就可以訪問它,但寫者在訪問它時首先拷貝一個副本,然后對副本進行修改,最后使用一個回調(callback)機制在適當的時機把指向原來數據的指針重新指向新的被修改的數據。這個時機就是所有引用該數據的CPU都退出對共享數據的操作。

因此RCU實際上是一種改進的rwlock,讀者幾乎沒有什么同步開銷,它不需要鎖,不使用原子指令,而且在除alpha的所有架構上也不需要內存柵(Memory Barrier),因此不會導致鎖競爭,內存延遲以及流水線停滯。不需要鎖也使得使用更容易,因為死鎖問題就不需要考慮了。寫者的同步開銷比較大,它需要延遲數據結構的釋放,復制被修改的數據結構,它也必須使用某種鎖機制同步并行的其它寫者的修改操作。讀者必須提供一個信號給寫者以便寫者能夠確定數據可以被安全地釋放或修改的時機。

有一個專門的垃圾收集器來探測讀者的信號,一旦所有的讀者都已經發送信號告知它們都不在使用被RCU保護的數據結構,垃圾收集器就調用回調函數完成最后的數據釋放或修改操作。 RCU與rwlock的不同之處是:它既允許多個讀者同時訪問被保護的數據,又允許多個讀者和多個寫者同時訪問被保護的數據(注意:是否可以有多個寫者并行訪問取決于寫者之間使用的同步機制),讀者沒有任何同步開銷,而寫者的同步開銷則取決于使用的寫者間同步機制。但RCU不能替代rwlock,因為如果寫比較多時,對讀者的性能提高不能彌補寫者導致的損失。

讀者在訪問被RCU保護的共享數據期間不能被阻塞,這是RCU機制得以實現的一個基本前提,也就說當讀者在引用被RCU保護的共享數據期間,讀者所在的CPU不能發生上下文切換,spinlock和rwlock都需要這樣的前提。寫者在訪問被RCU保護的共享數據時不需要和讀者競爭任何鎖,只有在有多于一個寫者的情況下需要獲得某種鎖以與其他寫者同步。

寫者修改數據前首先拷貝一個被修改元素的副本,然后在副本上進行修改,修改完畢后它向垃圾回收器注冊一個回調函數以便在適當的時機執行真正的修改操作。等待適當時機的這一時期稱為grace period,而CPU發生了上下文切換稱為經歷一個quiescent state,grace period就是所有CPU都經歷一次quiescent state所需要的等待的時間。垃圾收集器就是在grace period之后調用寫者注冊的回調函數來完成真正的數據修改或數據釋放操作的。

要想使用好RCU,就要知道RCU的實現原理。我們拿linux 2.6.21 kernel的實現開始分析,為什么選擇這個版本的實現呢?因為這個版本的實現相對較為單純,也比較簡單。當然之后內核做了不少改進,如搶占RCU、可睡眠RCU、分層RCU。但是基本思想都是類似的。所以先從簡單入手。

首先,我們提到的寫者在訪問它時首先拷貝一個副本,然后對副本進行修改,最后使用一個回調(callback)機制在適當的時機把指向原來數據的指針重新指向新的被修改的數據。而這個“適當的時機”就是所有CPU經歷了一次進程切換(也就是一個grace period)。

為什么這么設計?

因為RCU讀者的實現就是關搶占執行讀取,讀完了當然就可以進程切換了,也就等于是寫者可以操作臨界區了。

那么就自然可以想到,內核會設計兩個元素,來分別表示寫者被掛起的起始點,以及每cpu變量,來表示該cpu是否經過了一次進程切換(quies state)。

就是說,當寫者被掛起后要以下步驟:

  1. 重置每cpu變量,值為0。
  2. 當某個cpu經歷一次進程切換后,就將自己的變量設為1。
  3. 當所有的cpu變量都為1后,就可以喚醒寫者了。

下面我們來分別看linux里是如何完成這三步的:

我們從一個例子入手,這個例子來源于linux kernel文檔中的whatisRCU.txt。這個例子使用RCU的核心API來保護一個指向動態分配內存的全局指針。

struct foo {  
    int a;  
    char b;  
    long c;  
};  

DEFINE_SPINLOCK(foo_mutex);  

struct foo *gbl_foo;  

void foo_read (void)  
{  
    foo *fp = gbl_foo;  
    if ( fp != NULL )  
        dosomething(fp->a, fp->b , fp->c );  
}  

void foo_update( foo* new_fp )  
{  
    spin_lock(&foo_mutex);  
    foo *old_fp = gbl_foo;  
    gbl_foo = new_fp;  
    spin_unlock(&foo_mutex);  
    kfee(old_fp);  
}

如上代碼所示,RCU被用來保護全局指針struct foo *gbl_foo,foo_get_a()用來從RCU保護的結構中取得gbl_foo的值。而foo_update_a()用來更新被RCU保護的gbl_foo的值(更新其a成員)。首先,我們思考一下,為什么要在foo_update_a()中使用自旋鎖foo_mutex呢?假設中間沒有使用自旋鎖.那foo_update_a()的代碼如下:

void foo_read(void)
{
 rcu_read_lock();
 foo *fp = gbl_foo;
 if ( fp != NULL )
 dosomething(fp->a,fp->b,fp->c);
 rcu_read_unlock();
}

void foo_update( foo* new_fp )
{
 spin_lock(&foo_mutex);
 foo *old_fp = gbl_foo;
 gbl_foo = new_fp;
 spin_unlock(&foo_mutex);
 synchronize_rcu();
 kfee(old_fp);
}

假設A進程在上圖—-標識處被B進程搶點.B進程也執行了goo_ipdate_a().等B執行完后,再切換回A進程.此時,A進程所持的old_fd實際上已經被B進程給釋放掉了.此后A進程對old_fd的操作都是非法的。所以在此我們得到一個重要結論:RCU允許多個讀者同時訪問被保護的數據,也允許多個讀者在有寫者時訪問被保護的數據(但是注意:是否可以有多個寫者并行訪問取決于寫者之間使用的同步機制)。

說明:本文中說的進程不是用戶態的進程,而是內核的調用路徑,也可能是內核線程或軟中斷等。

三、RCU的核心機制

寬限期的確定是 RCU 鎖實現的難點與核心。為了準確判斷寬限期,RCU 機制有以下限制:

  • 禁止內核搶占:在使用 RCU 鎖前,必須禁止內核搶占。這意味著 CPU 不能隨意調度到其他線程,只能等待當前線程離開臨界區(不再引用舊數據)才能進行調度。
  • 臨界區內限制:在 RCU 鎖保護的臨界區中,不能使用可能觸發調度的函數。因為一旦發生調度,就意味著當前線程已經退出了臨界區,不再引用舊數據。

當所有 CPU 都至少發生過一次調度時,就可以確定沒有任何線程再引用舊數據,此時寬限期結束,寫者便可以安全地釋放舊數據。

四、RCU鎖的使用場景

(1)文件系統

在 Linux 文件系統中,RCU 鎖有著廣泛的應用。例如,當多個進程同時讀取文件系統的目錄結構時,讀操作可以并行進行,而當需要對目錄結構進行修改(如創建新文件、刪除文件等)時,寫操作會在確保所有讀操作完成后進行,保證了文件系統的一致性,同時提升了整體性能。

(2)網絡協議棧

在網絡協議棧中,對于一些只讀的網絡配置信息(如路由表),讀操作頻繁,而寫操作相對較少。使用 RCU 鎖可以讓多個網絡數據包處理線程快速讀取路由信息,而當網絡管理員需要修改路由配置時,寫操作會在合適的時機進行,避免了讀操作的阻塞。

(3)內核數據結構管理

Linux 內核在管理進程表、inode 表等數據結構時,也常常借助 RCU 鎖。以進程表為例,眾多線程可能頻繁讀取進程信息,而對進程表的修改(如進程創建、銷毀)相對較少。通過 RCU 鎖,讀操作可以高效進行,寫操作也能在不影響讀性能的前提下有序完成。

五、RCU鎖的優勢

(1)高性能讀操作

由于讀操作無需加鎖,在高并發讀的場景下,RCU 鎖能夠顯著提高系統的性能。相比傳統的鎖機制,讀操作的延遲大大降低,吞吐量顯著提升。

(2)減少鎖爭用

在多處理器環境下,鎖爭用是影響性能的重要因素。RCU 鎖減少了讀操作和寫操作之間的鎖爭用,使得系統能夠更好地利用多核處理器的性能。

(3)簡化代碼設計

對于讀多寫少的場景,使用 RCU 鎖可以簡化代碼的同步邏輯。讀端代碼無需復雜的鎖獲取和釋放操作,使代碼更加簡潔明了,易于維護。

六、在Linux內核中使用RCU鎖

在 Linux 內核中,使用 RCU 鎖需要遵循特定的 API:

讀端 API:

  • rcu_read_lock():用于進入RCU讀臨界區,本質上是禁止CPU搶占。
  • rcu_read_unlock():用于離開RCU讀臨界區,開啟CPU搶占。

寫端 API:

  • synchronize_rcu():等待寬限期結束,確保所有已開始的 RCU 讀操作完成。
  • call_rcu():用于延遲執行函數,通常用于釋放數據結構或對象,在寬限期結束后執行。
  • kfree_rcu():call_rcu()的特殊情況,專門用于釋放動態分配的內存。

RCU 示例:

#include <linux/module.h>
#include <linux/rcupdate.h>

struct my_node {
    int val;
    struct rcu_head rcu;
    struct list_head list;
};

LIST_HEAD(my_list);

/* 添加一個節點到鏈表中 */
void add_node(int val)
{
    struct my_node *new_node = kmalloc(sizeof(*new_node), GFP_KERNEL);
    if (!new_node) {
        printk(KERN_ERR "Failed to allocate memory for new node\n");
        return;
    }

    new_node->val = val;
    INIT_LIST_HEAD(&new_node->list);

    /* 加入鏈表 */
    list_add(&new_node->list, &my_list);
}

/* 刪除值為 val 的節點 */
void del_node(int val)
{
    struct my_node *node, *tmp;

    /* 遍歷鏈表并刪除匹配節點 */
    list_for_each_entry_safe(node, tmp, &my_list, list) {
        if (node->val == val) {
            list_del_rcu(&node->list);
            call_rcu(&node->rcu, kfree);
        }
    }
}

/* 遍歷整個鏈表,打印節點的值 */
void traverse_list(void)
{
    struct my_node *node;

    /* 進入 RCU 讀取臨界區 */
    rcu_read_lock();

    /* 遍歷鏈表并打印節點的值 */
    list_for_each_entry_rcu(node, &my_list, list) {
        printk(KERN_INFO "Node value: %d\n", node->val);
    }

    /* 離開 RCU 讀取臨界區 */
    rcu_read_unlock();
}

示例中,我們使用 RCU 來保護鏈表的訪問。添加節點時,我們不需要獲取鎖來保護共享資源。刪除節點時,我們使用了 list_del_rcu 來刪除節點,并使用 call_rcu 函數來安排釋放內存的回調函數。在遍歷鏈表時,我們使用了 rcu_read_lock 和 rcu_read_unlock 來進入和離開 RCU 讀取臨界區。

責任編輯:武曉燕 來源: 深度Linux
相關推薦

2025-03-31 00:01:12

2023-11-22 13:18:02

Linux調度

2024-02-02 18:29:54

C++線程編程

2025-09-15 01:45:00

2024-03-05 09:55:00

C++右值引用開發

2023-11-09 15:28:32

Spring開發

2024-07-12 15:27:58

2009-10-29 09:41:01

Linux內核DeviceMappe

2024-02-29 09:44:36

Java工具

2024-07-25 11:53:53

2023-09-26 11:34:56

Python

2024-01-22 09:00:00

編程C++代碼

2024-08-13 09:39:13

2023-11-03 08:32:53

Flask高并發

2009-09-28 10:09:09

Linux內核Linux循環鏈表

2023-05-15 08:58:41

塊設備驅動Linux

2011-01-14 13:50:37

2023-11-24 11:15:21

協程編程

2025-04-28 02:22:00

2017-09-04 15:15:48

Linux內核內存屏障
點贊
收藏

51CTO技術棧公眾號

色欧美88888久久久久久影院| 久久久久一区| 日韩欧美一区二区在线视频| 成人免费a级片| 亚洲AV无码精品自拍| 9色精品在线| 亚洲偷欧美偷国内偷| 中文字幕免费高清在线| 超碰在线资源| 26uuu另类欧美亚洲曰本| 国产欧美亚洲视频| 日韩欧美亚洲国产| 成人直播大秀| 亚洲第一二三四五区| 日本久久久久久久久久久久| 色在线视频网| 国产视频一区不卡| 99电影网电视剧在线观看| 四虎精品永久在线| 亚洲激情中文在线| 日韩电影中文字幕av| 日韩成人精品视频在线观看| 免费看男女www网站入口在线| 国产精品美女久久久久久 | 国产一区二区色噜噜| 亚洲资源中文字幕| 亚洲欧美日韩综合一区| 天天操天天干天天爽| 国产一区亚洲一区| 热久久这里只有| 精品99在线观看| 色欧美自拍视频| 亚洲欧美国产一本综合首页| 在线观看你懂的视频| 国产欧美自拍| 91精品91久久久中77777| 免费av手机在线观看| 亚洲综合图区| 综合久久久久久| 亚洲高清不卡一区| 精品久久久久一区二区三区| 波多野结衣在线一区| 99在线观看视频网站| 91在线精品入口| 蜜桃av一区二区在线观看| 日韩av免费在线观看| av大片免费在线观看| 精品动漫3d一区二区三区免费| 久热精品视频在线观看| 欧美一区二区三区粗大| 国产不卡av一区二区| 日韩精品在线观| 韩国无码一区二区三区精品| 美国一区二区| 日韩精品高清在线| 日本xxx在线播放| 视频小说一区二区| 日韩成人在线网站| 男男一级淫片免费播放| 成人中文字幕视频| 亚洲成人在线网| 激情小说欧美色图| silk一区二区三区精品视频| 亚洲成色777777在线观看影院| 欧美一区二区三区影院| 91成人精品在线| 亚洲激情视频网| 亚洲男人在线天堂| 亚洲婷婷丁香| 中文字幕精品久久久久| 来吧亚洲综合网| 午夜国产欧美理论在线播放| 欧美精品久久久久久久| www日韩精品| 狂野欧美一区| 91精品国产综合久久久久久蜜臀| 国产精品一区二区人人爽| 国产精品18久久久久久久久| 国产在线欧美日韩| 撸视在线观看免费视频| 国产精品国产三级国产有无不卡 | 亚洲а∨天堂久久精品2021| 成人在线免费小视频| 欧美老少做受xxxx高潮| av资源免费观看| 日本视频在线一区| 亚洲va久久久噜噜噜| 日本免费不卡视频| 欧美国产视频在线| 日韩精品手机在线观看| 神马久久午夜| 5月丁香婷婷综合| 亚洲精品国产成人av在线| 亚洲小说图片| 久色乳综合思思在线视频| 国产成人自拍视频在线| 久久99精品久久久| 国产在线精品一区| 老司机福利在线视频| 黄色成人av网| jizzzz日本| 猫咪成人在线观看| 日韩一区二区三区国产| 日本网站在线免费观看| 免费成人你懂的| 国产欧美日韩亚洲| 日本三级视频在线播放| 黑人精品xxx一区一二区| 性欧美在线视频| 美女亚洲一区| 久久久亚洲网站| 国产又黄又猛又爽| 91浏览器在线视频| 国产亚洲精品久久久久久久| 国产私拍福利精品视频二区| 精品久久久三级丝袜| 欧美精品日韩在线| 国产麻豆综合| 国产乱码精品一区二区三区日韩精品 | 日本少妇激情视频| 激情小说亚洲一区| 日韩欧美一区二区三区四区五区| 不卡av免费观看| 欧美日韩国产高清一区二区三区 | 福利视频第一区| 色哟哟免费视频| 手机在线电影一区| 日本午夜在线亚洲.国产| 亚洲精品久久久久久久久久 | 中文字幕一区二区人妻视频| 丁香天五香天堂综合| 自拍视频一区二区三区| 福利一区二区免费视频| 亚洲欧美日韩一区在线| 你懂的国产视频| 国产+成+人+亚洲欧洲自线| 在线看无码的免费网站| 成人亚洲免费| 中文字幕亚洲综合久久筱田步美| 亚洲 日本 欧美 中文幕| 91影院在线观看| 一二三四视频社区在线| 精品欧美午夜寂寞影院| 久久久久久91香蕉国产| 亚洲av少妇一区二区在线观看| 日韩美女精品在线| 成人综合久久网| 99视频精品视频高清免费| 国产精品久久久久久久久久三级| 日韩精品视频在线观看一区二区三区| 亚洲成人动漫av| 天天躁日日躁狠狠躁av麻豆男男 | 中文字幕在线不卡| 国产精品一区二区小说| 日韩精品免费一区二区在线观看| 国产精品久久久久久久久久久不卡| 黄色片在线看| 欧美亚洲综合色| 波兰性xxxxx极品hd| 久久精品99国产精品日本| 亚洲精品中文字幕乱码三区不卡| 九九九精品视频| x99av成人免费| 精品久久人妻av中文字幕| 一区二区三区四区高清精品免费观看| 免费黄色av网址| 99热在线精品观看| 日本午夜精品电影| 成人在线视频观看| 久久精品人人做人人爽| 亚洲高清在线观看视频| 欧美视频专区一二在线观看| 亚洲国产av一区| 久久精品国内一区二区三区| 超碰超碰超碰超碰超碰| 欧美日韩精品一区二区三区在线观看| 欧洲亚洲女同hd| 性开放的欧美大片| 欧美成人艳星乳罩| 毛片毛片女人毛片毛片| 国产精品污www在线观看| 三日本三级少妇三级99| 99精品免费视频| 亚洲国产欧美日韩| 日韩在线成人| 97婷婷大伊香蕉精品视频| 国产在线播放av| 欧美一级搡bbbb搡bbbb| 你懂的国产在线| 亚洲欧洲在线观看av| 亚洲一二三四五| 奇米亚洲午夜久久精品| 精品人妻人人做人人爽| 亚洲人成网亚洲欧洲无码| 92看片淫黄大片欧美看国产片| 国产精品一二三产区| 日韩中文字幕在线精品| 人妻91麻豆一区二区三区| 欧美性大战xxxxx久久久| 九九久久免费视频| 国产午夜久久久久| 国产sm在线观看| 奇米综合一区二区三区精品视频| 日本精品久久久久久久久久| 日韩精品水蜜桃| 久久99精品久久久久久青青日本| 91精品福利观看| 清纯唯美日韩制服另类| 日韩精品分区| 日韩中文字幕精品| 免费在线观看污视频| 欧美一区二区三区在线观看| 免费无码国产精品| 亚洲韩国精品一区| 美国黄色片视频| 久久久久99精品国产片| 国产综合内射日韩久| 国产综合久久久久久久久久久久| 日本wwww视频| 亚洲精品资源| 少妇久久久久久被弄到高潮| 日韩1区2区| 日韩欧美激情一区二区| 五月激激激综合网色播| 粉嫩av四季av绯色av第一区 | 精品国产91亚洲一区二区三区www| 日韩五码电影| 国产精品视频男人的天堂| 超级碰碰久久| 97久久精品人人澡人人爽缅北| 在线观看电影av| 久久人人爽人人爽人人片亚洲| 成年人在线观看网站| 亚洲欧美日韩一区二区在线| 丝袜+亚洲+另类+欧美+变态| 亚洲成人精品在线| 欧美一级免费片| 欧美精品一区二区三区久久久| 999免费视频| 777a∨成人精品桃花网| 中文字幕有码无码人妻av蜜桃| 一本久道久久综合中文字幕| 国产九色在线播放九色| 黑人精品xxx一区一二区| 日本熟妇毛耸耸xxxxxx| 精品久久久久久久久中文字幕| 国产精品不卡av| 亚洲国产日韩在线一区模特| 精品一区二区三区人妻| 亚洲国产精品综合小说图片区| 欧美人妻精品一区二区三区| 亚洲综合色网站| 日本熟妇一区二区| 狠狠色狠狠色综合日日五| 欧美一级片免费在线观看| 欧美日韩国产精品一区| 中文字幕精品无码一区二区| 色视频欧美一区二区三区| 久久久久久无码精品大片| 欧美吞精做爰啪啪高潮| 国产美女永久免费| 欧美大胆一级视频| 欧美视频在线观看一区二区三区| 亚洲国产成人在线播放| 欧美性孕妇孕交| 少妇高潮久久77777| 黄色免费网站在线| 欧美激情中文字幕乱码免费| 超碰91在线观看| 国产精品久久久久av免费| 国产精品久久免费视频| 国产精品免费视频一区二区 | 亚洲欧洲在线看| 天堂а√在线官网| 欧美精品video| 国产精品专区免费| 国产综合色香蕉精品| 一区二区三区四区精品视频 | 户外极限露出调教在线视频| 日韩一区二区三区xxxx| 人人澡人人添人人爽一区二区| 91国产精品91| 欧美aaaaaaaa| 国产乱码精品一区二区三区日韩精品| 国产一区99| 青青在线免费视频| 久久国产精品99国产| aaa一级黄色片| 99re视频这里只有精品| 欧美激情视频二区| 亚洲一区二区三区影院| 国产美女www爽爽爽| 欧美不卡一区二区三区四区| 激情小视频在线| 久久99精品视频一区97| 日韩av超清在线观看| 97人摸人人澡人人人超一碰| 免费看av成人| 福利在线小视频| 日本欧洲一区二区| 国产精品果冻传媒| 国产精品久久久久久久蜜臀| 国产第一页在线播放| 欧美狂野另类xxxxoooo| 日韩av免费观影| 欧美理论电影在线播放| 国产精品久久久久久久久久齐齐| 狠狠色噜噜狠狠狠狠色吗综合| 国产精品99一区二区三| 成人小视频在线看| 丁香六月综合激情| 性生交大片免费全黄| 在线视频亚洲一区| 天堂在线视频网站| 久久99热精品这里久久精品| 成人黄色在线| 女人一区二区三区| 影音先锋久久久| 久久精品一二三四| 国产精品久久久久久久久久久免费看| 五月天婷婷久久| 精品国产成人系列| 五月花成人网| 亚洲在线视频观看| 99热在线成人| 在线观看日本一区二区| 国产无人区一区二区三区| 日韩精品久久久久久久| 精品日韩一区二区三区免费视频| 麻豆视频在线观看免费网站| 国产精品久久久久久久久免费| 妖精一区二区三区精品视频| 给我免费播放片在线观看| 国产成人av电影| 九九视频免费在线观看| 欧美一区二区三区免费在线看| 日本激情在线观看| 国产精品老女人视频| jvid福利在线一区二区| 热久久精品免费视频| 国产三级一区二区| 日韩一级片中文字幕| 亚洲香蕉在线观看| 中文字幕系列一区| 亚洲精品国产精品国自产| 日韩精品乱码av一区二区| 久久精品视频18| 欧美午夜精品免费| 日日夜夜精品一区| 成人午夜激情网| 一区二区中文| 久久精品无码专区| 欧美日韩黄色大片| 男男电影完整版在线观看| 国产精品r级在线| 日韩欧美网址| 永久av免费在线观看| 亚洲第一福利视频在线| 午夜在线视频免费| 日韩免费观看高清| 日本一区二区在线看| 999热精品视频| 亚洲成av人**亚洲成av**| 四虎在线视频免费观看| 日本高清不卡在线| 欧美午夜精彩| 天天操夜夜操很很操| 亚洲电影中文字幕在线观看| 午夜性色福利影院| 国产精品视频男人的天堂| 66国产精品| 熟女人妻在线视频| 欧美性猛交xxxxxxxx| 国产成人在线视频免费观看| 国产精品毛片va一区二区三区| 国产一区二区三区成人欧美日韩在线观看| 中日韩精品一区二区三区| 欧美日韩久久久一区| 最新日本在线观看| 欧美1o一11sex性hdhd| 久热成人在线视频| 懂色av.com| 在线午夜精品自拍| 国产成人精品亚洲线观看| 91蝌蚪视频在线观看| 亚洲欧美日韩国产综合| 天堂av在线免费观看| 成人免费网站在线观看| 国产亚洲福利| 黄色录像一级片| 日韩av综合中文字幕| 99精品视频在线免费播放| 亚洲熟妇国产熟妇肥婆| 中文一区二区在线观看| 蜜桃91麻豆精品一二三区| 国产精品久久久久77777| 亚洲精品极品| 亚洲一级生活片| 亚洲欧美激情一区| 日本一区二区三区电影免费观看|