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

Linux內核調試技術——進程D狀態死鎖檢測

系統 Linux 系統運維
所謂的D狀態就是Linux的進程存在多種狀態,如TASK_RUNNING的運行態、EXIT_DEAD的停止態和TASK_INTERRUPTIBLE的接收信號的等待狀態等等(可在include/linux/sched.h中查看)。其中有一種狀態等待為TASK_UNINTERRUPTIBLE,稱為D狀態。

Linux的進程存在多種狀態,如TASK_RUNNING的運行態、EXIT_DEAD的停止態和TASK_INTERRUPTIBLE的接收信號的等待狀態等等(可在include/linux/sched.h中查看)。其中有一種狀態等待為TASK_UNINTERRUPTIBLE,稱為D狀態,該種狀態下進程不接收信號,只能通過wake_up喚醒。處于這種狀態的情況有很多,例如mutex鎖就可能會設置進程于該狀態,有時候進程在等待某種IO資源就緒時(wait_event機制)會設置進程進入該狀態。一般情況下,進程處于該狀態的時間不會太久,但若IO設備出現故障或者出現進程死鎖等情況,進程就可能長期處于該狀態而無法再返回到TASK_RUNNING態。因此,內核為了便于發現這類情況設計出了hung task機制專門用于檢測長期處于D狀態的進程并發出告警。本文分析內核hung task機制的源碼并給出一個示例演示。

一、hung task機制分析

內核在很早的版本中就已經引入了hung task機制,本文以較新的Linux 4.1.15版本源碼為例進行分析,代碼量并不多,源代碼文件為kernel/hung_task.c。

首先給出整體流程框圖和設計思想:

圖 D狀態死鎖流程圖

其核心思想為創建一個內核監測進程循環監測處于D狀態的每一個進程(任務),統計它們在兩次檢測之間的調度次數,如果發現有任務在兩次監測之間沒有發生任何的調度則可判斷該進程一直處于D狀態,很有可能已經死鎖,因此觸發報警日志打印,輸出進程的基本信息,棧回溯以及寄存器保存信息以供內核開發人員定位。

下面詳細分析實現方式:

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. static int __init hung_task_init(void)   
  3. {   
  4.     atomic_notifier_chain_register(&panic_notifier_list, &panic_block);   
  5.     watchdog_task = kthread_run(watchdog, NULL"khungtaskd");   
  6.    
  7.     return 0;   
  8. }   
  9. subsys_initcall(hung_task_init);   

首先,若在內核配置中啟用了該機制,在內核的subsys初始化階段就會調用hung_task_init()函數啟用功能,首先向內核的panic_notifier_list通知鏈注冊回調:

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. static struct notifier_block panic_block = {   
  3.     .notifier_call = hung_task_panic,   
  4. };   

在內核觸發panic時就會調用該hung_task_panic()函數,這個函數的作用稍后再看。繼續往下初始化,調用kthread_run()函數創建了一個名為khungtaskd的線程,執行watchdog()函數,立即嘗試調度執行。該線程就是專用于檢測D狀態死鎖進程的后臺內核線程。

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. /*  
  3.  * kthread which checks for tasks stuck in D state  
  4.  */   
  5. static int watchdog(void *dummy)   
  6. {   
  7.     set_user_nice(current, 0);   
  8.    
  9.     for ( ; ; ) {   
  10.         unsigned long timeout = sysctl_hung_task_timeout_secs;   
  11.    
  12.         while (schedule_timeout_interruptible(timeout_jiffies(timeout)))   
  13.             timeout = sysctl_hung_task_timeout_secs;   
  14.    
  15.         if (atomic_xchg(&reset_hung_task, 0))   
  16.             continue;   
  17.    
  18.         check_hung_uninterruptible_tasks(timeout);   
  19.     }   
  20.    
  21.     return 0;   
  22. }   

本進程首先設置優先級為0,即一般優先級,不影響其他進程。然后進入主循環(每隔timeout時間執行一次),首先讓進程睡眠,設置的睡眠時間為

CONFIG_DEFAULT_HUNG_TASK_TIMEOUT,可以通過內核配置選項修改,默認值為120s,睡眠結束被喚醒后判斷原子變量標識reset_hung_task,若被置位則跳過本輪監測,同時會清除該標識。該標識通過reset_hung_task_detector()函數設置(目前內核中尚無其他程序使用該接口):

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. void reset_hung_task_detector(void)   
  3. {   
  4.     atomic_set(&reset_hung_task, 1);   
  5. }   
  6. EXPORT_SYMBOL_GPL(reset_hung_task_detector);   

