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

Linux設備驅動中的并發控制

系統 Linux
并發指的是多個執行單元同時、并行被執行,而并發的執行單元對共享資源的訪問則很容易導致競態。

[[208856]]

并發指的是多個執行單元同時、并行被執行,而并發的執行單元對共享資源的訪問則很容易導致競態。

linux內核中主要競態

1.多對稱處理器的多個CPU

2.單CPU內進程與搶占它的進程

3.中斷(硬中斷、軟中斷、Tasklet、下半部)與進程之間

訪問共享內存資源的代碼區稱為“臨界區”,臨界區需要被以某種互斥機制加以保護,中斷屏蔽、原子操作、自旋鎖和信號量等,是linux設備驅動中可采用的互斥途徑。

這幾個互斥的介紹:

1.中斷屏蔽,這個主要用于單CPU,中斷屏蔽將使得中斷和進程之間的并發不再發生。

使用方法:

  1. local_irq_disable();//屏蔽中斷 
  2. ... 
  3. ... 
  4. 臨界區 
  5. ... 
  6. local_irq_enable();//開中斷 

 

由于linux的異步IO、進程調度等很多重要的操作都依賴于中斷,中斷對于內核的運行非常重要,在屏蔽中斷期間所有的中斷都無法處理,因此長時間的屏蔽中斷很危險,有可能導致數據丟失甚至系統崩潰。所以這個不作為重點討論。

**********************************************************************************************************************************************************

2.原子操作,原子操作是一系列的不能被打斷的操作

linux內核提供了一系列的函數來實現內核中的原子操作,這些函數分為2類,分別針對位和整型變量進行原子操作。

實現原子操作的步驟:

1).定義原子變量并設置變量值

  1. void atomic_set(atomic_t *v , int i); //設置原子變量值為i 
  2.  
  3. atomic_t v = ATOMIC_INIT(0); //定義原子變量v,初始化為0 

 

2).獲取原子變量的值

  1. atomic_read(atomic_t *v); 

3).原子變量加減操作

  1. void atomic_add(int i,atomic_t *v);//原子變量加i 
  2.  
  3. void atomic_sub(int i ,atomic_t *v);//原子變量減i 

 

4).原子變量自增/自減

  1. void atomic_inc(atomic_t *v);//自增1 
  2.  
  3. void atomic_dec(atomic_t *v);//自減1 

 

5).操作并測試:對原子變量執行自增、自減后(沒有加)測試其是否為0,如果為0返回true,否則返回false。

  1. int atomic_inc_and_test(atomic_t *v); 
  2.  
  3. int atomic_dec_and_test(atomic_t *v); 
  4.  
  5. int atomic_sub_and_test(int i ,atomic_t *v); 

 

6).操作并返回

  1. int atomic_add_return(int i , atomic_t *v); 
  2.  
  3. int atomic_sub_return(int i , atomic_t *v); 
  4.  
  5. int atomic_inc_return(atomic_t * v); 
  6.  
  7. int atomic_dec_return(atomic_t * v); 

 

**********************************************************************************************************************************************************

3.自旋鎖

自旋鎖是一個忙鎖,它在一個小的循環內不斷的重復測試并設置的操作。

自旋鎖保護臨界區的特點:臨界區要小,并且臨界區內不能有導致睡眠的操作,否則可能引起系統崩潰。自旋鎖可能導致系統死鎖,引發這個問題最常見的情況是遞歸使用一個自旋鎖。

自旋鎖的操作步驟:

1).定義自旋鎖

  1. spinlock_t lock; 

2).初始化自旋鎖

  1. spin_lock_init(lock); //這是個宏,它用于動態初始化自旋鎖lock; 

3).獲得自旋鎖

  1. spin_lock(lock);//該宏用于加鎖,如果能夠立即獲得鎖,它就能馬上返回,否則,他將自旋在那里,直到該自旋鎖的保持者釋放。 
  2.  
  3. spin_trylock(lock);//能夠獲得,則返回真,否則返回假,實際上是不在原地打轉而已。 

 

4).釋放自旋鎖

  1. spin_unlock(lock); 

與上面的兩個配對使用。

