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

手把手教Linux驅動7-內核互斥鎖

系統 Linux
信號量是在并行處理環境中對多個處理器訪問某個公共資源進行保護的機制,mutex用于互斥操作。信號量的count初始化為1,down()/up()也可以實現類似mutex的作用。

 [[340703]]

互斥體概述

信號量是在并行處理環境中對多個處理器訪問某個公共資源進行保護的機制,mutex用于互斥操作。信號量的count初始化為1,down()/up()也可以實現類似mutex的作用。

mutex的語義相對于信號量要簡單輕便一些,在鎖爭用激烈的測試場景下,mutex比信號量執行速度更快,可擴展性更好,另外mutex數據結構的定義比信號量小。

mutex的優點

  1. mutex和信號量相比要高效的多:
  2. mutex最先實現自旋等待機制
  3. mutex在睡眠之前嘗試獲取鎖
  4. mutex實現MCS所來避免多個CPU爭用鎖而導致CPU高速緩存顛簸現象。

mutex的使用注意事項:

  1. 同一時刻只有一個線程可以持有mutex。
  2. 只有鎖持有者可以解鎖。不能再一個進程中持有mutex,在另外一個進程中釋放他。
  3. 不允許遞歸地加鎖和解鎖。
  4. 當進程持有mutex時,進程不可以退出。
  5. mutex必須使用官方API來初始化。
  6. mutex可以睡眠,所以不允許在中斷處理程序或者中斷下半部中使用,例如tasklet、定時器等。

目錄:

  1. /linux/include/linux/mutex.h 
  2.  
  3. /* 
  4.  * Simple, straightforward mutexes with strict semantics: 
  5.  * 
  6.  * - only one task can hold the mutex at a time 
  7.  * - only the owner can unlock the mutex 
  8.  * - multiple unlocks are not permitted 
  9.  * - recursive locking is not permitted 
  10.  * - a mutex object must be initialized via the API 
  11.  * - a mutex object must not be initialized via memset or copying 
  12.  * - task may not exit with mutex held 
  13.  * - memory areas where held locks reside must not be freed 
  14.  * - held mutexes must not be reinitialized 
  15.  * - mutexes may not be used in hardware or software interrupt 
  16.  *   contexts such as tasklets and timers 
  17.  * 
  18.  * These semantics are fully enforced when DEBUG_MUTEXES is 
  19.  * enabled. Furthermore, besides enforcing the above rules, the mutex 
  20.  * debugging code also implements a number of additional features 
  21.  * that make lock debugging easier and faster: 
  22.  * 
  23.  * - uses symbolic names of mutexes, whenever they are printed in debug output 
  24.  * - point-of-acquire tracking, symbolic lookup of function names 
  25.  * - list of all locks held in the system, printout of them 
  26.  * - owner tracking 
  27.  * - detects self-recursing locks and prints out all relevant info 
  28.  * - detects multi-task circular deadlocks and prints out all affected 
  29.  *   locks and tasks (and only those tasks) 
  30.  */ 
  31. struct mutex { 
  32.   /* 1: unlocked, 0: locked, negative: locked, possible waiters */ 
  33.   atomic_t    count
  34.   spinlock_t    wait_lock; 
  35.   struct list_head  wait_list; 
  36. #if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_SMP) 
  37.   struct task_struct  *owner; 
  38. #endif 
  39. #ifdef CONFIG_MUTEX_SPIN_ON_OWNER 
  40.   void      *spin_mlock;  /* Spinner MCS lock */ 
  41. #endif 
  42. #ifdef CONFIG_DEBUG_MUTEXES 
  43.   const char     *name
  44.   void      *magic; 
  45. #endif 
  46. #ifdef CONFIG_DEBUG_LOCK_ALLOC 
  47.   struct lockdep_map  dep_map; 
  48. #endif 
  49. }; 

作用及訪問規則:

  1. 互斥鎖主要用于實現內核中的互斥訪問功能。內核互斥鎖是在原子 API 之上實現的,但這對于內核用戶是不可見的。
  2. 對它的訪問必須遵循一些規則:同一時間只能有一個任務持有互斥鎖,而且只有這個任務可以對互斥鎖進行解鎖。互斥鎖不能進行遞歸鎖定或解鎖。一個互斥鎖對象必須通過其API初始化,而不能使用memset或復制初始化。一個任務在持有互斥鎖的時候是不能結束的。互斥鎖所使用的內存區域是不能被釋放的。使用中的互斥鎖是不能被重新初始化的。并且互斥鎖不能用于中斷上下文。
  3. 互斥鎖比當前的內核信號量選項更快,并且更加緊湊。