接下來循環的***即為監測函數check_hung_uninterruptible_tasks(),函數入參為監測超時時間。

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. /*  
  3.  * Check whether a TASK_UNINTERRUPTIBLE does not get woken up for  
  4.  * a really long time (120 seconds). If that happens, print out  
  5.  * a warning.  
  6.  */   
  7. static void check_hung_uninterruptible_tasks(unsigned long timeout)   
  8. {   
  9.     int max_count = sysctl_hung_task_check_count;   
  10.     int batch_count = HUNG_TASK_BATCHING;   
  11.     struct task_struct *g, *t;   
  12.    
  13.     /*  
  14.      * If the system crashed already then all bets are off,  
  15.      * do not report extra hung tasks:  
  16.      */   
  17.     if (test_taint(TAINT_DIE) || did_panic)   
  18.         return;   
  19.    
  20.     rcu_read_lock();   
  21.     for_each_process_thread(g, t) {   
  22.         if (!max_count--)   
  23.             goto unlock;   
  24.         if (!--batch_count) {   
  25.             batch_count = HUNG_TASK_BATCHING;   
  26.             if (!rcu_lock_break(g, t))   
  27.                 goto unlock;   
  28.         }   
  29.         /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */   
  30.         if (t->state == TASK_UNINTERRUPTIBLE)   
  31.             check_hung_task(t, timeout);   
  32.     }   
  33.  unlock:   
  34.     rcu_read_unlock();   
  35. }   

首先檢測內核是否已經DIE了或者已經panic了,如果是則表明內核已經crash了,無需再進行監測了,直接返回即可。注意這里的did_panic標識在前文中的panic通知鏈回調函數中hung_task_panic()置位:

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. static int   
  3. hung_task_panic(struct notifier_block *this, unsigned long event, void *ptr)   
  4. {   
  5.     did_panic = 1;   
  6.    
  7.     return NOTIFY_DONE;   
  8. }   

接下去若尚無觸發內核crash,則進入監測流程并逐一檢測內核中的所有進程(任務task),該過程在RCU加鎖的狀態下進行,因此為了避免在進程較多的情況下加鎖時間過長,這里設置了一個batch_count,一次最多檢測HUNG_TASK_BATCHING個進程。于此同時用戶也可以設定***的檢測個數max_count=sysctl_hung_task_check_count,默認值為***PID個數PID_MAX_LIMIT(通過sysctl命令設置)。