例子:

  1. spinlock_t lock; 
  2.  
  3. spin_lock_init(&lock); 
  4.  
  5. spin_lock(&lock); //獲取自旋鎖,保護臨界區。。。。臨界區 
  6.  
  7. spin_unlock(&lock);//釋放自旋鎖 

 

自旋鎖不關心鎖定的臨界區究竟是如何執行的。不管是讀操作還是寫操作,實際上,對共享資源進行讀取的時候是應該可以允許多個執行單元同時訪問的,那么這樣的話,自旋鎖就有了弊端。于是便衍生出來一個讀寫鎖。

它保留了自旋的特性,但在對操作上面可以允許有多個單元進程同時操作。當然,讀和寫的時候不能同時進行。

現在又有問題了,如果我第一個進程寫共享資源,第二個進程讀的話,一旦寫了,那么就讀不到了,可能寫的東西比較多,但是第二個進程讀很小,那么能不能第一個進程寫的同時,我第二個進程讀呢?

當然可以,那么引出了順序鎖的概念。都是一樣的操作。

**********************************************************************************************************************************************************

4.信號量

是用于保護臨界區的一種常用的方法,它的使用與自旋鎖差不多,但是它不在原地打轉,當獲取不到信號量時候,進程會進入休眠等待狀態。

主要操作:

1).定義sem信號量

  1. struct semaphore sem; 

2).初始化信號量

  1. void sema_init(struct semaphore *sem, int val); 

初始化信號量,并設置sem的值為val

初始化的時候還可以這樣用,init_MUTEX(sem),這是個宏 #define init_MUTEX(sem) sema_init(sem , 1)

init_MUTEX_LOCKED(sem),這是個宏 #define init_MUTEX_LOCKED(sem) sema_init(sem , 0)

3).獲得信號量

  1. void down(struct semaphore * sem); 

該函數用于獲得信號量sem,他會導致睡眠,所以不能在中斷中使用。

  1. int down_interruptible(struct semaphore* sem); 

與上面功能類似,因為down進入睡眠狀態的進程不能被信號打斷,而它能被信號打斷,信號也會導致該函數返回。

  1. int down_trylock(struct semaphore * sem); 

4).釋放信號量

  1. void up(struct semaphore * sem); 

該函數用于釋放信號量,同時喚醒等待者。

信號量一般這樣使用:

  1. DECLARE_MUTEX(sem); 
  2.  
  3. down(&sem); 
  4.  
  5. .....臨界區 
  6.  
  7. up(&sem); 

 

linux自旋鎖和信號量采用的“獲取鎖-訪問臨界區-釋放鎖”的方式。

*************************************************************************************************************************

5.互斥體

互斥體和信號量基本上差不多。不介紹了。

總結:

并發和競態廣泛存在,這幾個機制是解決問題的好方法,中斷屏蔽很少單獨使用,原子操作只能針對整數進行,因此,自旋鎖和信號量應用最為廣泛。

自旋鎖會導致死循環,鎖定期間不允許阻塞,因此要求鎖定的臨界區要小。信號量允許臨界區阻塞,可以適用于臨界區較大的情況。讀寫自旋鎖和讀寫信號量是放寬了條件的自旋鎖和信號量,他們允許多個進程并發的讀取共享空間。