互斥體的使用

初始化

靜態定義如下:

  1. DEFINE_MUTEX(name); 

動態初始化mutex,如下:

  1. mutex_init(&mutex); 

具體實現如下:

  1. #define mutex_init(mutex) \ 
  2. do {       \ 
  3.  static struct lock_class_key __key;  \ 
  4.        \ 
  5.  __mutex_init((mutex), #mutex, &__key);  \ 
  6. } while (0) 
  7.  
  8. void 
  9. __mutex_init(struct mutex *lock, const char *name, struct lock_class_key *key
  10.  atomic_set(&lock->count, 1); 
  11.  spin_lock_init(&lock->wait_lock); 
  12.  INIT_LIST_HEAD(&lock->wait_list); 
  13.  mutex_clear_owner(lock); 
  14. #ifdef CONFIG_MUTEX_SPIN_ON_OWNER 
  15.  lock->spin_mlock = NULL
  16. #endif 
  17.  
  18.  debug_mutex_init(lock, namekey); 

申請互斥鎖

mutex操作列表如下:

方法 描述
mutex_lock(struct mutex*) 為指定的mutex上鎖,如果不可用則睡眠
mutex_unlock(struct mutex*) 為指定的mutex解鎖
mutex_trylock(struct mutex*) 視圖獲取指定的mutex,如果成功則返回1;否則鎖被獲取,返回值是0
mutex_is_lock(struct mutex*) 如果鎖已被征用,則返回1;否則返回0

mutex的簡潔性和高效性源自于相比使用信號量更多的受限性。它不同于信號量,因為mutex僅僅實現了Dijkstra設計初衷中的最基本的行為。因此mutex的使用場景相對而言更嚴格。

(1)代碼:linux/kernel/mutex.c

  1. void inline fastcall __sched mutex_lock(struct mutex *lock);    
  2.  //獲取互斥鎖。 

實際上是先給count做自減操作,然后使用本身的自旋鎖進入臨界區操作。首先取得count的值,在將count置為-1,判斷如果原來count的置為1,也即互斥鎖可以獲得,則直接獲取,跳出。否則進入循環反復測試互斥鎖的狀態。在循環中,也是先取得互斥鎖原來的狀態,在將其之為-1,判斷如果可以獲取(等于1),則退出循環,否則設置當前進程的狀態為不可中斷狀態,解鎖自身的自旋鎖,進入睡眠狀態,待被在調度喚醒時,再獲得自身的自旋鎖,進入新一次的查詢其自身狀態(該互斥鎖的狀態)的循環。

(2)具體參見linux/kernel/mutex.c

  1. int fastcall __sched mutex_lock_interruptible(struct mutex *lock); 

和mutex_lock()一樣,也是獲取互斥鎖。在獲得了互斥鎖或進入睡眠直到獲得互斥鎖之后會返回0。如果在等待獲取鎖的時候進入睡眠狀態收到一個信號(被信號打斷睡眠),則返回_EINIR。

(3)具體參見linux/kernel/mutex.c

  1. int fastcall __sched mutex_trylock(struct mutex *lock); 

試圖獲取互斥鎖,如果成功獲取則返回1,否則返回0,不等待。

釋放互斥鎖

具體參見linux/kernel/mutex.c

  1. void fastcall mutex_unlock(struct mutex *lock); 

釋放被當前進程獲取的互斥鎖。該函數不能用在中斷上下文中,而且不允許去釋放一個沒有上鎖的互斥鎖。

互斥鎖試用注意事項

  1. 任何時刻中只有一個任務可以持有mutex, 也就是說,mutex的使用計數永遠是1
  2. 給mutex鎖者必須負責給其再解鎖——你不能在一個上下文中鎖定一個mutex,而在另 一個上下文中給它解鎖。這個限制使得mutex不適合內核同用戶空間復雜的同步場景。最 常使用的方式是:在同一上下文中上鎖和解鎖。
  3. 遞歸地上鎖和解鎖是不允許的。也就是說,你不能遞歸地持有同一個鎖,同樣你也不能再去解鎖一個已經被解開的mutex
  4. 當持有一個mutex時 ,進程不可以退出
  5. mutex不能在中斷或者下半部中使用,即使使用mutex_trylock()也不行
  6. mutex只能通過官方API管理:它只能使用上節中描述的方法初始化,不可被拷貝、手動 初始化或者重復初始化

信號量和互斥體

互斥體和信號量很相似,內核中兩者共存會令人混淆。所幸,它們的標準使用方式都有簡單規范:除非mutex的某個約束妨礙你使用,否則相比信號量要優先使用mutex。當你寫新代碼時,只有碰到特殊場合(一般是很底層代碼)才會需要使用信號量。因此建議 選mutex。如果發現不能滿足其約束條件,且沒有其他別的選擇時,再考慮選擇信號量

自旋鎖和互斥體使用場合

了解何時使用自旋鎖,何時使用互斥體(或信號量)對編寫優良代碼很重要,但是多數情況下,并不需要太多的考慮,因為在中斷上下文中只能使用自旋鎖,而在任務睡眠時只能使用互斥體。

下面總結一下各種鎖的需求情況

需求 建議的加鎖方法
低開銷加鎖 優先使用自旋鎖
短期鎖定 優先使用自旋鎖
長期鎖定 優先使用互斥體
中斷上下文中加鎖 使用自旋鎖
持有鎖需要睡眠 使用互斥體

互斥鎖鎖定和解鎖使用實例

使用方法如下:

  1. 1. struct mutex mutex; 
  2. 2. mutex_init(&mutex); /*定義*/ 
  3. 3. //加鎖 
  4. 4. mutex_lock(&mutex); 
  5. 5.   
  6. 6. //臨界區 
  7. 7.  
  8. 8. //解鎖 
  9. 9. mutex_unlock(&mutex); 

可以看出,互斥體就是一個簡化版的信號量,因為不再需要管理任何使用計數。

下面網卡DM9000的驅動,其中寫入eeprom的操作試用了mutex機制:

  1. static void 
  2. dm9000_write_eeprom(board_info_t *db, int offset, u8 *data) 
  3.  unsigned long flags; 
  4.  
  5.  if (db->flags & DM9000_PLATF_NO_EEPROM) 
  6.   return
  7.  
  8.  mutex_lock(&db->addr_lock); 
  9.  
  10.  spin_lock_irqsave(&db->lock, flags); 
  11.  iow(db, DM9000_EPAR, offset); 
  12.  iow(db, DM9000_EPDRH, data[1]); 
  13.  iow(db, DM9000_EPDRL, data[0]); 
  14.  iow(db, DM9000_EPCR, EPCR_WEP | EPCR_ERPRW); 
  15.  spin_unlock_irqrestore(&db->lock, flags); 
  16.  
  17.  dm9000_wait_eeprom(db); 
  18.  
  19.  mdelay(1); /* wait at least 150uS to clear */ 
  20.  
  21.  spin_lock_irqsave(&db->lock, flags); 
  22.  iow(db, DM9000_EPCR, 0); 
  23.  spin_unlock_irqrestore(&db->lock, flags); 
  24.  
  25.  mutex_unlock(&db->addr_lock); 

可以看到每次驅動向eeprom寫入數據(訪問臨界資源),都需要首先獲得該資源對應的互斥鎖db->addr_lock,并且使用完畢必須釋放該鎖。

本文轉載自微信公眾號「一口Linux」,可以通過以下二維碼關注。轉載本文請聯系一口Linux公眾號。

 

責任編輯:武曉燕 來源: 一口Linux
相關推薦

2020-09-27 06:59:59

IO系統Linux

2021-02-04 11:53:49

Linuxplatform總線

2021-04-12 12:00:13

Linux運維Linux系統

2022-09-14 17:12:15

flowable源碼DEMO

2009-11-06 10:44:31

Visual Stud

2020-11-10 09:00:00

JavaMule ESB開發

2011-01-10 14:41:26

2010-08-18 09:15:45

路由器網絡診斷

2009-10-21 10:47:03

Siliverligh

2010-07-07 10:24:46

Python多線程

2010-04-02 16:51:09

虛擬機安裝linux

2025-06-11 01:00:00

2020-09-23 07:00:00

Selenium We架構

2020-02-21 19:54:09

HTTPS 配置手把手教

2009-12-11 09:04:10

Windows搭建Li

2022-01-17 07:50:37

Linux Patch項目

2010-09-02 10:50:17

時間同步服務器

2010-09-14 09:24:27

家庭無線網絡

2021-09-18 14:26:49

Linux Linux 啟動流程Linux 系統

2010-08-26 09:24:59

路由器網絡診斷
點贊
收藏

51CTO技術棧公眾號

日韩视频在线观看视频| 久久免费视频网站| 欧美美女性视频| 91三级在线| 99在线视频精品| 国产精品久久久久久av福利| 黑鬼狂亚洲人videos| 亚洲日本va午夜在线电影| 精品久久久久久久中文字幕| 亚洲激情一区二区三区| 国产成人精品一区二三区四区五区 | 99精品视频在线观看播放| 日韩午夜激情电影| 丁香啪啪综合成人亚洲| 成人黄色网址| 久久久精品综合| 亚洲资源在线看| 亚洲欧美偷拍一区| 午夜欧美视频| 国产一区二区三区欧美| 四虎精品一区二区| 婷婷激情成人| 日本精品一区二区三区高清| 欧美日韩视频免费| jyzzz在线观看视频| 不卡视频在线看| 91久久精品在线| 青青草视频在线观看免费| 欧美精品99| zzjj国产精品一区二区| 国产高清一区二区三区四区| 18国产精品| 欧美精品日韩综合在线| 激情网站五月天| 操人在线观看| 亚洲综合一区二区三区| 一区中文字幕在线观看| www日韩tube| 久久久久久久国产精品影院| 国产一区不卡在线观看| 精品人妻无码一区二区| 激情丁香综合五月| 国产精品视频大全| 美女黄页在线观看| 美女爽到呻吟久久久久| 午夜精品久久久久久久99热浪潮| 青青操国产视频| 亚洲电影在线一区二区三区| 伊人激情综合网| 欧美久久久精品| 噜噜噜在线视频| 国产精品极品在线观看| 日韩一区二区影院| 欧美国产日韩另类 | 成人国产在线激情| 国产成人精品一区二区色戒| 日韩一区精品字幕| 日本午夜精品理论片a级appf发布| 91精品国产乱码在线观看| 亚洲裸体俱乐部裸体舞表演av| 欧美另类极品videosbest最新版本 | 一区二区三区| 在线综合视频播放| 手机在线播放av| 国产美女视频一区二区| 欧美一二三在线| 久久久国产精品久久久| 日本在线视频一区二区三区| 日韩一区二区免费高清| 美女日批在线观看| 另类ts人妖一区二区三区| 日韩电视剧免费观看网站| 97国产精品久久| 亚洲综合网在线| 欧美特黄一区| 欧美精品videos| 日韩欧美大片在线观看| 免费视频一区| 国产精品99久久久久久人| 老熟妇一区二区三区啪啪| 久久99精品国产麻豆不卡| 亚洲尤物视频网| 熟妇高潮一区二区高潮| wwwwxxxxx欧美| 天堂一区二区三区| 免费大片黄在线观看视频网站| 亚洲欧美日韩系列| 久久这里只有精品23| 亚洲精品**中文毛片| 欧美中文字幕一区| 日韩视频在线观看一区二区三区| 中文在线综合| 亚洲人成网站777色婷婷| 国产极品视频在线观看| 欧美三区视频| 国产成人一区二区三区电影| 538国产精品视频一区二区| 久久久久久久久久久久久女过产乱| 欧美涩涩视频| 国产成人精品免高潮在线观看| 亚洲字幕av一区二区三区四区| 国产黄频在线观看| 久久精品国产成人一区二区三区| 欧美国产高跟鞋裸体秀xxxhd| 无遮挡aaaaa大片免费看| 精品国产精品| 美女av一区二区三区| 亚洲影院在线播放| 国产一区二区在线观看视频| 久久精品美女| 一色桃子av在线| 欧美视频在线观看一区| 国产精品无码一区二区三| 红桃视频在线观看一区二区| 欧美激情第1页| 黄色污污视频软件| av在线不卡观看免费观看| 一本一道久久a久久精品综合| 99视频在线观看地址| 亚洲无人区一区| 污污网站免费观看| 久草精品在线| 91高清免费视频| 成人免费视频国产| 亚洲精选免费视频| 极品粉嫩美女露脸啪啪| 神马电影久久| 欧美最近摘花xxxx摘花| 狠狠人妻久久久久久综合麻豆| 成av人片一区二区| 青青草视频国产| 欧洲午夜精品| 一区二区欧美久久| 国产精品国产三级国产专播精品人 | 2019亚洲日韩新视频| 亚洲综合精品在线| 91在线视频官网| 国产精品免费看久久久无码| 人人鲁人人莫人人爱精品| 精品黑人一区二区三区久久| 欧美一区二区三区观看| 久久婷婷丁香| 国产视频99| 羞羞网站在线免费观看| 在线免费观看毛片| 国产suv精品一区二区三区| 在线观看精品视频| 日韩国产网站| 精品偷拍各种wc美女嘘嘘| 欧美日韩精品在线观看视频 | 成人春色激情网| 国内在线精品| 亚洲综合成人在线视频| 久久精品一二三四| 91精品在线观看国产| 国产精品狠色婷| 美女做暖暖视频免费在线观看全部网址91| 久久亚洲免费视频| 亚洲色成人www永久在线观看| 这里有精品可以观看| 精品国产一区二区国模嫣然| 男人与禽猛交狂配| 日韩黄色网络| 亚洲综合在线五月| 国产成人强伦免费视频网站| 欧美一区影院| 99re国产视频| 日韩123区| 日韩一区二区在线免费观看| 刘亦菲国产毛片bd| 老司机精品视频在线| 在线观看免费黄色片| 999精品视频在线观看| 中文字幕视频一区二区在线有码| 成年人二级毛片| 国内精品伊人久久久久av影院 | 宅男在线精品国产免费观看| av日韩一区| 久久91亚洲精品中文字幕奶水| 欧美一级视频免费观看| 成人白浆超碰人人人人| 青青青免费在线| 亚洲精品**不卡在线播he| 国产精品入口免费视频一| 免费黄色网址在线观看| 日韩一卡二卡三卡国产欧美| 国产一级特黄毛片| www日韩大片| 18禁免费无码无遮挡不卡网站| 亚洲天堂中文字幕在线观看| 欧美大胆在线视频| 人妻精品一区二区三区| 欧美午夜美女看片| 国产精品视频在| 国产一区二区三区在线观看精品 | 韩国精品视频| 欧美丝袜自拍制服另类| 男人晚上看的视频| 国产宾馆实践打屁股91| 日本wwww视频| 99热在线成人| 国内精品国语自产拍在线观看| av免费网站在线| 亚洲精品理论电影| 国产伦精品一区二区三区免.费| 久久久久久久久蜜桃| 亚洲美女爱爱视频| 久久国产精品黑丝| 成人欧美一区二区三区黑人麻豆| 成人av在线不卡| 狠狠做深爱婷婷综合一区| 亚洲影院色在线观看免费| 天堂√中文最新版在线| 在线观看日韩视频| 精品久久在线观看| 婷婷丁香激情综合| 久久久久久久久久久97| 久久精品免视看| caopor在线| 美女尤物国产一区| 国内精品视频一区二区三区| 国产成人短视频在线观看| 国产精品成人一区二区三区| 成人午夜在线| 51精品国产黑色丝袜高跟鞋| 成人日批视频| 国产亚洲精品成人av久久ww| 国产巨乳在线观看| 欧美日韩你懂的| 丁香六月婷婷综合| 亚洲国产日韩一级| 天天操夜夜操av| 久久毛片高清国产| 日韩精品国产一区| 久久66热偷产精品| 欧美日韩在线观看不卡| 亚洲综合国产| 男女激情无遮挡| 欧美视频官网| 国产免费一区二区三区四在线播放 | 香蕉一区二区| aaa级精品久久久国产片| 国产福利一区二区三区在线播放| 中文字幕久久精品| 丰满人妻妇伦又伦精品国产| 欧美一区二区三区在线电影| 午夜久久久久久久久久影院| 亚洲超碰97人人做人人爱| 91视频免费在线看| 国产目拍亚洲精品99久久精品| 不卡影院一区二区| 亚洲深夜福利| 成年人网站免费视频| 黑丝一区二区三区| 亚洲精品天堂成人片av在线播放 | 一本在线免费视频| 国产丝袜欧美中文另类| 中文字幕丰满乱子伦无码专区| 日韩电影一区二区三区四区| 国产白丝袜美女久久久久| 影音先锋亚洲一区| 欧美精品一区免费| 国产日本精品| 国产二区视频在线| 一道本一区二区| 欧美黄网站在线观看| 先锋亚洲精品| 日本黄网站免费| 日韩高清一区在线| 男人搞女人网站| 国产精品1区2区3区在线观看| 成人午夜免费在线| 樱桃成人精品视频在线播放| 熟女少妇在线视频播放| 99精品视频免费观看视频| 国产日韩一区二区在线观看| 久久综合网络一区二区| 国产91色在线观看| 九九九久久久精品| 欧美成人乱码一二三四区免费| 99国内精品| 国产激情在线观看视频| 理论电影国产精品| 亚洲丝袜在线观看| 成人视屏免费看| www.自拍偷拍| 国产精品国产三级国产专播品爱网| 亚洲色偷偷色噜噜狠狠99网| 91丨国产丨九色丨pron| 少妇视频一区二区| 亚洲理论在线观看| 日本午夜视频在线观看| 在线日韩国产精品| 亚洲美女福利视频| 日韩精品在线私人| 日韩理伦片在线| 欧美激情日韩图片| 天堂久久午夜av| 99国产超薄丝袜足j在线观看| av成人在线播放| 亚洲自拍中文字幕| 亚洲电影男人天堂| 成年女人18级毛片毛片免费| 在线一区免费观看| 午夜啪啪小视频| 久久蜜桃一区二区| 国产性一乱一性一伧一色| 日韩欧美国产激情| av免费在线观看不卡| 亚洲精品资源在线| 国内小视频在线看| 国产精品久久电影观看| 国产人与zoxxxx另类91| 久久国产精品久久精品国产| 亚洲色图网站| 欧美三级午夜理伦三级| 国产91精品欧美| 久久视频一区二区三区| 一本久久综合亚洲鲁鲁五月天| 日韩福利片在线观看| 欧美色手机在线观看| 天堂av一区二区三区| 国产亚洲视频中文字幕视频| 三级在线观看视频| 亚洲专区国产精品| 精品香蕉视频| 怡红院av亚洲一区二区三区h| 亚洲精品男同| 国产精品探花在线播放| 91在线精品一区二区| 日本a级片视频| 欧美在线观看禁18| 深夜福利在线看| 欧美极品美女电影一区| 日韩毛片免费看| 亚洲mv在线看| 久久精品首页| 毛茸茸free性熟hd| 一区二区日韩av| 国产黄色片av| 久久激情五月丁香伊人| 日韩三区免费| 欧美中日韩免费视频| 天堂资源在线中文精品| 好吊一区二区三区视频| 一区二区三区四区激情| 国产精品无码一区二区桃花视频| 精品国产sm最大网站| 午夜免费福利在线观看| 国产精品福利在线观看网址| 婷婷五月色综合香五月| 91av资源网| 91女神在线视频| 黄色大片网站在线观看| 日韩精品在线免费| 小黄鸭精品aⅴ导航网站入口| 国产美女久久久| 成人精品视频| 91av资源网| 国产拍揄自揄精品视频麻豆| 午夜影院免费在线观看| 亚洲免费av片| 国产69精品久久久久9999人| 手机看片福利永久国产日韩| 蜜臀久久久99精品久久久久久| 日韩av片免费观看| 一区二区三区产品免费精品久久75| 国产无精乱码一区二区三区| 日韩免费视频一区| 成人性生交大片免费看在线播放| 欧美亚洲国产日韩2020| 日本欧美高清| 日本久久久久久久久久久久| 国产精品亲子伦对白| 97视频免费在线| 久久影院资源网| 视频一区日韩精品| 日韩欧美一级在线| 91网站在线观看视频| 免费av网站在线| 亚洲欧美精品一区| 青青热久免费精品视频在线18| 91在线中文字幕| 在线精品视频在线观看高清| 永久免费看片在线观看| 欧美日韩免费一区| 97视频精彩视频在线观看| 91久久久久久久久久| 99精品免费网| 国产视频123区| 欧美mv日韩mv国产网站| 91九色美女在线视频| 天堂一区二区三区| 国产福利精品导航| 五月婷婷视频在线| 欧美精品在线观看| 久久99高清| 51自拍视频在线观看| 日韩欧美亚洲范冰冰与中字| 欧美18hd|