函數調用for_each_process_thread()函數輪詢內核中的所有進程(任務task),僅對狀態處于TASK_UNINTERRUPTIBLE狀態的進程進行超時判斷,調用check_hung_task()函數,入參為task_struct結構和超時時間(120s):

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. static void check_hung_task(struct task_struct *t, unsigned long timeout)   
  3. {   
  4.     unsigned long switch_count = t->nvcsw + t->nivcsw;   
  5.    
  6.     /*  
  7.      * Ensure the task is not frozen.  
  8.      * Also, skip vfork and any other user process that freezer should skip.  
  9.      */   
  10.     if (unlikely(t->flags & (PF_FROZEN | PF_FREEZER_SKIP)))   
  11.         return;   
  12.    
  13.     /*  
  14.      * When a freshly created task is scheduled once, changes its state to  
  15.      * TASK_UNINTERRUPTIBLE without having ever been switched out once, it  
  16.      * musn't be checked.  
  17.      */   
  18.     if (unlikely(!switch_count))   
  19.         return;   
  20.    
  21.     if (switch_count != t->last_switch_count) {   
  22.         t->last_switch_count = switch_count;   
  23.         return;   
  24.     }   
  25.    
  26.     trace_sched_process_hang(t);   
  27.    
  28.     if (!sysctl_hung_task_warnings)   
  29.         return;   
  30.    
  31.     if (sysctl_hung_task_warnings > 0)   
  32.         sysctl_hung_task_warnings--;   

首先通過t->nvcsw和t->nivcsw的計數累加表示進程從創建開始至今的調度次數總和,其中t->nvcsw表示進程主動放棄CPU的次數,t->nivcsw表示被強制搶占的次數。隨后函數判斷幾個標識:(1)如果進程被frozen了那就跳過檢測;(2)調度次數為0的不檢測。

接下來判斷從上一次檢測時保存的進程調度次數和本次是否相同,若不相同則表明這輪timeout(120s)時間內進程發生了調度,則更新該調度值返回,否則則表明該進程已經有timeout(120s)時間沒有得到調度了,一直處于D狀態。接下來的trace_sched_process_hang()暫不清楚作用,然后判斷sysctl_hung_task_warnings標識,它表示需要觸發報警的次數,用戶也可以通過sysctl命令配置,默認值為10,即若當前檢測的進程一直處于D狀態,默認情況下此處每2分鐘發出一次告警,一共發出10次,之后不再發出告警。下面來看告警代碼:

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. /*  
  3.  * Ok, the task did not get scheduled for more than 2 minutes,  
  4.  * complain:  
  5.  */   
  6. pr_err("INFO: task %s:%d blocked for more than %ld seconds.\n",   
  7.     t->comm, t->pid, timeout);   
  8. pr_err("      %s %s %.*s\n",   
  9.     print_tainted(), init_utsname()->release,   
  10.     (int)strcspn(init_utsname()->version, " "),   
  11.     init_utsname()->version);   
  12. pr_err("\"echo 0 > /proc/sys/kernel/hung_task_timeout_secs\""   
  13.     " disables this message.\n");   
  14. sched_show_task(t);   
  15. debug_show_held_locks(t);   
  16.    
  17. touch_nmi_watchdog();   

這里會在控制臺和日志中打印死鎖任務的名稱、PID號、超時時間、內核tainted信息、sysinfo、內核棧barktrace以及寄存器信息等。如果開啟了debug lock則打印鎖占用的情況,并touch nmi_watchdog以防止nmi_watchdog超時(對于我的ARM環境無需考慮nmi_watchdog)。

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. if (sysctl_hung_task_panic) {   
  3.     trigger_all_cpu_backtrace();   
  4.     panic("hung_task: blocked tasks");   
  5. }   

***如果設置了sysctl_hung_task_panic標識則直接觸發panic(該值可通過內核配置文件配置也可以通過sysctl設置)。

二、示例演示

演示環境:樹莓派b(Linux 4.1.15)

1、首先確認內核配置選項以確認開啟hung stak機制

  1. [cpp] view plain copy  在CODE上查看代碼片派生到我的代碼片 
  2. #include      
  3. #include      
  4. #include      
  5. #include    
  6.    
  7. DEFINE_MUTEX(dlock);   
  8.    
  9. static int __init dlock_init(void)   
  10. {   
  11.     mutex_lock(&dlock);   
  12.     mutex_lock(&dlock);    
  13.        
  14.     return 0;   
  15. }   
  16.    
  17. static void __exit dlock_exit(void)    
  18. {   
  19.     return;   
  20. }   
  21.    
  22. module_init(dlock_init);     
  23. module_exit(dlock_exit);     
  24. MODULE_LICENSE("GPL");     

本示例程序定義了一個mutex鎖,然后在模塊的init函數中重復加鎖,人為造成死鎖現象(mutex_lock()函數會調用__mutex_lock_slowpath()將進程設置為TASK_UNINTERRUPTIBLE狀態),進程進入D狀態后是無法退出的。可以通過ps命令來查看:

 

  1. root@apple:~# busybox ps  
  2. PID USER TIME COMMAND  
  3. ...... 
  4.  
  5. 521 root 0:00 insmod dlock.ko  
  6. ...... 

然后查看該進程的狀態,可見已經進入了D狀態。

 

  1. root@apple:~# cat /proc/521/status  
  2. Name: insmod  
  3. State: D (disk sleep)  
  4. Tgid: 521  
  5. Ngid: 0  
  6. Pid: 521 

至此在等待兩分鐘后調試串口就會輸出以下信息,可見每兩分鐘就會輸出一次:

 

  1. [ 360.625466] INFO: task insmod:521 blocked for more than 120 seconds.  
  2. [ 360.631878] Tainted: G O 4.1.15 #5  
  3. [ 360.637042] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.  
  4. [ 360.644986] [] (__schedule) from [] (schedule+0x40/0xa4)  
  5. [ 360.652129] [] (schedule) from [] (schedule_preempt_disabled+0x18/0x1c)  
  6. [ 360.660570] [] (schedule_preempt_disabled) from [] (__mutex_lock_slowpath+0x6c/0xe4)  
  7. [ 360.670142] [] (__mutex_lock_slowpath) from [] (mutex_lock+0x44/0x48)  
  8. [ 360.678432] [] (mutex_lock) from [] (dlock_init+0x20/0x2c [dlock])  
  9. [ 360.686480] [] (dlock_init [dlock]) from [] (do_one_initcall+0x90/0x1e8)  
  10. [ 360.694976] [] (do_one_initcall) from [] (do_init_module+0x6c/0x1c0)  
  11. [ 360.703170] [] (do_init_module) from [] (load_module+0x1690/0x1d34)  
  12. [ 360.711284] [] (load_module) from [] (SyS_init_module+0xdc/0x130)  
  13. [ 360.719239] [] (SyS_init_module) from [] (ret_fast_syscall+0x0/0x54)  
  14. [ 480.725351] INFO: task insmod:521 blocked for more than 120 seconds.  
  15. [ 480.731759] Tainted: G O 4.1.15 #5  
  16. [ 480.736917] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.  
  17. [ 480.744842] [] (__schedule) from [] (schedule+0x40/0xa4)  
  18. [ 480.752029] [] (schedule) from [] (schedule_preempt_disabled+0x18/0x1c)  
  19. [ 480.760479] [] (schedule_preempt_disabled) from [] (__mutex_lock_slowpath+0x6c/0xe4)  
  20. [ 480.770066] [] (__mutex_lock_slowpath) from [] (mutex_lock+0x44/0x48)  
  21. [ 480.778363] [] (mutex_lock) from [] (dlock_init+0x20/0x2c [dlock])  
  22. [ 480.786402] [] (dlock_init [dlock]) from [] (do_one_initcall+0x90/0x1e8)  
  23. [ 480.794897] [] (do_one_initcall) from [] (do_init_module+0x6c/0x1c0)  
  24. [ 480.803085] [] (do_init_module) from [] (load_module+0x1690/0x1d34)  
  25. [ 480.811188] [] (load_module) from [] (SyS_init_module+0xdc/0x130)  
  26. [ 480.819113] [] (SyS_init_module) from [] (ret_fast_syscall+0x0/0x54)  
  27. [ 600.825353] INFO: task insmod:521 blocked for more than 120 seconds.  
  28. [ 600.831759] Tainted: G O 4.1.15 #5  
  29. [ 600.836916] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.  
  30. [ 600.844865] [] (__schedule) from [] (schedule+0x40/0xa4)  
  31. [ 600.852005] [] (schedule) from [] (schedule_preempt_disabled+0x18/0x1c)  
  32. [ 600.860445] [] (schedule_preempt_disabled) from [] (__mutex_lock_slowpath+0x6c/0xe4)  
  33. [ 600.870014] [] (__mutex_lock_slowpath) from [] (mutex_lock+0x44/0x48)  
  34. [ 600.878303] [] (mutex_lock) from [] (dlock_init+0x20/0x2c [dlock])  
  35. [ 600.886339] [] (dlock_init [dlock]) from [] (do_one_initcall+0x90/0x1e8)  
  36. [ 600.894835] [] (do_one_initcall) from [] (do_init_module+0x6c/0x1c0)  
  37. [ 600.903023] [] (do_init_module) from [] (load_module+0x1690/0x1d34)  
  38. [ 600.911133] [] (load_module) from [] (SyS_init_module+0xdc/0x130)  
  39. [ 600.919059] [] (SyS_init_module) from [] (ret_fast_syscall+0x0/0x54) 

三、總結

D狀態死鎖一般在驅動開發的過程中比較常見,且不太容易定位,內核提供這種hung task機制,開發人員只需要將這些輸出的定位信息抓取并保留下來就可以快速的進行定位。

責任編輯:武曉燕 來源: chinaunix
相關推薦

2010-03-02 10:27:56

Linux進程狀態

2017-01-12 19:15:03

Linux內核調試自構proc

2014-08-28 15:08:35

Linux內核

2010-01-22 11:01:04

linux內核模塊

2021-04-15 05:51:25

Linux

2010-07-06 10:08:57

SQL Server

2011-01-14 14:49:05

2019-04-10 13:43:19

Linux內核進程負載

2021-07-11 06:45:18

Linux內核靜態

2022-02-08 15:15:26

OpenHarmonlinux鴻蒙

2025-07-02 09:16:40

2009-12-25 11:22:13

Linux進程技術

2017-09-29 10:49:30

2012-05-14 14:09:53

Linux內核調度系統

2009-11-18 09:05:36

Oracle死鎖進程

2023-04-10 09:44:22

內核鼠標調試鴻蒙

2025-10-27 01:55:00

2010-06-02 09:31:43

Linux core

2025-11-17 00:00:55

2023-02-28 09:47:42

點贊
收藏

51CTO技術棧公眾號

99在线热播精品免费| 日韩精品影视| 精品欧美国产一区二区三区| 久久精品国产一区二区三区不卡| 91黑人精品一区二区三区| 日韩欧美一区二区三区免费看| 欧美一区午夜视频在线观看 | 亚洲宅男一区| 精品视频在线视频| 996这里只有精品| 国产三区四区在线观看| 国产一区二区在线观看免费| 91精品国产91久久久久| 小早川怜子一区二区的演员表| silk一区二区三区精品视频| 欧美性做爰猛烈叫床潮| 久青草视频在线播放| 成人在线播放视频| 成人av网站在线| 91日本视频在线| 天天干天天色综合| 午夜国产精品视频免费体验区| 亚洲欧美国产一本综合首页| 无码人妻久久一区二区三区蜜桃| 成人免费毛片嘿嘿连载视频…| 亚洲自拍偷拍网站| 国产精品12p| 国内av一区二区三区| 成人性生交大片免费看视频在线| 国产精品一区二区久久久久| 久久久精品免费看| 国户精品久久久久久久久久久不卡| 亚洲国产精品电影| 亚洲在线观看网站| 久久亚洲资源中文字| 色女孩综合影院| 日韩免费一级视频| 女囚岛在线观看| 亚洲视频网在线直播| 色噜噜一区二区| 亚洲日本国产精品| av影院午夜一区| 国产不卡一区二区三区在线观看| 91中文字幕在线播放| 免费欧美日韩国产三级电影| 国产成人精品视频| 五月天婷婷导航| 欧美亚洲视频| 538国产精品一区二区免费视频| 国产性一乱一性一伧一色| 我不卡手机影院| 日韩有码片在线观看| 久久久久久久久福利| 精品国产欧美日韩| 亚洲欧洲黄色网| 中文字幕网站在线观看| 九九综合久久| 亚洲天堂免费观看| 午夜在线观看一区| 欧美日韩国产免费观看视频| 亚洲欧美日韩成人| 国产人妻大战黑人20p| 精品国产精品国产偷麻豆| 亚洲偷熟乱区亚洲香蕉av| 中文字幕在线1| 欧美一区二区三| 中文字幕精品久久| 成人黄色短视频| 亚洲欧美在线专区| 欧美激情精品久久久久久黑人| 69av.com| 夜夜嗨一区二区| 欧美在线亚洲在线| 老熟妇一区二区三区啪啪| 蜜桃视频免费观看一区| 91色中文字幕| 三级视频在线看| wwwwxxxxx欧美| 日韩欧美精品久久| 日本www在线观看视频| 亚洲精品视频观看| 久久精品视频16| 日韩av超清在线观看| 欧美日韩综合一区| 在线免费看v片| eeuss国产一区二区三区四区| 亚洲娇小xxxx欧美娇小| 亚洲欧美va天堂人熟伦| 女人香蕉久久**毛片精品| 久久久亚洲影院| 国产字幕在线观看| 国产成人av资源| 就去色蜜桃综合| 日本在线免费| 香蕉影视欧美成人| 欧美三级午夜理伦三级富婆| 欧美日韩黄色| 亚洲视频专区在线| 欧美成人手机视频| 日产国产高清一区二区三区| 亚洲中国色老太| 欧美成人综合在线| 亚洲精品亚洲人成人网| 88av.com| jizz国产精品| 久久久国产视频91| 欧美成人精品欧美一级乱黄| 久久精品国产99| 狠狠色狠狠色综合人人| 麻豆网站在线看| 色综合中文字幕国产| 天堂网成人在线| 国产精品免费99久久久| 欧美激情精品久久久久久免费印度 | 国产亚洲欧美在线视频| 日韩欧国产精品一区综合无码| 亚洲第一天堂无码专区| 国产黄色的视频| 久久三级福利| 国内精品久久国产| www红色一片_亚洲成a人片在线观看_| 日韩欧美精品中文字幕| 免费在线观看日韩av| 97色伦图片97综合影院| 欧美壮男野外gaytube| 性猛交富婆╳xxx乱大交天津 | 麻豆一区产品精品蜜桃的特点| 首页综合国产亚洲丝袜| 久久99精品久久久久久久久久| a视频在线播放| 欧美网站一区二区| 日韩精品无码一区二区三区久久久| 亚洲视频一区| 91原创国产| 国产日产一区二区| 欧美日韩精品一区二区三区四区| 蜜桃传媒一区二区亚洲av| 激情视频一区二区三区| 91视频网页| 久cao在线| 欧美久久久久久蜜桃| 你懂得视频在线观看| 日韩**一区毛片| 色噜噜一区二区| 亚洲日本在线观看视频| 亚洲视频在线观看| 自拍偷拍福利视频| 欧美国产欧美亚州国产日韩mv天天看完整| 麻豆av免费在线| 国产精品午夜一区二区三区| 日本国产欧美一区二区三区| 日本中文字幕电影在线观看 | 国产图片一区| 97久久伊人激情网| 午夜视频1000| 日韩欧美在线视频观看| 国产精品密蕾丝袜| 蜜臀va亚洲va欧美va天堂| 无码免费一区二区三区免费播放 | 国产一区二区中文| 999视频在线免费观看| av毛片在线看| 亚洲变态欧美另类捆绑| 国产精品黄色网| 91麻豆国产香蕉久久精品| 四虎永久在线精品无码视频| 国产精品一在线观看| 国产精品久久久久久av| 免费黄色网址在线观看| 日韩欧美中文字幕公布| 日本一级淫片免费放| 91丨porny丨蝌蚪视频| 国产精品动漫网站| 欧美手机视频| 91成人伦理在线电影| 黑人极品ⅴideos精品欧美棵| 亚洲精品成a人在线观看| 日本视频免费观看| 成人免费视频在线观看| 精品人妻在线视频| 欧美亚洲一级| 欧美一级特黄aaaaaa在线看片| 超碰精品在线| 国产999在线| 二区在线播放| 日韩精品中文字| 97国产精品久久久| 香港成人在线视频| 国产调教在线观看| 国产成人免费视频精品含羞草妖精| 鲁一鲁一鲁一鲁一色| 成人在线免费观看91| 国产精品乱码一区二区三区| 伊人久久高清| 久久久久国产视频| 91官网在线| 精品日韩成人av| 伊人网中文字幕| 一区二区欧美视频| 怡红院一区二区三区| 国产91精品一区二区麻豆亚洲| 不卡影院一区二区| 黑人一区二区三区四区五区| 亚洲国产一区二区在线| 成人福利一区| 国产在线久久久| 日韩av一卡| 九九热在线精品视频| av资源网在线观看| 亚洲精品国产综合久久| 国产精品自拍电影| 色先锋资源久久综合| 精品在线视频免费| 亚洲天堂av一区| 一区二区精品免费| 97se亚洲国产综合在线| 亚洲一二三不卡| 人人爽香蕉精品| 男女午夜激情视频| 黄色在线一区| 麻豆传媒网站在线观看| 日韩激情图片| 欧美三级电影在线播放| 精品五月天堂| 99热最新在线| 不卡的国产精品| 国产精品美女免费视频| 亚洲少妇视频| 97国产精品视频| av成人影院在线| 色综合久久天天综线观看| 久草中文在线观看| 日韩专区在线观看| 3d成人动漫在线| 亚洲香蕉伊综合在人在线视看| 青青视频在线观| 日韩成人免费视频| 午夜成人鲁丝片午夜精品| 亚洲国产欧美一区二区三区久久| 精品人妻一区二区三区换脸明星| 欧美日韩精品福利| 特级西西444www高清大视频| 在线一区二区观看| 国产性生活视频| 色悠悠亚洲一区二区| 国产又大又黄又粗| 日韩欧美国产激情| 日韩视频在线观看一区| 色综合色狠狠综合色| 国产一级片毛片| 欧美日韩在线免费| 最新中文字幕一区| 色婷婷亚洲精品| 午夜一级黄色片| 欧美写真视频网站| 一区二区精品视频在线观看| 欧美喷水一区二区| 99久久国产免费| 日韩欧美一区二区久久婷婷| 亚洲国产www| 亚洲国产小视频| 欧美日韩国产综合视频 | 91成年人网站| 国产午夜精品一区二区| 久久久久亚洲AV成人无在 | 国产精品7777777| 激情懂色av一区av二区av| www.国产一区二区| 欧美日韩国产另类一区| 国产女同91疯狂高潮互磨| 欧美大片在线观看| 日本电影一区二区在线观看| 中文字幕精品在线视频| 成人免费网址| 国模叶桐国产精品一区| 国产日韩电影| 成人亚洲激情网| 欧美成人午夜77777| 热re99久久精品国99热蜜月| 亚洲大全视频| 日韩欧美国产综合在线| 日韩电影免费一区| 日批视频在线看| 91视频国产观看| 久久精品亚洲a| 亚洲1区2区3区4区| 在线免费一区二区| 日韩欧美国产一区在线观看| 涩爱av在线播放一区二区| 日韩中文av在线| av在线加勒比| 国产这里只有精品| 老牛影视av一区二区在线观看 | 久久久久国产精品| 97视频久久久| 精品中文av资源站在线观看| 中文字幕a在线观看| 欧美国产综合一区二区| 久久午夜无码鲁丝片| 欧美吞精做爰啪啪高潮| 亚洲国产综合一区| 中文字幕亚洲天堂| 小早川怜子影音先锋在线观看| 91免费人成网站在线观看18| 亚洲8888| 欧美久久久久久久久久久久久久| 肉丝袜脚交视频一区二区| youjizz.com日本| 成人免费在线视频观看| 成人a v视频| 亚洲国产免费av| 污污视频在线| 国产日韩欧美日韩大片| 九九久久成人| 老太脱裤子让老头玩xxxxx| 韩国女主播成人在线观看| 国产成人精品无码免费看夜聊软件| 亚洲午夜精品17c| a天堂视频在线| 色播久久人人爽人人爽人人片视av| 黄色18在线观看| av资源站久久亚洲| 婷婷久久综合| 亚洲精品视频三区| 亚洲国产高清在线| 五月天婷婷导航| 亚洲精品综合精品自拍| av在线中出| 国产精品一区在线观看| 国产精品jizz在线观看美国| 成人性生交视频免费观看| 国产精品日产欧美久久久久| 伊人成年综合网| 一区二区成人av| 日本电影欧美片| 欧美婷婷久久| 久久久成人网| 亚洲精品成人无码熟妇在线| 黄色成人在线免费| 亚洲av成人精品毛片| 午夜免费久久久久| 精品福利网址导航| 国产美女主播在线| 国产成人精品午夜视频免费 | 欧美在线免费| 欧美精品色视频| 亚洲精品视频一区| 成人黄色在线观看视频| 欧美华人在线视频| 日韩精品一区二区三区免费视频| 亚洲成人动漫在线| 国产精品亚洲一区二区三区妖精| 日韩欧美综合视频| 日韩三区在线观看| av日韩中文| 欧美亚洲另类久久综合| 日本特黄久久久高潮| 91香蕉国产视频| 欧美一区二区观看视频| 黑人精品视频| 欧美三级电影在线播放| 蜜臀a∨国产成人精品| 日韩欧美国产成人精品免费| 小小影院久久| 久久好看免费视频| 在线日韩三级| 男人天堂a在线| www.66久久| 欧美性猛交xxxx乱大交hd| 久久精品国产69国产精品亚洲| 清纯唯美激情亚洲| 91免费黄视频| 国产视频一区在线播放| 一本色道久久综合精品婷婷| 欧美成人免费在线视频| 老司机成人在线| 网站一区二区三区| 亚洲人被黑人高潮完整版| 隣の若妻さん波多野结衣| 欧洲美女7788成人免费视频| 日韩a一区二区| 国产高潮视频在线观看| 色婷婷av一区二区三区之一色屋| 91社区在线高清| 超碰97网站| 日韩精品视频网| 久久久精品国产sm调教网站| 亚洲欧美日韩在线一区| 成人精品在线| 黄色免费观看视频网站| 中文字幕一区日韩精品欧美| 人妻精品一区二区三区| 国产精品扒开腿做| 好吊视频一区二区三区四区| gv天堂gv无码男同在线观看| 欧美成人a在线| jizz久久久久久| 日韩av中文字幕第一页| 中文一区二区在线观看| 欧美视频xxx|