一個fifo的綜合例子

  1. /*====================================================================== 
  2.     A globalfifo driver as an example of char device drivers   
  3.     This example is to introduce poll,blocking and non-blocking access 
  4.        
  5.     The initial developer of the original code is Baohua Song 
  6.     <author@linuxdriver.cn>. All Rights Reserved. 
  7. ======================================================================*/#include <linux/module.h>#include <linux/types.h>#include <linux/fs.h>#include <linux/errno.h>#include <linux/mm.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/cdev.h>#include <asm/io.h>#include <asm/system.h>#include <asm/uaccess.h>#include <linux/poll.h>#include <linux/time.h>#include <linux/timer.h>#include <linux/kernel.h>#include <linux/spinlock.h>#include <linux/interrupt.h>#define GLOBALFIFO_SIZE 0x1000 /*全局fifo最大4K字節*/#define FIFO_CLEAR 0x1  /*清0全局內存的長度*/#define GLOBALFIFO_MAJOR 250    /*預設的globalfifo的主設備號*/static int globalfifo_major = GLOBALFIFO_MAJOR;/*globalfifo設備結構體*/struct globalfifo_dev                                      
  8. {                                                         
  9.   struct cdev cdev; /*cdev結構體*/                        
  10.   unsigned int current_len;    /*fifo有效數據長度*/ 
  11.   unsigned char mem[GLOBALFIFO_SIZE]; /*全局內存*/         
  12.   struct semaphore sem; /*并發控制用的信號量*/            
  13.   wait_queue_head_t r_wait; /*阻塞讀用的等待隊列頭*/      
  14.   wait_queue_head_t w_wait; /*阻塞寫用的等待隊列頭*/      
  15.   struct tasklet_struct tlet; 
  16. };struct globalfifo_dev *globalfifo_devp; /*設備結構體指針*//*文件打開函數*/int globalfifo_open(struct inode *inode, struct file *filp) 
  17. {  /*將設備結構體指針賦值給文件私有數據指針*/ 
  18.   filp->private_data = globalfifo_devp;  return 0; 
  19. }/*文件釋放函數*/int globalfifo_release(struct inode *inode, struct file *filp) 
  20. {  return 0; 
  21. }/* ioctl設備控制函數 */static int globalfifo_ioctl(struct inode *inodep, struct file *filp, unsigned  int cmd, unsigned long arg) 
  22. {  struct globalfifo_dev *dev = filp->private_data;/*獲得設備結構體指針*/ 
  23.  
  24.   switch (cmd) 
  25.   {    case FIFO_CLEAR: 
  26.      down(&dev->sem); //獲得信號量      
  27.       dev->current_len = 0; 
  28.       memset(dev->mem,0,GLOBALFIFO_SIZE); 
  29.       up(&dev->sem); //釋放信號量          
  30.       printk(KERN_INFO "globalfifo is set to zero\n");       
  31.       break;    default:      return  - EINVAL; 
  32.   }  return 0; 
  33. }static unsigned int globalfifo_poll(struct file *filp, poll_table *wait) 
  34.   unsigned int mask = 0;  struct globalfifo_dev *dev = filp->private_data; /*獲得設備結構體指針*/ 
  35.    
  36.   down(&dev->sem); 
  37.    
  38.   poll_wait(filp, &dev->r_wait, wait); 
  39.   poll_wait(filp, &dev->w_wait, wait);   
  40.   /*fifo非空*/ 
  41.   if (dev->current_len != 0) 
  42.   { 
  43.     mask |= POLLIN | POLLRDNORM; /*標示數據可獲得*/ 
  44.   }  /*fifo非滿*/ 
  45.   if (dev->current_len != GLOBALFIFO_SIZE) 
  46.   { 
  47.     mask |= POLLOUT | POLLWRNORM; /*標示數據可寫入*/ 
  48.   } 
  49.       
  50.   up(&dev->sem);  return mask; 
  51. }/*globalfifo讀函數*/static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t count
  52.   loff_t *ppos) 
  53. {  int ret;  struct globalfifo_dev *dev = filp->private_data; //獲得設備結構體指針 
  54.   DECLARE_WAITQUEUE(wait, current); //定義等待隊列 
  55.   down(&dev->sem); //獲得信號量 
  56.   add_wait_queue(&dev->r_wait, &wait); //進入讀等待隊列頭 
  57.  
  58.   /* 等待FIFO非空 */ 
  59.   if (dev->current_len == 0) 
  60.   {    if (filp->f_flags &O_NONBLOCK) 
  61.     { 
  62.       ret =  - EAGAIN;      goto out
  63.     }  
  64.     __set_current_state(TASK_INTERRUPTIBLE); //改變進程狀態為睡眠 
  65.     up(&dev->sem); 
  66.  
  67.     schedule(); //調度其他進程執行 
  68.     if (signal_pending(current))    //如果是因為信號喚醒    { 
  69.       ret =  - ERESTARTSYS;      goto out2; 
  70.     } 
  71.  
  72.     down(&dev->sem); 
  73.   }  /* 拷貝到用戶空間 */ 
  74.   if (count > dev->current_len) 
  75.     count = dev->current_len;  if (copy_to_user(buf, dev->mem, count)) 
  76.   { 
  77.     ret =  - EFAULT;    goto out
  78.   }  else 
  79.   { 
  80.     memcpy(dev->mem, dev->mem + count, dev->current_len - count); //fifo數據前移 
  81.     dev->current_len -= count; //有效數據長度減少 
  82.     printk(KERN_INFO "read %d bytes(s),current_len:%d\n"count, dev->current_len); 
  83.       
  84.     wake_up_interruptible(&dev->w_wait); //喚醒寫等待隊列     
  85.     ret = count
  86.   }  out: up(&dev->sem); //釋放信號量 
  87.   out2:remove_wait_queue(&dev->w_wait, &wait); //從附屬的等待隊列頭移除  set_current_state(TASK_RUNNING);  return ret; 
  88. }/*globalfifo寫操作*/static ssize_t globalfifo_write(struct file *filp, const char __user *buf, 
  89.   size_t count, loff_t *ppos) 
  90. {  struct globalfifo_dev *dev = filp->private_data; //獲得設備結構體指針 
  91.   int ret; 
  92.   DECLARE_WAITQUEUE(wait, current); //定義等待隊列 
  93.   down(&dev->sem); //獲取信號量 
  94.   add_wait_queue(&dev->w_wait, &wait); //進入寫等待隊列頭 
  95.  
  96.   /* 等待FIFO非滿 */ 
  97.   if (dev->current_len == GLOBALFIFO_SIZE) 
  98.   {    if (filp->f_flags &O_NONBLOCK)    //如果是非阻塞訪問    { 
  99.       ret =  - EAGAIN;      goto out
  100.     }  
  101.     __set_current_state(TASK_INTERRUPTIBLE); //改變進程狀態為睡眠 
  102.     up(&dev->sem); 
  103.  
  104.     schedule(); //調度其他進程執行 
  105.     if (signal_pending(current))    //如果是因為信號喚醒    { 
  106.       ret =  - ERESTARTSYS;      goto out2; 
  107.     } 
  108.  
  109.     down(&dev->sem); //獲得信號量  }  /*從用戶空間拷貝到內核空間*/ 
  110.   if (count > GLOBALFIFO_SIZE - dev->current_len) 
  111.     count = GLOBALFIFO_SIZE - dev->current_len;  if (copy_from_user(dev->mem + dev->current_len, buf, count)) 
  112.   { 
  113.     ret =  - EFAULT;    goto out
  114.   }  else 
  115.   { 
  116.     dev->current_len += count
  117.     printk(KERN_INFO "written %d bytes(s),current_len:%d\n"count, dev      ->current_len); 
  118.  
  119.     wake_up_interruptible(&dev->r_wait); //喚醒讀等待隊列     
  120.     ret = count
  121.   } 
  122.  
  123.  
  124. tasklet_schedule(&dev->tlet); 
  125. printk("in write jiffies=%ld\n",jiffies);  out: up(&dev->sem); //釋放信號量 
  126.   out2:remove_wait_queue(&dev->w_wait, &wait); //從附屬的等待隊列頭移除  set_current_state(TASK_RUNNING);  return ret; 
  127. }/*文件操作結構體*/static const struct file_operations globalfifo_fops ={ 
  128.   .owner = THIS_MODULE, 
  129.   .read = globalfifo_read, 
  130.   .write = globalfifo_write, 
  131.   .ioctl = globalfifo_ioctl, 
  132.   .poll = globalfifo_poll, 
  133.   .open = globalfifo_open, 
  134.   .release = globalfifo_release, 
  135. };/*初始化并注冊cdev*/static void globalfifo_setup_cdev(struct globalfifo_dev *dev, int index
  136. {  int err, devno = MKDEV(globalfifo_major, index); 
  137.  
  138.   cdev_init(&dev->cdev, &globalfifo_fops); 
  139.   dev->cdev.owner = THIS_MODULE; 
  140.   dev->cdev.ops = &globalfifo_fops; 
  141.   err = cdev_add(&dev->cdev, devno, 1);  if (err) 
  142.     printk(KERN_NOTICE "Error %d adding LED%d", err, index); 
  143. }void jit_tasklet_fn(unsigned long arg) 
  144.  printk("in jit_tasklet_fn  jiffies=%ld\n",jiffies); 
  145. }/*設備驅動模塊加載函數*/int globalfifo_init(void) 
  146. {  int ret; 
  147.   dev_t devno = MKDEV(globalfifo_major, 0);  /* 申請設備號*/ 
  148.   if (globalfifo_major) 
  149.     ret = register_chrdev_region(devno, 1, "globalfifo");  else  /* 動態申請設備號 */ 
  150.  
  151.   { 
  152.     ret = alloc_chrdev_region(&devno, 0, 1, "globalfifo"); 
  153.     globalfifo_major = MAJOR(devno); 
  154.   }  if (ret < 0)    return ret;  /* 動態申請設備結構體的內存*/ 
  155.   globalfifo_devp = kmalloc(sizeof(struct globalfifo_dev), GFP_KERNEL);  if (!globalfifo_devp)    /*申請失敗*/ 
  156.   { 
  157.     ret =  - ENOMEM;    goto fail_malloc; 
  158.   } 
  159.  
  160.   memset(globalfifo_devp, 0, sizeof(struct globalfifo_dev)); 
  161.  
  162.   globalfifo_setup_cdev(globalfifo_devp, 0); 
  163.  
  164.   init_MUTEX(&globalfifo_devp->sem);   /*初始化信號量*/ 
  165.   init_waitqueue_head(&globalfifo_devp->r_wait); /*初始化讀等待隊列頭*/ 
  166.   init_waitqueue_head(&globalfifo_devp->w_wait); /*初始化寫等待隊列頭*/ 
  167.  /* register the tasklet */ 
  168.  tasklet_init(&globalfifo_devp->tlet, jit_tasklet_fn, (unsigned long)globalfifo_devp);  return 0; 
  169.  
  170.   fail_malloc: unregister_chrdev_region(devno, 1);  return ret; 
  171. }/*模塊卸載函數*/void globalfifo_exit(void) 
  172.   cdev_del(&globalfifo_devp->cdev);   /*注銷cdev*/ 
  173.   kfree(globalfifo_devp);     /*釋放設備結構體內存*/ 
  174.   unregister_chrdev_region(MKDEV(globalfifo_major, 0), 1); /*釋放設備號*/} 
  175.  
  176. MODULE_AUTHOR("Song Baohua"); 
  177. MODULE_LICENSE("Dual BSD/GPL"); 
  178.  
  179. module_param(globalfifo_major, int, S_IRUGO); 
  180.  
  181. module_init(globalfifo_init); 
  182. module_exit(globalfifo_exit); 

 

