国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Linux 原生 AIO 實(shí)現(xiàn)(Native AIO)

共 11599字,需瀏覽 24分鐘

 ·

2021-03-27 14:27

上一篇文章 主要分析了 Linux 原生 AIO 的原理和使用,而這篇要介紹的是 Linux 原生 AIO 的實(shí)現(xiàn)過(guò)程。

本文基于 Linux-2.6.0 版本內(nèi)核源碼

一般來(lái)說(shuō),使用 Linux 原生 AIO 需要 3 個(gè)步驟:

  • 1) 調(diào)用 io_setup 函數(shù)創(chuàng)建一個(gè)一般 IO 上下文。

  • 2) 調(diào)用 io_submit 函數(shù)向內(nèi)核提交一個(gè)異步 IO 操作。

  • 3) 調(diào)用 io_getevents 函數(shù)獲取異步 IO 操作結(jié)果。

所以,我們可以通過(guò)分析這三個(gè)函數(shù)的實(shí)現(xiàn)來(lái)理解 Linux 原生 AIO 的實(shí)現(xiàn)。

Linux 原生 AIO 實(shí)現(xiàn)在源碼文件 /fs/aio.c 中。

創(chuàng)建異步 IO 上下文

要使用 Linux 原生 AIO,首先需要?jiǎng)?chuàng)建一個(gè)異步 IO 上下文,在內(nèi)核中,異步 IO 上下文使用 kioctx 結(jié)構(gòu)表示,定義如下:

struct kioctx {    atomic_t                users;    // 引用計(jì)數(shù)器    int                     dead;     // 是否已經(jīng)關(guān)閉    struct mm_struct        *mm;      // 對(duì)應(yīng)的內(nèi)存管理對(duì)象
unsigned long user_id; // 唯一的ID,用于標(biāo)識(shí)當(dāng)前上下文, 返回給用戶 struct kioctx *next;
wait_queue_head_t wait; // 等待隊(duì)列 spinlock_t ctx_lock; // 鎖
int reqs_active; // 正在進(jìn)行的異步IO請(qǐng)求數(shù) struct list_head active_reqs; // 正在進(jìn)行的異步IO請(qǐng)求對(duì)象 struct list_head run_list;
unsigned max_reqs; // 最大IO請(qǐng)求數(shù)
struct aio_ring_info ring_info; // 環(huán)形緩沖區(qū)
struct work_struct wq;};

kioctx 結(jié)構(gòu)中,比較重要的成員為 active_reqsring_info。active_reqs 保存了所有正在進(jìn)行的異步 IO 操作,而 ring_info 成員用于存放異步 IO 操作的結(jié)果。

kioctx 結(jié)構(gòu)如 圖1 所示:

如 圖1 所示,active_reqs 成員保存的異步 IO 操作隊(duì)列是以 kiocb 結(jié)構(gòu)為單元的,而 ring_info 成員指向一個(gè)類型為 aio_ring_info 結(jié)構(gòu)的環(huán)形緩沖區(qū)(Ring Buffer)。

所以我們先來(lái)看看 kiocb 結(jié)構(gòu)和 aio_ring_info 結(jié)構(gòu)的定義:

struct kiocb {    ...    struct file         *ki_filp;      // 異步IO操作的文件對(duì)象    struct kioctx       *ki_ctx;       // 指向所屬的異步IO上下文    ...    struct list_head    ki_list;       // 用于連接所有正在進(jìn)行的異步IO操作對(duì)象    __u64               ki_user_data;  // 用戶提供的數(shù)據(jù)指針(可用于區(qū)分異步IO操作)    loff_t              ki_pos;        // 異步IO操作的文件偏移量    ...};

kiocb 結(jié)構(gòu)比較簡(jiǎn)單,主要用于保存異步 IO 操作的一些信息,如:

  • ki_filp:用于保存進(jìn)行異步 IO 的文件對(duì)象。

  • ki_ctx:指向所屬的異步 IO 上下文對(duì)象。

  • ki_list:用于連接當(dāng)前異步 IO 上下文中的所有 IO 操作對(duì)象。

  • ki_user_data:這個(gè)字段主要提供給用戶自定義使用,比如區(qū)分異步 IO 操作,或者設(shè)置一個(gè)回調(diào)函數(shù)等。