責任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關推薦

2017-02-28 17:46:15

Linux驅動技術并發控制

2023-05-15 08:58:41

塊設備驅動Linux

2023-05-12 07:27:24

Linux內核網絡設備驅動

2020-12-03 08:59:06

Linux設備驅動

2017-02-10 15:32:47

2021-11-29 07:55:45

Linux GPIO Linux 系統

2017-11-16 14:46:58

Linuxplatform總線驅動設備

2022-05-10 08:49:46

設備驅動Linux

2009-02-09 10:06:03

并發控制Web應用悲觀鎖

2016-12-15 14:55:31

Linux定時延時

2009-12-23 13:17:36

Linux設備驅動

2011-01-10 18:21:38

linux編寫程序

2021-04-07 06:00:18

JavaScript 前端并發控制

2021-04-12 12:00:13

Linux運維Linux系統

2009-12-07 09:39:04

Linux設備驅動硬件通信

2010-05-10 15:53:24

Unix系統

2022-05-26 00:48:55

Linux內核硬件

2010-05-07 10:55:37

Windows 7驅動設備

2022-01-17 11:50:38

Linux CPULinux 系統

2017-08-21 10:56:55

MySQL并發控制
點贊
收藏

51CTO技術棧公眾號

国产99在线免费| 欧美日韩国产电影| 久久精品日产第一区二区三区| 97视频在线观看免费| 中文字幕日韩综合| 欧美人与性动交α欧美精品济南到| 99视频超级精品| 国产精品看片资源| 看片网站在线观看| 偷拍亚洲精品| 欧美精品 日韩| 免费 成 人 黄 色| 成人精品福利| 99精品视频在线观看免费| 国产日韩一区在线| 国产黄色片免费看| 欧美福利影院| 在线视频欧美日韩| 亚洲一区二区在线免费| 成人黄色理论片| 91福利在线免费观看| 久艹在线免费观看| 麻豆网站在线| 在线看日本不卡| 国产成人精品综合| 黄色在线观看免费| 日本午夜一区| 亚洲第一视频在线观看| 亚欧美在线观看| 日本在线啊啊| 亚洲精品第1页| 一区二区三区av在线| 香蕉久久国产av一区二区| 国产成人丝袜美腿| 91久久精品美女高潮| 波多野结衣在线观看一区| 亚洲精品麻豆| 欧美激情综合亚洲一二区| 久久久久久久久久97| 欧美色蜜桃97| 国产精品系列在线观看| 欧美日韩综合一区| 久久久久久久中文| 国内在线免费视频| 亚洲精品视频一区| 天天操天天干天天玩| 成人在线视频成人| 久久精品一区二区三区不卡牛牛| 国产一区二区三区免费不卡| 亚洲大尺度视频| 国产在线一区二区| 国产精品小说在线| 国产精品51麻豆cm传媒| 喷白浆一区二区| 国产精品18久久久久久麻辣| 97超碰国产精品女人人人爽| 久久久久久国产免费a片| 亚洲亚洲免费| 亚洲欧美国产日韩中文字幕| 日本丰满少妇裸体自慰| 欧美色资源站| 亚洲美女又黄又爽在线观看| 日韩乱码人妻无码中文字幕久久| 久久不见久久见中文字幕免费| 亚洲男人天堂网| 鲁丝一区二区三区| 日韩欧美午夜| 久久久精品一区二区| 农村妇女精品一区二区| 国产字幕视频一区二区| 韩国三级日本三级少妇99| 97久久久久久久| 天堂影院一区二区| 国产一区视频在线| 国产三区在线播放| 丰满白嫩尤物一区二区| 蜜桃91精品入口| 黄色一级免费大片| 97精品人妻一区二区三区香蕉| 麻豆视频观看网址久久| 91传媒视频在线观看| 免费国产黄色片| 久久九九久精品国产免费直播| 日韩国产一区久久| caopen在线视频| 午夜精品久久久久久久久久| 久久九九国产视频| 美女久久精品| 亚洲欧美在线一区二区| 91香蕉视频污在线观看| 1024成人| 国产精品一区二区三| www黄色在线观看| 久久久精品综合| 91社在线播放| 精品伊人久久久久7777人| 亚洲一级一级97网| 亚洲精品电影院| 国产精品国码视频| 日本国产高清不卡| 国产精品一二三四五区| 成人黄色a**站在线观看| 欧美午夜精品久久久久免费视 | 天天色综合成人网| 国产熟人av一二三区| 精品视频一二| 亚洲毛片在线观看| 麻豆视频在线观看| 免费一级片91| 久久精品国产美女| 黄色在线免费网站| a∨色狠狠一区二区三区| 欧美一级一区二区| 久久久久久国产免费a片| 中文字幕免费一区二区三区| 欧美一区二区影院| 国产欧美熟妇另类久久久| 久久婷婷一区二区三区| 国产一区二区三区在线免费| 在线看欧美视频| 亚洲精品福利在线观看| 99久久婷婷国产综合| 日韩一区欧美二区| 精品毛片久久久久久| 在线中文字幕-区二区三区四区| 色婷婷av一区二区三区软件 | av动漫在线免费观看| 欧美精品资源| 日韩精品欧美国产精品忘忧草| 欧美丰满熟妇bbbbbb| 美女精品自拍一二三四| 裸模一区二区三区免费| h片在线观看下载| 日韩一级二级三级精品视频| 亚洲人做受高潮| 蜜桃av一区二区在线观看| 欧美亚洲国产视频小说| www.超碰97| 欧美精品三区| 国产中文字幕亚洲| 在线观看麻豆蜜桃| 日韩欧美亚洲成人| 色噜噜在线观看| 亚洲精品系列| 国产精品美女黄网| 欧美人与禽性xxxxx杂性| 欧美精品在线观看一区二区| 久久亚洲无码视频| 久久午夜av| 欧洲在线视频一区| 亚洲成人看片| 国产一区二区三区视频在线观看 | 国产欧美精品在线播放| 成人在线免费视频| 欧美日韩国产精选| 欧美另类videoxo高潮| 狠狠色丁香婷综合久久| 日韩 欧美 自拍| 麻豆精品在线| 欧美麻豆久久久久久中文| www.五月婷| 亚洲国产sm捆绑调教视频| 性欧美18—19sex性高清| 狠狠噜噜久久| 蜜桃精品久久久久久久免费影院 | 国产乱码精品| 茄子视频成人在线观看| 成人免费在线观看视频| 久久视频免费在线播放| 亚洲黄色在线观看视频| 午夜精品久久久久| 亚洲精品视频大全| 日日骚欧美日韩| 中文字幕不卡每日更新1区2区| 国产精品一区免费在线 | 爱情岛论坛亚洲入口| 欧美日韩国产亚洲沙发| 欧美亚洲免费在线一区| 国产高潮流白浆| 99综合电影在线视频| 亚洲性生活网站| 久久精品青草| 好吊色欧美一区二区三区四区| 免费电影日韩网站| 久久久国产成人精品| 欧美熟女一区二区| 欧美午夜影院一区| 青草草在线视频| 久久久99精品免费观看| 男女视频在线观看网站| 国产亚洲一区在线| 青青草原国产免费| 欧美福利在线播放网址导航| 国产精品久久久久7777婷婷| 色呦呦在线视频| 国产一区二区三区高清在线观看| 亚洲av色香蕉一区二区三区| 色婷婷综合中文久久一本| 99久久婷婷国产综合| 91理论电影在线观看| 亚洲一级片av| 视频在线在亚洲| 男人添女人下部视频免费| 欧美三级伦理在线| 国产青春久久久国产毛片| 成人在线观看免费视频| 国产综合在线看| 久cao在线| 国产午夜精品一区二区三区| 免费观看毛片网站| 欧美一级免费观看| 亚洲av无码精品一区二区| 亚洲午夜一区二区三区| 99re6热在线精品视频| 99r国产精品| 极品人妻一区二区| 精品一区二区三区在线播放 | 欧美成年人视频网站欧美| 国产乱子伦精品无码码专区| 色综合天天天天做夜夜夜夜做| 丝袜美腿小色网| 国产女人aaa级久久久级| 7788色淫网站小说| 成人在线视频一区| 999热精品视频| 久久99久国产精品黄毛片色诱| 欧美日韩在线不卡视频| 亚洲免费激情| 久久人人爽人人爽人人av| 国产精品久久久久9999赢消| 日韩一本精品| 久久99影视| 久久亚洲综合网| 国内露脸中年夫妇交换精品| 99国精产品一二二线| 成人自拍视频| 91中文在线观看| www.成人| 成人在线国产精品| 久久精品超碰| 国产精品中文在线| 成人在线观看免费视频| 国产精品综合网站| 福利一区二区免费视频| 国产精品丝袜高跟| 黄色欧美视频| 国产欧美最新羞羞视频在线观看| 亚洲精品一区三区三区在线观看| 国产97色在线| 91福利精品在线观看| 国产乱人伦真实精品视频| 婷婷丁香久久| 亚洲a一级视频| 精品午夜视频| 成人xxxxx色| 精品午夜电影| 久久久人人爽| 精品国产不卡| 免费看啪啪网站| 亚洲精品二区三区| 丁香婷婷综合激情| 99精品福利视频| 成人精品视频一区二区| 美女在线观看视频一区二区| 91视频福利网| 99天天综合性| 秋霞网一区二区三区| 综合久久久久久| 久久久久久福利| 欧美日韩在线影院| 在线不卡免费视频| 日韩欧美一级二级三级久久久| 色婷婷综合视频| 亚洲无限av看| 尤物视频在线看| 69av成年福利视频| 国产精成人品2018| 亚洲自拍小视频免费观看| 黄色美女久久久| 日韩欧美一区二区三区四区五区 | 久久久久久久久久久久电影| 成人在线免费观看一区| 狠狠色丁香婷婷综合影院| 日本小视频在线免费观看| 亚洲成av人影院在线观看| 午夜18视频在线观看| 国产亚洲欧美aaaa| 超鹏97在线| 1769国内精品视频在线播放| 美女久久久久久| 17videosex性欧美| 久久资源免费视频| 草草视频在线| 国产精品精品视频一区二区三区| 97久久精品一区二区三区的观看方式 | 色综合咪咪久久| 97精品久久人人爽人人爽| 亚洲国产精品久久91精品| 77导航福利在线| 久久久久久尹人网香蕉| 秋霞国产精品| 国产一区二区三区黄| 久久久久国产精品| 国产免费一区二区三区视频| 国产在线一区观看| 日韩免费av一区二区| 91精品xxx在线观看| 亚洲www视频| 四虎884aa成人精品最新| 一区二区在线中文字幕电影视频 | 久久午夜老司机| 朝桐光av在线| 在线视频欧美精品| 污视频网站在线播放| 欧美成人一区在线| 97精品国产99久久久久久免费| 国产美女精品在线观看| 久久久久久美女精品| 热久久精品国产| 93久久精品日日躁夜夜躁欧美 | 久久伊伊香蕉| 欧美精品成人在线| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 日韩av影视| av不卡在线看| 性猛交╳xxx乱大交| 亚洲少妇30p| 国产又黄又粗又长| 中文字幕综合在线| 偷拍中文亚洲欧美动漫| 精品国产免费一区二区三区| 欧美日韩亚洲一区| 亚洲一区二区三区四区精品 | 九九视频免费看| 91精品国产91综合久久蜜臀| 日本福利专区在线观看| 国产精品青草久久久久福利99| 精品中文字幕一区二区三区av| heyzo亚洲| 波多野结衣中文字幕一区| 精品在线视频免费观看| 日韩视频免费直播| 97超碰资源站在线观看| 亚洲综合中文字幕在线| 午夜视频精品| 亚洲精品一二三四| 亚洲一区二区四区蜜桃| 成人午夜免费在线观看| 久久久免费电影| 国产一区二区在线视频你懂的| www.日本少妇| 91视频免费播放| caoporn国产| 中日韩午夜理伦电影免费| 久久91超碰青草在哪里看| 中文字幕中文字幕在线中一区高清| 久久se精品一区二区| 男人av资源站| 日韩三级av在线播放| 国产www视频在线观看| 久久99精品久久久久久青青日本 | 久久人人爽人人人人片| 欧美午夜宅男影院在线观看| 欧美老女人性开放| 国产精品毛片a∨一区二区三区|国| 日韩系列欧美系列| 日韩视频在线观看一区二区三区| 亚洲一线二线三线视频| 青青国产在线| 国产精品女主播视频| 影音先锋日韩精品| 亚洲一区二区在线免费| 在线视频国内一区二区| 激情视频在线观看| 国产免费一区二区| 日韩精品一二三四| 农村妇女精品一区二区| 日韩激情片免费| 欧洲亚洲精品久久久久| 久艹在线免费观看| 国产女人aaa级久久久级| www.国产免费| 欧美自拍视频在线| 亚洲经典一区| 日韩 中文字幕| 911精品国产一区二区在线| 女海盗2成人h版中文字幕| 一区二区三区偷拍| 99视频在线精品| 国产精品无码久久久久成人app| 久久久久久有精品国产| 欧洲杯半决赛直播| 美女网站视频在线观看| 欧美日韩中字一区| 国产v日韩v欧美v| 一区视频二区视频| 99国产精品久久久久久久久久久| 91丨九色丨丰满| 欧美亚洲一级片| 欧美va天堂在线|