  • ki_pos:用于保存異步 IO 操作的文件偏移量。

aio_ring_info 結(jié)構(gòu)是一個(gè)環(huán)形緩沖區(qū)的實(shí)現(xiàn),其定義如下:

struct aio_ring_info {    unsigned long       mmap_base;     // 環(huán)形緩沖區(qū)的虛擬內(nèi)存地址    unsigned long       mmap_size;     // 環(huán)形緩沖區(qū)的大小
struct page **ring_pages; // 環(huán)形緩沖區(qū)所使用的內(nèi)存頁(yè)數(shù)組 spinlock_t ring_lock; // 保護(hù)環(huán)形緩沖區(qū)的自旋鎖 long nr_pages; // 環(huán)形緩沖區(qū)所占用的內(nèi)存頁(yè)數(shù)
unsigned nr, tail;
// 如果環(huán)形緩沖區(qū)不大于 8 個(gè)內(nèi)存頁(yè)時(shí) // ring_pages 就指向 internal_pages 字段#define AIO_RING_PAGES 8 struct page *internal_pages[AIO_RING_PAGES]; };

這個(gè)環(huán)形緩沖區(qū)主要用于保存已經(jīng)完成的異步 IO 操作的結(jié)果,異步 IO 操作的結(jié)果使用 io_event 結(jié)構(gòu)表示。如 圖2 所示:

圖2 中的 head 代表環(huán)形緩沖區(qū)的開(kāi)始位置,而 tail 代表環(huán)形緩沖區(qū)的結(jié)束位置,如果 tail 大于 head,則表示有完成的異步 IO 操作結(jié)果可以獲取。如果 head 等于 tail,則表示沒(méi)有完成的異步 IO 操作。

環(huán)形緩沖區(qū)的 headtail 位置保存在 aio_ring 的結(jié)構(gòu)中,其定義如下:

struct aio_ring {    unsigned    id;    unsigned    nr;    // 環(huán)形緩沖區(qū)可容納的 io_event 數(shù)    unsigned    head;  // 環(huán)形緩沖區(qū)的開(kāi)始位置    unsigned    tail;  // 環(huán)形緩沖區(qū)的結(jié)束位置    ...};

上面介紹了那么多數(shù)據(jù)結(jié)構(gòu),只是為了接下來(lái)的源碼分析更加容易明白。

現(xiàn)在,我們開(kāi)始分析異步 IO 上下文的創(chuàng)建過(guò)程,異步 IO 上下文的創(chuàng)建通過(guò)調(diào)用 io_setup 函數(shù)完成,而 io_setup 函數(shù)會(huì)調(diào)用內(nèi)核函數(shù) sys_io_setup,其實(shí)現(xiàn)如下:

asmlinkage long sys_io_setup(unsigned nr_events, aio_context_t *ctxp){    struct kioctx *ioctx = NULL;    unsigned long ctx;    long ret;    ...    ioctx = ioctx_alloc(nr_events);  // 調(diào)用 ioctx_alloc 函數(shù)創(chuàng)建異步IO上下文    ret = PTR_ERR(ioctx);    if (!IS_ERR(ioctx)) {        ret = put_user(ioctx->user_id, ctxp); // 把異步IO上下文的標(biāo)識(shí)符返回給調(diào)用者        if (!ret)            return 0;        io_destroy(ioctx);    }out:    return ret;}

sys_io_setup 函數(shù)的實(shí)現(xiàn)比較簡(jiǎn)單,首先調(diào)用 ioctx_alloc 申請(qǐng)一個(gè)異步 IO 上下文對(duì)象,然后把異步 IO 上下文對(duì)象的標(biāo)識(shí)符返回給調(diào)用者。

所以,sys_io_setup 函數(shù)的核心過(guò)程是調(diào)用 ioctx_alloc  函數(shù),我們繼續(xù)分析 ioctx_alloc 函數(shù)的實(shí)現(xiàn):

static struct kioctx *ioctx_alloc(unsigned nr_events){    struct mm_struct *mm;    struct kioctx *ctx;    ...    ctx = kmem_cache_alloc(kioctx_cachep, GFP_KERNEL); // 申請(qǐng)一個(gè) kioctx 對(duì)象    ...    INIT_LIST_HEAD(&ctx->active_reqs);                 // 初始化異步 IO 操作隊(duì)列    ...    if (aio_setup_ring(ctx) < 0)                       // 初始化環(huán)形緩沖區(qū)        goto out_freectx;    ...    return ctx;    ...}

ioctx_alloc  函數(shù)主要完成以下工作:

  • 調(diào)用 kmem_cache_alloc 函數(shù)向內(nèi)核申請(qǐng)一個(gè)異步 IO 上下文對(duì)象。

  • 初始化異步 IO 上下文各個(gè)成員變量,如初始化異步 IO 操作隊(duì)列。

  • 調(diào)用 aio_setup_ring 函數(shù)初始化環(huán)形緩沖區(qū)。

環(huán)形緩沖區(qū)初始化函數(shù) aio_setup_ring 的實(shí)現(xiàn)有點(diǎn)小復(fù)雜,主要涉及內(nèi)存管理的知識(shí)點(diǎn),所以這里跳過(guò)這部分的分析,有興趣的可以私聊我一起討論。

提交異步 IO 操作

提交異步 IO 操作是通過(guò) io_submit 函數(shù)完成的,io_submit 需要提供一個(gè)類型為 iocb 結(jié)構(gòu)的數(shù)組,表示要進(jìn)行的異步 IO 操作相關(guān)的信息,我們先來(lái)看看 iocb 結(jié)構(gòu)的定義:

struct iocb {    __u64   aio_data;       // 用戶自定義數(shù)據(jù), 可用于標(biāo)識(shí)IO操作或者設(shè)置回調(diào)函數(shù)    ...    __u16   aio_lio_opcode; // IO操作類型, 如讀(IOCB_CMD_PREAD)或者寫(xiě)(IOCB_CMD_PWRITE)操作    __s16   aio_reqprio;    __u32   aio_fildes;     // 進(jìn)行IO操作的文件句柄    __u64   aio_buf;        // 進(jìn)行IO操作的緩沖區(qū)(如寫(xiě)操作的話就是寫(xiě)到文件的數(shù)據(jù))    __u64   aio_nbytes;     // 緩沖區(qū)的大小    __s64   aio_offset;     // IO操作的文件偏移量    ...};

io_submit 函數(shù)最終會(huì)調(diào)用內(nèi)核函數(shù) sys_io_submit 來(lái)實(shí)現(xiàn)提供異步 IO 操作,我們來(lái)分析 sys_io_submit 函數(shù)的實(shí)現(xiàn):

asmlinkage longsys_io_submit(aio_context_t ctx_id, long nr,               struct iocb __user **iocbpp){    struct kioctx *ctx;    long ret = 0;    int i;    ...    ctx = lookup_ioctx(ctx_id); // 通過(guò)異步IO上下文標(biāo)識(shí)符獲取異步IO上下文對(duì)象    ...    for (i = 0; i < nr; i++) {        struct iocb __user *user_iocb;        struct iocb tmp;
if (unlikely(__get_user(user_iocb, iocbpp+i))) { ret = -EFAULT; break; }
// 從用戶空間復(fù)制異步IO操作到內(nèi)核空間 if (unlikely(copy_from_user(&tmp, user_iocb, sizeof(tmp)))) { ret = -EFAULT; break; }
// 調(diào)用 io_submit_one 函數(shù)提交異步IO操作 ret = io_submit_one(ctx, user_iocb, &tmp); if (ret) break; }
put_ioctx(ctx); return i ? i : ret;}

sys_io_submit 函數(shù)的實(shí)現(xiàn)比較簡(jiǎn)單,主要從用戶空間復(fù)制異步 IO 操作信息到內(nèi)核空間,然后調(diào)用 io_submit_one 函數(shù)提交異步 IO 操作。我們重點(diǎn)分析 io_submit_one 函數(shù)的實(shí)現(xiàn):

int io_submit_one(struct kioctx *ctx,                   struct iocb __user *user_iocb,                  struct iocb *iocb){    struct kiocb *req;    struct file *file;    ssize_t ret;    char *buf;    ...    file = fget(iocb->aio_fildes);      // 通過(guò)文件句柄獲取文件對(duì)象    ...    req = aio_get_req(ctx);             // 獲取一個(gè)異步IO操作對(duì)象    ...    req->ki_filp = file;                // 要進(jìn)行異步IO的文件對(duì)象    req->ki_user_obj = user_iocb;       // 指向用戶空間的iocb對(duì)象    req->ki_user_data = iocb->aio_data; // 設(shè)置用戶自定義數(shù)據(jù)    req->ki_pos = iocb->aio_offset;     // 設(shè)置異步IO操作的文件偏移量
buf = (char *)(unsigned long)iocb->aio_buf; // 要進(jìn)行異步IO操作的數(shù)據(jù)緩沖區(qū)
// 根據(jù)不同的異步IO操作類型來(lái)進(jìn)行不同的處理 switch (iocb->aio_lio_opcode) { case IOCB_CMD_PREAD: // 異步讀操作 ... ret = -EINVAL; // 發(fā)起異步IO操作, 會(huì)根據(jù)不同的文件系統(tǒng)調(diào)用不同的函數(shù): // 如ext3文件系統(tǒng)會(huì)調(diào)用 generic_file_aio_read 函數(shù) if (file->f_op->aio_read) ret = file->f_op->aio_read(req, buf, iocb->aio_nbytes, req->ki_pos); break; ... } ... // 異步IO操作或許會(huì)在調(diào)用 aio_read 時(shí)已經(jīng)完成, 或者會(huì)被添加到IO請(qǐng)求隊(duì)列中。 // 所以, 如果異步IO操作被提交到IO請(qǐng)求隊(duì)列中, 直接返回 if (likely(-EIOCBQUEUED == ret)) return 0;
aio_complete(req, ret, 0); // 如果IO操作已經(jīng)完成, 調(diào)用 aio_complete 函數(shù)完成收尾工作 return 0;}

上面代碼已經(jīng)對(duì) io_submit_one 函數(shù)進(jìn)行了詳細(xì)的注釋,這里總結(jié)一下 io_submit_one 函數(shù)主要完成的工作:

  • 通過(guò)調(diào)用 fget 函數(shù)獲取文件句柄對(duì)應(yīng)的文件對(duì)象。

  • 調(diào)用 aio_get_req 函數(shù)獲取一個(gè)類型為 kiocb 結(jié)構(gòu)的異步 IO 操作對(duì)象,這個(gè)結(jié)構(gòu)前面已經(jīng)分析過(guò)。另外,aio_get_req 函數(shù)還會(huì)把異步 IO 操作對(duì)象添加到異步 IO 上下文的 active_reqs 隊(duì)列中。

  • 根據(jù)不同的異步 IO 操作類型來(lái)進(jìn)行不同的處理,如 異步讀操作 會(huì)調(diào)用文件對(duì)象的 aio_read 方法來(lái)進(jìn)行處理。不同的文件系統(tǒng),其 aio_read 方法的實(shí)現(xiàn)不一樣,如 Ext3 文件系統(tǒng)的 aio_read 方法會(huì)指向 generic_file_aio_read 函數(shù)。

  • 如果異步 IO 操作被添加到內(nèi)核的 IO 請(qǐng)求隊(duì)列中,那么就直接返回。否則就代表 IO 操作已經(jīng)完成,那么就調(diào)用 aio_complete 函數(shù)完成收尾工作。

io_submit_one 函數(shù)的操作過(guò)程如 圖3 所示:

所以,io_submit_one 函數(shù)的主要任務(wù)就是向內(nèi)核提交 IO 請(qǐng)求。

異步 IO 操作完成

當(dāng)異步 IO 操作完成后,內(nèi)核會(huì)調(diào)用 aio_complete 函數(shù)來(lái)把處理結(jié)果放進(jìn)異步 IO 上下文的環(huán)形緩沖區(qū) ring_info 中,我們來(lái)分析一下 aio_complete 函數(shù)的實(shí)現(xiàn):

int aio_complete(struct kiocb *iocb, long res, long res2){    struct kioctx *ctx = iocb->ki_ctx;    struct aio_ring_info *info;    struct aio_ring *ring;    struct io_event *event;    unsigned long flags;    unsigned long tail;    int ret;    ...    info = &ctx->ring_info; // 環(huán)形緩沖區(qū)對(duì)象
spin_lock_irqsave(&ctx->ctx_lock, flags); // 對(duì)異步IO上下文進(jìn)行上鎖 ring = kmap_atomic(info->ring_pages[0], KM_IRQ1); // 對(duì)內(nèi)存頁(yè)進(jìn)行虛擬內(nèi)存地址映射
tail = info->tail; // 環(huán)形緩沖區(qū)下一個(gè)空閑的位置 event = aio_ring_event(info, tail, KM_IRQ0); // 從環(huán)形緩沖區(qū)獲取空閑的位置保存結(jié)果 tail = (tail + 1) % info->nr; // 更新下一個(gè)空閑的位置
// 保存異步IO結(jié)果到環(huán)形緩沖區(qū)中 event->obj = (u64)(unsigned long)iocb->ki_user_obj; event->data = iocb->ki_user_data; event->res = res; event->res2 = res2; ... info->tail = tail; ring->tail = tail; // 更新環(huán)形緩沖區(qū)下一個(gè)空閑的位置
put_aio_ring_event(event, KM_IRQ0); // 解除虛擬內(nèi)存地址映射 kunmap_atomic(ring, KM_IRQ1); // 解除虛擬內(nèi)存地址映射
// 釋放異步IO對(duì)象 ret = __aio_put_req(ctx, iocb); spin_unlock_irqrestore(&ctx->ctx_lock, flags); ... return ret;}

aio_complete 函數(shù)的 iocb 參數(shù)是我們通過(guò)調(diào)用 io_submit_once 函數(shù)提交的異步 IO 對(duì)象,而參數(shù) resres2 是用內(nèi)核進(jìn)行 IO 操作完成后返回的結(jié)果。

aio_complete 函數(shù)的主要工作如下:

  • 根據(jù)環(huán)形緩沖區(qū)的 tail 指針獲取一個(gè)空閑的 io_event 對(duì)象來(lái)保存 IO 操作的結(jié)果。

  • 對(duì)環(huán)形緩沖區(qū)的 tail 指針進(jìn)行加一操作,指向下一個(gè)空閑的位置。

當(dāng)把異步 IO 操作的結(jié)果保存到環(huán)形緩沖區(qū)后,用戶層就可以通過(guò)調(diào)用 io_getevents 函數(shù)來(lái)讀取 IO 操作的結(jié)果,io_getevents 函數(shù)最終會(huì)調(diào)用 sys_io_getevents 函數(shù)。

我們來(lái)分析 sys_io_getevents 函數(shù)的實(shí)現(xiàn):

asmlinkage long sys_io_getevents(aio_context_t ctx_id,                                 long min_nr,                                 long nr,                                 struct io_event *events,                                 struct timespec *timeout){    struct kioctx *ioctx = lookup_ioctx(ctx_id);    long ret = -EINVAL;    ...    if (likely(NULL != ioctx)) {        // 調(diào)用 read_events 函數(shù)讀取IO操作的結(jié)果        ret = read_events(ioctx, min_nr, nr, events, timeout);        put_ioctx(ioctx);    }    return ret;}

從上面的代碼可以看出,sys_io_getevents 函數(shù)主要調(diào)用 read_events 函數(shù)來(lái)讀取異步 IO 操作的結(jié)果,我們接著分析 read_events 函數(shù):

static int read_events(struct kioctx *ctx,                      long min_nr, long nr,                      struct io_event *event,                      struct timespec *timeout){    long start_jiffies = jiffies;    struct task_struct *tsk = current;    DECLARE_WAITQUEUE(wait, tsk);    int ret;    int i = 0;    struct io_event ent;    struct timeout to;
memset(&ent, 0, sizeof(ent)); ret = 0;
while (likely(i < nr)) { ret = aio_read_evt(ctx, &ent); // 從環(huán)形緩沖區(qū)中讀取一個(gè)IO處理結(jié)果 if (unlikely(ret <= 0)) // 如果環(huán)形緩沖區(qū)沒(méi)有IO處理結(jié)果, 退出循環(huán) break;
ret = -EFAULT; // 把IO處理結(jié)果復(fù)制到用戶空間 if (unlikely(copy_to_user(event, &ent, sizeof(ent)))) { break; }
ret = 0; event++; i++; }
if (min_nr <= i) return i; if (ret) return ret; ...}

read_events 函數(shù)主要還是調(diào)用 aio_read_evt 函數(shù)來(lái)從環(huán)形緩沖區(qū)中讀取異步 IO 操作的結(jié)果,如果讀取成功,就把結(jié)果復(fù)制到用戶空間中。

aio_read_evt 函數(shù)是從環(huán)形緩沖區(qū)中讀取異步 IO 操作的結(jié)果,其實(shí)現(xiàn)如下:

static int aio_read_evt(struct kioctx *ioctx, struct io_event *ent){    struct aio_ring_info *info = &ioctx->ring_info;    struct aio_ring *ring;    unsigned long head;    int ret = 0;
ring = kmap_atomic(info->ring_pages[0], KM_USER0);
// 如果環(huán)形緩沖區(qū)的head指針與tail指針相等, 代表環(huán)形緩沖區(qū)為空, 所以直接返回 if (ring->head == ring->tail) goto out;
spin_lock(&info->ring_lock);
head = ring->head % info->nr; if (head != ring->tail) { // 根據(jù)環(huán)形緩沖區(qū)的head指針從環(huán)形緩沖區(qū)中讀取結(jié)果 struct io_event *evp = aio_ring_event(info, head, KM_USER1);
*ent = *evp; // 將結(jié)果保存到ent參數(shù)中 head = (head + 1) % info->nr; // 移動(dòng)環(huán)形緩沖區(qū)的head指針到下一個(gè)位置 ring->head = head; // 保存環(huán)形緩沖區(qū)的head指針 ret = 1; put_aio_ring_event(evp, KM_USER1); }
spin_unlock(&info->ring_lock);
out: kunmap_atomic(ring, KM_USER0); return ret;}

aio_read_evt 函數(shù)的主要工作就是判斷環(huán)形緩沖區(qū)是否為空,如果不為空就從環(huán)形緩沖區(qū)中讀取異步 IO 操作的結(jié)果,并且保存到參數(shù) ent 中,并且移動(dòng)環(huán)形緩沖區(qū)的 head 指針到下一個(gè)位置。

總結(jié)

本文主要分析了 Linux 原生 AIO 的實(shí)現(xiàn),但為了不陷入太多的實(shí)現(xiàn)細(xì)節(jié)中,本文并沒(méi)有涉及到磁盤(pán) IO 相關(guān)的知識(shí)點(diǎn)。然而磁盤(pán) IO 也是 AIO 實(shí)現(xiàn)中不可或缺的一部分,所以有興趣的朋友可以繼續(xù)通過(guò)閱讀 Linux 的源碼來(lái)分析其實(shí)現(xiàn)原理。


瀏覽 92
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日本一区二区视频在线| 日韩性爱视频网站| 久久精品人人| 久草中文在线视频| 国产精品视频免费观看| 在线免费观看毛片| 婷婷综合素质二区| 一级a一级a免费观看免免黄‘/| 91人妻一区二区| 狠狠干狠狠干| 国产17c精品视频一二三区| 国产精品视频在线免费观看| 久草香蕉| 91丨牛牛丨国产人妻| 日韩A片在线观看| 俺也去AV| 成人网站无码| 自慰在线观看网站| 亚洲东方在线| 91丨露脸丨熟女| 青青草原在线| 色五月在线观看| 激情网站在线| 东北女人毛多又黑A片| 人人摸人人看| 99久久视频| 成人做爰69片免费观看| 婷婷狠狠操| 欧美激情国产精品| 97色碰| 国产免费看| 97超碰免费| 豆花视频成人精品视频| 国产三级片精品| 婷婷午夜福利| 国产一级特黄大片| 日韩电影免费在线观看| 大香蕉现在视频中心一| 91精品电影18| 午夜精品久久久久久久| 人人干干| 在线观看老湿视频福利| 夜间福利视频| 日本一区二区视频在线观看| 国产精品乱草| 国产口爆| 久色伊人| 爱搞在线观看| 爆乳尤物一区二区三区| 久久只有精品| 精品动漫3D一区二区三区免费版| 久久精品人人| 国产激情网址| 人人操人人干人人| 免费人成年激情视频在线观看| 国产欧美在线| 免费看无码一级A片在线播放| 欧美一区不卡| 99Re66精品免费视频| 日韩成人免费观看| 美女性爱视频网站| 不卡无码中文字幕| 120分钟婬片免费看| 99极品视频| 强伦人妻一区二区三区| 久久国产免费| 免费性爱视频网站| 偷拍第一页| 超碰在线天天干| 国产剧情91| 亚洲三级片无码| 超碰青青青| 人人摸人人操人人爱| 中国最大成人网站| 男女网站在线观看| 午夜av免费在线| 91青青草| 日韩视频中文字幕| 超碰日韩| 爱爱视频日本| 男人的天堂2019| 色欲亚洲| 色婷婷一级A片AAA毛片| 翔田千里无码在线| 97色色超碰| 熟女综合| 精东影业AV无码精品| 人人看人人摸人人草| 5D肉蒲团| 欧美亚洲视频在线观看| 国产视频123区| 久久动态图| 日韩AV成人无码久久电影| 亚洲午夜福利一区二区三区| 日韩无码高清免费视频| 苍井空无码一区二区三区| 亚洲综合社区在线| 三级乱伦86丝袜无码| 久久天天| 一道本在线| AV在线天堂| 欧美性爱综合网| 中文视频在线观看| 亚洲性爱自拍| 精精品人妻一区二区三区| 亚洲国产中文字幕| 天堂中文字幕| 蜜芽av在线| 4438成人网| 99热在线看| 九九九久久久| 国产视频99| 东北女人操逼| 91在线精品一区二区| 亚洲av资源| 特级西西444www高清| 高清无码免费观看| 亚洲一区中文字幕| 东方av在线观看| 成人午夜福利网站| 免费小视频| www黄色视频| 久久精品福利视频| 天天操天天看| 久久久大香蕉| 吴梦梦《女教师时间暂停》| 欧美日韩午夜福利视频| 国产精品久久久一区二区三区 | 一级黄片在线| 97婷婷五月天| 日B免费视频| 少妇人妻av| 日韩无码AV一区二区三区| 欧美aⅴ| 国产骚女| 亚洲欧美网站| 2025AV天堂网| 青青草激情视频| 成人伊人大香蕉| 97国产在线视频| 国产内射在线观看| 国产又黄又爽| 国产熟妇码视频户外直播| 日韩东京热中文字幕| 韩国毛片基地久久| 婷婷丁香人妻天天爽| 内射黄片| 久久久久中文字幕| 成人自拍视频在线| 色综合久久久| 91精品国产乱码香蕉黄瓜草莓| 丁香五月网站| 黄片免费在线播放| 日韩a片| 久久午夜夜伦鲁鲁一区二区| 青娱乐精品视频| 人妻精品一卡二卡| 人人干人人操人人爱| 国产精品扒开腿| 中文色片| 成人一区二区在线观看| 操嫩逼视频| 天天cao| 亚洲专区中文字幕| 欧美视频免费在线观看| jizz在线观看视频| 欧美性爱视频网站| 一本色道88久久加勒比精品| 国产99999| 欧美MV日韩MV国产网站| 亚洲AV无码成人精品区在线欢看| 欧美一级AA大片免费看视频| 丁香五月天啪啪| 麻豆精品在线| 无码电影网| AV大香蕉| 91天天综合在线| 亚洲欧洲精品成人久久曰影片| 国产av二区| 成人无码观看| caopeng97| 99热在线免费| 狠狠撸视频| 91成人无码| 狼人香蕉在线视频| 鲁鲁鲁鲁鲁鲁鲁777777| 澳门无码视频| 在线观看视频免费无码免费视频| 在线免费黄| 黄片视频网站| 影音先锋成人电影| 三级无码AV| 免费看黄色录像| 亚洲日韩国产成人精品久久| 免费观看操逼| 午夜激情视频网站| 人人操人人摸人人干| 少妇人妻偷人精品无码视频新浪| 色五月视频在线| 免费黄视频在线观看| 欧美高潮视频| 臭小子晚上让你爽个够视频| 黄色片在线免费看| 北条麻妃一区二区三区-免费免费高清观看 | 在线观看免费成人网站| 五月激情综合| 操逼视频在线观看| 亚洲精品鲁一鲁一区二区三区| 成人在线视频免费| 99视频精品| 插吧插吧综合网| 成人毛片一区二区三区无码| 男女无套在线观看免费| aa久久| 深爱五月婷婷| 一级大黄色毛片| 91视频在线免费观看app| 日韩熟妇无码| 亚洲AV小说| 激情网五月天| 操逼视频,黄色大全| 国产免费黄色视频网站| 亚洲免费成人电影| 国产在线视频一区二区三区| A级无码| 欧美日韩狠狠操在线观看视频| 青青操人人操| 特级西西西88大胆无码| 九九精品视频在线播放| 北条麻妃无码在线播放| 国产麻豆电影在线观看| 国产一级特黄大片| 91蜜桃在线观看| 撸一撸在线| 在线看片a| 一本色道久久综合狠狠| 成人一区在线观看| 青娱乐国产在线视频| 91蝌蚪丨人妻丨丝袜| 国产不卡网| 日本中文字幕在线免费观看| 亚洲免费观看高清完整版| 天天色av| 欧美激情色色| av天堂资源在线| 日韩精品在线观看免费| 无码人妻av黄色一区二区三区| 日韩人妻无码一区二区三区七区| 先锋AV资源站| 国产精品久久久久久久久久久久久| 丁香五月天堂| 国产欧美日韩成人| 夜夜骑天天| 99东京热| 波多野结衣黄色| 久久日韩无码| 欧美日韩在线视频免费观看| 中文在线字幕免费观看电视剧大全| 浙江妇搡BBBB搡BBBB| 91国产视频网站| 七十路の高齢熟女千代子下载| 大香蕉伊人在线观看视频| 91亚洲视频| 嘿嘿午夜影院| 美女大香蕉| 亚洲成人av在线| 夜夜爽夜夜爽| 亚洲成人在线网| 中文字幕乱码中文字乱码影响大吗 | 国产非洲欧美在线| 婷婷五月丁香在线| a视频免费观看| 欧美干| 国产凹凸视频在线观看| 免费的av网站| 中日韩欧美一级A片免费| 日韩成人无码片| 日本a在线免费观看| 亚洲av在线免费观看| 久久永久免费精品人妻专区| 亚洲欧美日韩中文字幕在线观看| 影音先锋AV在线资源| 国产乱妇乱子伦视频免费观看| 国产成人精品毛片| 免费无码又爽又黄又刺激网站 | 亚洲AV无码第一区二区三区蜜桃 | 精品人妻一区二区三区日产| 五月天AV网站| 成人久久av| 久草综合视频| 色色色色网| 婷婷国产视频| 免费在线观看黄色| 婚闹不堪入目A片| 国产毛片777777| 91色色色| 91视频电影| 天天拍夜夜拍| 黄色成人18| 99r6热只有精品免费观看| 91蝌蚪在线观看| 色婷婷久久| 国产91丝袜在线播放| 国产精品视频网站| 国产精品无码一区二区三区免费| 亚洲色a| 可以在线观看的av| 久久91| 操逼逼片| 成人福利网站| 韩国精品一区| 亚洲天堂男人的天堂| 欧美激情综合| 中文字幕在线无码视频| 亚洲国产婷婷香蕉A片| 亚洲在线高清视频| 天天成人| 久草这里只有精品| 国产精品免费一区二区三区四区视频| 人人操综合| 91在线视频观看| 国产传媒一区| A级网站| 中文字幕第一页亚洲| 插菊花综合网站| 欧美成人18| 亚洲狼人综合网| 麻豆91精品人妻成人无码| 69精品免费视频| 69婷婷国产精品| 欧美成人视频| 刘玥精品国产一区二区三区| 成人啪啪视频| AV-ThePorn| 黑人大荫蒂女同互磨| 人妻无码中文久久久久专区| 伊人在线视频观看| 精品视频一区二区三区| 一本色道久久综合无码人妻四虎| 欧美精品一二三| 日日碰狠狠躁久久躁婷婷| 神马午夜秋霞不卡| 长泽梓黑人初解禁BDD07| 蜜臀久久久99久久久久久久| 国产欧美熟妇另类久久久| 午夜福利老司机| 麻豆精品在线| 日本大香蕉在线视频| 国产三级午夜理伦三级| 日韩一区二区三免费高清在线观看 | 婷婷五月六月| 夜夜高潮夜夜爽| 人人爱人人看| 福利色播| 天天色网站| 香蕉AV777XXX色综合一区| 台湾省成人网站| 人人人人人人人人操| 九九大香蕉| 91人妻中文字幕| 欧美一级婬片免费视频黄| 欧美香蕉在线| 成人自拍视频在线观看| 黄色性爱网址| 国产在线中文| 久久草视频在线播放| 99无码国产成人精品| 五月花在线视频| 免费成人大片| 国偷自产视频一区二区久| 久久久久久久久久8888| 久久6热| 亚洲无码一二三| 抠骚逼| 东方AV在线免费观看| 亚洲高清国产欧美综合s8| 熟女中文| 久久夜色视频网| 黄色A片电影| 青娱乐在线成人| 欧美日韩成人片| 日本三级网址| 爱爱视频天天干| 人妻性爱| 国产无码操逼| 激情草逼| 精品探花| 在线观看免费高清无码| 亚洲日韩中字| 日本一区二区三区视频在线观看| 亚洲AV永久无码精品| 五月丁香色色网| 人人色人人干| 久久无码人妻精品一区二区三区 | 殴殴美日韩在线| 欧美三级推荐| 成人AV电影在线观看| 国产成人无码精品久在线观看 | 无码中文字幕在线观看| 免费国产在线视频| 国产又粗又大又爽91嫩草| 91熟女乱伦| 综合色国产精品欧美在线观看| 日本女人牲交视频| 亚洲精品成人片在线观看精品字幕| 青草青在线视频| a三级片| 欧美中文在线观看| 中文色片| 亚色天堂| 日韩精品成人av| 亚洲欧美色图| 97乱伦| 蜜桃网一区二区| 美女网站在线观看| 婷婷日韩在线| 黃色一级A片一級片| 免费视频在线观看一区| 五月婷婷中文字幕| 国产毛片777777| 欧美性爱天天| 亚洲老鸭窝| 亚洲激情国产| 91Av视频| 久久婷婷国产综合| 亚洲香蕉av| 久久aa| 韩日综合在线| 欧美熟女18| 中文字幕高清无码在线| 无码专区在线看v| 国产在线视频一区| 日韩黄色免费网站| 超碰成人福利| 亚州在线中文字幕经典a| 韩国中文字幕HD久久精品| 99热播| 99视频自拍| 高清国产av| 国产丝袜自拍| 午夜精品久久久久久不卡8050| 天天视频黄色| 日日摸日日添日日躁AV| 色欲AV在线| 啪啪网站免费观看| 美女裸体视频网站| 免费黄色视频网站| 特写毛茸茸BBwBBwBBw| 91在线观看18| 影音先锋AV在线资源| 国产a片视频| 操日本老女人| www.五月丁香| 伊人综合色| 国产在线小电影| 中文字幕在线乱| 午夜亚洲国产一区视频网站 | 俺去也视频| 天天中文字幕| 18+免费网站| 欧美视频精品| 超碰成人在线免费观看| 国产无码成人电影| 正在播放JUQ-878木下凛凛子| 亚洲精品成人AV| 麻豆传媒视频观看| 久久成人导航| 狠狠狠狠狠狠操| 欧美成人精品| 欧美一级特黄A片免费| 日本三区视频| 就要操| 青春草在线观看国产| 国产三级图片| 四川妇BBB桑BBB桑BBB| 亚洲AV无码| 中国a一片一级一片| 天天干天天日天天操| 91内射视频| 地表最强网红八月未央道具大秀| 轻轻操内射无码| 蜜桃视频成人app| 新BBWBBWBBWBBW| 亚洲AV秘一区二区色盗战流出| 亚洲综合视频在线观看| 乱伦婷婷| 91av电影网| 久久99深爱久久99精品| 无码人妻A片一区二区青苹果| 91国产视频网站| 超碰日韩| 免费色片| 夜间福利视频| 操美女影院| 精品毛片| 九九天堂| 欧美乱欲视频| 久久精品福利| 婷婷内射| 日本啪啪网站| 黄片高清免费观看| 中文av字幕| 撒尿BBw搡BBwBBw| XX熟女HD| 精品人妻一区二区三区在| 亚洲专区在线| 亚洲欧洲天堂| 亚洲AV色香蕉一区二区三区 | 国产AV自拍-久| 天堂网| 久久探花| 天天干少妇| 超碰99在线| 国产又爽又黄在线看| 在线播放国产精品| 伊人日日| 中文字幕av在线观看| 波多野结衣国产| 黄色无码视频在线观看| 国产亚洲99久久精品| 久色| 丁香五月天啪啪| 天天色粽合合合合合合合| 欧美视频在线免费| 射久久| 激情国产视频| 在线成人AV| 久热这里| 成人黄色免费视频| 亚洲加勒比在线| 一级a看片在线观看| 国产精品色哟哟| 欧美人操逼一二区| 国产美女自拍视频| 先锋资源在线视频| 欧美高清一级| 性爱一级视频| 最近中文字幕免费mv第一季歌词強上| 亚洲人妻无码视频| 久久肏逼| jizz在线观看免费视频| 成人视频在线观看18| 亚洲人妻少妇| 婷婷国产精品| 日本一级特级毛片视频| 久久系列观看完整指南| 成人在线免费观看视频| 日韩免费三级片| 亚洲免费观看高清完整版在va线观看 | 91看片看婬黄大片Videos| 丁香五月婷婷综合网| 中文字幕在线无码| 99视频在线观看免费| 欧美日韩激情视频| 69福利| 在线观看黄片网站| 91视频免费在线观看| 欧美精品一二三区| 艳妇乳肉豪妇荡乳AV无码福利| 爱搞搞爱干干| 思思精品在线| www天天操| 日本成人视频| av片在线免费观看| 国产精品中文| 欧美aaa在线| 国产美女被| 淫一区二区| 怡红院av| 五月丁香婷婷色| 91无码高清| 97人妻精品一区二区三区免| 国产精品偷拍视频| 亚洲天堂人妻少妇| 亚洲中文字幕AV| 日韩人妻视频| 久久久久久97| 亚洲国产成人在线视频| 蜜桃精品无码| 日韩网站在线| 青草社区在线观看| 人人妻人人澡人人爽人人| 国产综合精品久久久久成人AV| 国产18毛片18水多精品| 999热视频| 无码AV天堂| 看国产毛片| 老女人操逼视频| 日韩三级在线| 亚洲精品成人视频| 粉嫩av懂色av蜜臀av熟妇| 东京热久久综合| 999成人网| 亚洲成人在线视频观看| 成人在线免费观看国产| 国产成人a| 一区亚洲| 成人无码交配视频国产网站| 国产区一区| 岛国电影av| 91porn国产| 中文无码熟妇一区二区| 欧美日韩有码视频网址大全| 中文字幕成人电影| 西西特级无码444www| 中文字幕在线观看网址最新地址| 色资源站| 中文字幕色站| wwwxx国产| 青青草原视频在线免费观看| 少妇人妻一区| 欧美激情四射老司机| 天天操天天干天天日| 天天撸在线视频| 正在播放JUQ-878木下凛凛子| 国产精品久久久精品cos| 日韩三级一区| 在线观看www视频| 可以看的毛片| 欧美不卡在线观看| 天堂中文资源在线观看| 120分钟婬片免费看| 国产AV一区二区三区四区五区 | 亚洲无码成人| 五月丁香| 六月色| 精品国产99| 2021无码| 午夜成人在线观看| 国产成人精| 亚洲av男人天堂| 在线观看成年人视频| 精品欧美乱码久久久久久| 色婷婷18禁| 国产精品第一| 国产黄色视频免费在线观看| 永久av| 激情色色| 激情网站在线| 伊人大香蕉网站| 久久久久久久久毛片| 亚洲精品日韩综合观看成人91| 91国产人妻| 人人爱人人操人人爽| 欧美h网站| 日韩视频免费看| 国产在线久久久| 亚洲国产另类精品| 亭亭色| 国产剧情一区二区av在线观看 | 黄色AV网| 中文字幕+乱码+中文字幕电视剧 | 西西人体WW大胆无码| 免费看黄色视频| 久久久亚洲| 在线观看日本vs欧洲vs美洲| 青草精品视频| 日韩精品不卡| 中文字幕在线观看日韩| 日本A片视频| 天天爽视频| 久久久久三级片| 国产一级a爱做片免费☆观看| 影音先锋成人av| 婷婷成人电影| 黄片网站免费看| 亚洲精品福利视频| 久久亚洲成人| 婷婷五月天激情小说| 国产传媒自拍| 无码人妻视频| 884aa四虎影成人精品一区| 日韩无码电影网| 成人久久| 91精品婷婷国产综合久久韩漫| 亚洲无码免费| 怡红影院美乳| 亚洲第一狼人综合网| 人人看人人搞人人摸| 国产丝袜AV| 久久草草热国产精| 欧美日韩h| 天天操视频网站| 无码中文综合成熟精品AV电影 | 亚洲欧洲久久| 欧美一级操逼视频| 黄色爱爱视频| 国产精品小电影| 免费伊人大香蕉| 色悠悠久久综合| 国产在线观看91| 少妇高潮喷水视频| 亚洲视频一区二区三区四区娇小视频在线观看视频 | 亭亭五月天| 欧美色图网站| 成人无码视频| gay成人在线观看| 日日撸视频| 天天干天天上| 成人黄色视频网| 操逼网123首页| 免费一区视频| 亚洲精品一区二区三区四区五区六区| 在线免费观看网站| 日本黄色电影在线| 在线观看免费A片| 亚洲无码99| 日韩一级欧美一级| 日日爽夜夜爽| 亚洲成人精品| 午夜成人福利视频在线观看| 日韩91在线视频| 亚洲综合成人在线| 99热一区二区三区| 午夜免费网站| 日B视频在线观看| 国产精品成人在线观看| 人人上人人干| 亚洲午夜福利电影| 女生被操网站| 青春草视频| 特级毛片AAAAAA蜜桃| 国产一级黄色毛片| 国产无码午夜| 一区二区A片| 玖玖av| 精品人妻午夜一区二区三区四区| 亚洲AV资源| 日韩av免费| 日韩欧美综合| 蜜桃导航-精品导航| www.91超碰在线| 成人精品一区二区三区电影| 一级免费黄色视频| 波多野结衣亚洲视频| AV中文字幕网| jiujiuav| 手机看片福利| A级毛片网站| 日韩最新高清无码| 鲁一鲁在线视频| 亚洲无码视频看看| 99ri国产| 成人网| 自拍超碰| 日本性爱一区| 精品国产乱子伦一区二区三区最新章 | 国产色情视频在线观看| 免费久久久| 日韩A级毛片| 国产xxxx| 爱搞在线观看wwww| 久久久久亚洲AV无码成人片| 五月六月婷婷| 成人动漫在线观看| 成人毛片| www.婷婷| 欧美美女日逼视频| 国产精品色哟哟| 日美女网站| 国内精品久久久久久久| 婷婷五月天无码| 九九九免费视频| 国产三级日本三级国产三级| 久久六六| 黄色免费无码| www.日韩无码| 91aaa在线观看| 中文字幕婷婷| 五月天婷婷国产| 亚洲av资源在线观看| 中文字幕黄色| 日韩一级无码特黄AAA片| 五月丁香综合激情| 久久性爱视频| 精品国产AV鲁一鲁一区| 欧美日韩国产成人综合| 亚洲日韩欧美在线观看| 亚洲成人无码AV| 亚洲无码免费看| 国内成人自拍| 91亚洲影院| 亚洲免费观看高清完整版在线观 | 久久久久久久精| 老熟女痒到不行-ThePorn| 强奸校花到高潮| 高清无码一区二区在线| 亚洲精品伦理| 毛片18| 大香蕉伊在线观看| 天天撸天天干天天日| 水多多成人免费A片| 日韩激情一区| 日本精品在线视频| 伊人网综合| 国产天堂视频| 国产成人精品无码片子的价格 | 免费成人国产| 成人在线激情| 青青操在线| 中文av字幕| 久久久久久久香蕉视频| 日本一级婬片A片免费播放一 | 天天谢天天干| 99热这里是精品| 粉嫩av懂色av蜜臀av熟妇| 特极西西444WWW大胆无码| 日韩无码中文字幕| 操逼爆奶网站| 日韩一级片免费| 无码AV大香线蕉伊人| 黄色大片网站| 国产人妻人伦精品1国产丝袜| 欧美一级一区| 人人色视频| 国产欧美日韩在线| 国产精品自拍一区| 波多野结衣在线观看一区二区| 国产日韩欧美综合在线| 露脸丨91丨九色露脸| 免费成人国产| 好吊妞视频在线| 丁香色色网| 国内精品一区二区| 天堂成人AV| 人人肏屄| 亚洲视频免费播放| 无码东京热国产| 福利视频在线| JlZZJLZZ亚洲美女18| 日韩色| 丁香五月一区二区| 中文字幕第23页| 尹人成人| 久草视频在线播放| 在线成人毛片| 免费做a爰片77777| 亚洲精品在线视频| 日本三级黄色视频| 黄色电影大香蕉| 99爱爱| 另类老妇性BBBWBBW| 欧美AA级毛片| 中文字幕av一区二区| 91视频亚洲| 婷婷伊人久操网| 性爱麻豆| 91工厂露脸熟女| 国产一级a毛一级a做免费的视频| 小明成人免费视频| 亚洲高清AV| 黑人vs亚洲人在线播放| 国产三级一区二区| 日本少妇网站| 91福利网| 一级真人毛片| 少妇搡BBBB搡BBB搡造水多| 国产精品电影| 亚洲色成人中文字幕在线| 亚洲电影AV| 操逼视频在线免费观看| 在线免费高清无码| 日韩无码精品一区二区三区| 99自拍视频| 欧美怕怕| 女同久久另类99精品国产91| 伊人亚洲综合| 无码成人毛片| 久久久高清无码| 91丨九色丨东北熟女| 亚洲欧美婷婷五月色综合| 亚洲第一大网站| 瑟瑟视频在线观看| 亚洲影院第一页| www.豆花视频成人版| 熟妇导航| 香蕉成人网站在线观看| 亚洲女人在线| www.狠狠操| 国产欧美综合三级伦| 九九热国产视频| h片在线观看| 靠逼网站免费观看| 久久e热| 国产美女一级特黄大片| 国内精品内射| 欧美综合国产| 欧美色逼| 体内射精视频| 国产三级视频| 久久久久久久久久久久高清毛片一级| 午夜性爱网站| 2025四虎在线视频观看| 淫香淫色天天影视| 成人免费黄色| 成人色色视频| wwwsesese| 大香蕉国产在线| 俺去也俺去啦| 国产无码在线看|