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

扒開 Linux 中斷的底褲之 workqueue

系統 Linux
workqueue 是除了 softirq 和 tasklet 以外最常用的下半部機制之一。workqueue 的本質是把 work 交給一個內核線程,在進程上下文調度的時候執行。

[[416567]]

 workqueue 是除了 softirq 和 tasklet 以外最常用的下半部機制之一。workqueue 的本質是把 work 交給一個內核線程,在進程上下文調度的時候執行。因為這個特點,所以 workqueue 允許重新調度和睡眠,這種異步執行的進程上下文,能解決因為 softirq 和 tasklet 執行時間長而導致的系統實時性下降等問題。

當驅動程序在進程上下文中有異步執行的工作任務時,可以用 work 來描述工作任務。把 work 添加到一個鏈表 worklist 中,然后由一個內核線程 worker 遍歷鏈表,串行地執行掛入 worklist 中的所有 work。如果 worklist 中沒有 work,那么內核線程 worker 就會變成 IDLE 狀態;如果有 work,則執行 work 中的回調函數。

workqueue 相關的數據結構

關于 workqueue 中幾個概念都是 work 相關的數據結構非常容易混淆,大概可以這樣來理解:

work_struct :

工作。初始化一個 work 并添加到工作隊列后,將會將其傳遞到合適的內核線程來進行處理,它是用于調度的最小單位。 

  1. struct work_struct {  
  2.  atomic_long_t data;     
  3.  struct list_head entry;   
  4.  work_func_t func;       
  5.  #ifdef CONFIG_LOCKDEP  
  6.  struct lockdep_map lockdep_map;  
  7. #endif  
  8. }; 
  •   data:低比特存放狀態位,高比特存放 worker_pool 的ID或者 pool_workqueue 的指針
  •  entry:用于添加到其他隊列上
  •  func:工作任務的處理函數,在內核線程中回調

workqueue_struct :

工作的集合。workqueue 和 work 是一對多的關系。內核中工作隊列分為兩種:

  1.  bound:綁定處理器的工作隊列,每個 worker 創建的內核線程綁定到特定的 CPU 上運行。
  2.  unbound:不綁定處理器的工作隊列,創建的時候需要指定 WQ_UNBOUND 標志,內核線程可以在處理器間遷移。 
  1. struct workqueue_struct {  
  2.  struct list_head pwqs;  /* WR: all pwqs of this wq */    
  3.  struct list_head list;  /* PR: list of all workqueues */    
  4.  struct list_head maydays; /* MD: pwqs requesting rescue */     
  5.  struct worker  *rescuer; /* I: rescue worker */    
  6.  struct pool_workqueue *dfl_pwq; /* PW: only for unbound wqs */  
  7.  char   name[WQ_NAME_LEN]; /* I: workqueue name */  
  8.  /* hot fields used during command issue, aligned to cacheline */  
  9.  unsigned int  flags ____cacheline_aligned; /* WQ: WQ_* flags */  
  10.  struct pool_workqueue __percpu *cpu_pwqs; /* I: per-cpu pwqs */      
  11.  struct pool_workqueue __rcu *numa_pwq_tbl[]; /* PWR: unbound pwqs indexed by node */    //Per-Node創建pool_workqueue  
  12.     ...  
  13. }; 
  •  pwqs:所有的 pool_workqueue 都添加到本鏈表中
  •  list:用于將工作隊列添加到全局鏈表 workqueues 中
  •  maydays:rescue狀態下的 pool_workqueue 添加到本鏈表中
  •  rescuer:rescuer 內核線程,用于處理內存緊張時創建工作線程失敗的情況
  •  cpu_pwqs:Per-CPU 創建 pool_workqueue
  •  numa_pwq_tbl[]:Per-Node 創建 pool_workqueue

pool_workqueue:

中間人 / 中介,負責建立起 workqueue 和 worker_pool 之間的關系。workqueue 和 pool_workqueue 是一對多的關系。 

  1. struct pool_workqueue {  
  2.  struct worker_pool *pool;  /* I: the associated pool */      
  3.  struct workqueue_struct *wq;  /* I: the owning workqueue */     
  4.  int   nr_active; /* L: nr of active works */      
  5.  int   max_active; /* L: max active works */     
  6.  struct list_head delayed_works; /* L: delayed works */     
  7.  struct list_head pwqs_node; /* WR: node on wq->pwqs */     
  8.  struct list_head mayday_node; /* MD: node on wq->maydays */   //用于添加到workqueue鏈表中 
  9.     ...  
  10. } __aligned(1 << WORK_STRUCT_FLAG_BITS); 
  •  pool:指向 worker_pool
  •  wq:指向所屬的 workqueue
  •  nr_active:活躍的 work 數量
  •  max_active:活躍的最大 work 數量
  • delayed_works:延遲執行的 work 掛入本鏈表
  •  pwqs_node:用于添加到 workqueue 鏈表中
  •  mayday_node:用于添加到 workqueue 鏈表中

worker_pool:

工人的集合。pool_workqueue 和 worker_pool 是一對一的關系,worker_pool 和 worker 是一對多的關系。

  1.   bound 類型的工作隊列:worker_pool 是 Per-CPU 創建,每個 CPU 都有兩個 worker_pool,對應不同的優先級,nice 值分別為 0 和 -20。
  2.   unbound 類型的工作隊列:worker_pool 創建后會添加到 unbound_pool_hash 哈希表中。 
  1. struct worker_pool {  
  2.  spinlock_t  lock;  /* the pool lock */  
  3.  int   cpu;  /* I: the associated cpu */    
  4.  int   node;  /* I: the associated node ID */   
  5.  int   id;  /* I: pool ID */  
  6.  unsigned int  flags;  /* X: flags */  
  7.  unsigned long  watchdog_ts; /* L: watchdog timestamp */  
  8.  struct list_head worklist; /* L: list of pending works */    
  9.  int   nr_workers; /* L: total number of workers */     
  10.  /* nr_idle includes the ones off idle_list for rebinding */  
  11.  int   nr_idle; /* L: currently idle ones */  
  12.  struct list_head idle_list; /* X: list of idle workers */    
  13.  struct timer_list idle_timer; /* L: worker idle timeout */  
  14.  struct timer_list mayday_timer; /* L: SOS timer for workers */  
  15.  /* a workers is either on busy_hash or idle_list, or the manager */  
  16.  DECLARE_HASHTABLE(busy_hash, BUSY_WORKER_HASH_ORDER);   /* L: hash of busy workers */  
  17.  /* see manage_workers() for details on the two manager mutexes */  
  18.  struct worker  *manager; /* L: purely informational */  
  19.  struct mutex  attach_mutex; /* attach/detach exclusion */  
  20.  struct list_head workers; /* A: attached workers */     
  21.  struct completion *detach_completion; /* all workers detached */  
  22.  struct ida  worker_ida; /* worker IDs for task name */  
  23.  struct workqueue_attrs *attrs;  /* I: worker attributes */  
  24.  struct hlist_node hash_node; /* PL: unbound_pool_hash node */     
  25.     ...  
  26. } ____cacheline_aligned_in_smp; 
  •  cpu:綁定到 CPU 的 workqueue,代表 CPU ID
  •  node:非綁定類型的 workqueue,代表內存 Node ID
  •  worklist:pending 狀態的 work 添加到本鏈表
  •  nr_workers:worker 的數量
  •  idle_list:處于 IDLE 狀態的 worker 添加到本鏈表
  •  busy_hash:工作狀態的 worker 添加到本哈希表中
  •  workers:worker_pool 管理的 worker 添加到本鏈表中
  •  hash_node:用于添加到 unbound_pool_hash 中

worker :

工人。在代碼中 worker 對應一個 work_thread() 內核線程。 

  1. struct worker {  
  2.  /* on idle list while idle, on busy hash table while busy */  
  3.  union {  
  4.   struct list_head entry; /* L: while idle */     
  5.    struct hlist_node hentry; /* L: while busy */  
  6.  };  
  7.  struct work_struct *current_work; /* L: work being processed */    
  8.  work_func_t  current_func; /* L: current_work's fn */                
  9.   struct pool_workqueue *current_pwq; /* L: current_work's pwq */    
  10.  struct list_head scheduled; /* L: scheduled works */     
  11.   /* 64 bytes boundary on 64bit, 32 on 32bit */  
  12.  struct task_struct *task;  /* I: worker task */     
  13.  struct worker_pool *pool;  /* I: the associated pool */     
  14.       /* L: for rescuers */  
  15.  struct list_head node;  /* A: anchored at pool->workers */  //添加到worker_pool->workers鏈表中  
  16.       /* A: runs through worker->node */  
  17.     ...  
  18. }; 
  •  entry:用于添加到 worker_pool 的空閑鏈表中
  •  hentry:用于添加到 worker_pool 的忙碌列表中
  •  current_work:當前正在處理的 work
  •  current_func:當前正在執行的 work 回調函數
  •  current_pwq:指向當前 work 所屬的 pool_workqueue
  •  scheduled:所有被調度執行的 work 都將添加到該鏈表中
  •  task:指向內核線程
  •  pool:該 worker 所屬的 worker_pool
  •  node:添加到 worker_pool->workers 鏈表中

可以用下圖來總結:

workqueue 的初始化

內核在啟動的時候會對 workqueue 做初始化,workqueue 的初始化包含兩個階段,分別是 workqueue_init_early 和 workqueue_init。

workqueue_init_early

  •  分配 worker_pool,并且對該結構中的字段進行初始化操作
  • 分配 workqueue_struct,并且對該結構中的字段進行初始化操作
  •  alloc_and_link_pwqs:分配 pool_workqueue,將 workqueue_struct 和 worker_pool 關聯起來

workqueue_init

這里主要完成的工作是給之前創建好的 worker_pool,添加一個初始的 worker,然后利用函數 create_worker,創建名字為 kworker/XX:YY 或者 kworker/uXX:YY 的內核線程。其中 XX 表示 worker_pool 的編號,YY 表示 worker 的編號,u 表示unbound。

  •  分配 worker,并且對該結構中的字段進行初始化操作
  •  為 worker 創建內核線程 worker_thread
  •  將 worker 添加到 worker_pool 中
  •  worker 進入 IDLE 狀態

經過上面兩個階段的初始化,workqueue 子系統基本就已經將數據結構的關聯建立好了,當有 work 來進行調度的時候,就可以進行處理了。

使用 workqueue

內核推薦驅動開發者使用默認的 workqueue,而不是新建 workqueue。要使用系統默認的 workqueue,首先需要初始化 work,內核提供了相應的宏 INIT_WORK。

初始化 work 

  1. #define INIT_WORK(_work, _func)      \  
  2.  __INIT_WORK((_work), (_func), 0)   
  3.  #define __INIT_WORK(_work, _func, _onstack)    \  
  4.  do {        \  
  5.   __init_work((_work), _onstack);    \  
  6.   (_work)->data = (atomic_long_t) WORK_DATA_INIT(); \  
  7.   INIT_LIST_HEAD(&(_work)->entry);   \  
  8.   (_work)->func = (_func);    \  
  9.  } while (0) 

初始化 work 后,就可以調用 shedule_work 函數把 work 掛入系統默認的 workqueue 中。

work 調度

  •  將 work 添加到系統的 system_wq 工作隊列中。
  •  判斷 workqueue 的類型,如果是 bound 類型,根據 CPU 來獲取 pool_workqueue。如果是 unbound 類型,通過 node 號來獲取 pool_workqueue。
  •  判斷 pool_workqueue 活躍的 work 數量,少于最大限值則將 work 加入到 pool->worklist 中,否則加入到 pwq->delayed_works 鏈表中。
  •  如果 __need_more_worker 判斷沒有 worker 在執行,則通過 wake_up_worker 喚醒 worker 內核線程。

worker_thread

worker 內核線程的執行函數是 worker_thread。

  •  設置標志位 PF_WQ_WORKER,調度器在進行調度處理時會對 task 進行判斷,針對 workerqueue worker 有特殊的處理。
  •  worker 被喚醒的時候,跳轉到 woke_up 執行。
  •  woke_up 中,如果此時 worker 是需要銷毀的,那就進行清理工作并返回。否則,離開 IDLE 狀態,并進入 recheck 模塊執行。
  •  recheck 中,判斷是否需要更多的 worker 來處理,如果沒有任務處理,跳轉到 sleep 地方進行睡眠。如果有任務需要處理時,遍歷工作鏈表,對鏈表中的每個節點調用 process_one_work 來執行 work 的回調函數,即 INIT_WORK 里的回調函數。

  •  sleep 中,沒有任務處理時,worker 進入空閑狀態,并將當前的內核線程設置成睡眠狀態,讓出 CPU。

總結

 

 

責任編輯:龐桂玉 來源: Linux學習
相關推薦

2021-12-27 07:55:59

Linux 中斷處理Linux 系統

2021-03-28 20:44:34

Kafka中間件MQ

2020-12-29 08:02:37

SqlSession 程序Executor

2022-01-12 12:35:36

Linuxworkqueue工作隊列

2025-09-16 00:31:23

2025-09-10 04:00:00

2021-12-10 08:45:45

Linux GIC Linux 系統

2021-08-10 11:30:30

Linux代碼中斷控制器

2021-08-03 15:10:26

Linux代碼驅動

2015-11-02 16:42:26

2021-12-14 08:51:23

Linux 中斷子系統Linux 系統

2025-04-28 01:22:45

2021-11-30 07:02:10

虛擬化Linux 中斷

2021-12-01 07:02:16

虛擬化LinuxCPU

2020-12-29 09:11:33

LinuxLinux內核

2021-12-08 08:41:31

Linux 中斷子系統Linux 系統

2017-07-14 14:35:27

Linux中斷系統

2021-05-25 07:59:59

Linux運維Linux系統

2025-10-23 16:38:30

2021-09-03 09:12:09

Linux中斷軟件
點贊
收藏

51CTO技術棧公眾號

欧美美女黄视频| 国产精品麻豆视频| 欧美在线观看网站| 高清国产在线观看| 国精一区二区三区| 久久美女高清视频| 91日本在线视频| 91看片在线播放| 综合中文字幕| 欧洲一区二区三区免费视频| 黄色网zhan| 撸视在线观看免费视频| 国产中文字幕一区| 欧美一级在线播放| 青娱乐在线视频免费观看| 国产成人精品一区二区免费看京 | 国产精品一区二区三区精品| 五月天婷婷色综合| 亚州综合一区| 欧美视频精品一区| 欧美日韩综合另类| 亚洲国产福利视频| 麻豆精品国产传媒mv男同| 性欧美激情精品| 男人av资源站| 色综合综合网| 日韩精品视频在线观看免费| 拔插拔插华人永久免费| 玛雅亚洲电影| 国产精品色哟哟| 蜜桃999成人看片在线观看| aaa国产视频| 免费观看在线综合| 清纯唯美亚洲综合| 在线观看亚洲欧美| 精品一区二区三区在线| 亚洲第一免费网站| 手机看片国产精品| 91精品一久久香蕉国产线看观看 | 国产成人av影院| 国产精品激情av电影在线观看| 亚洲一区二区三区蜜桃| 欧美成人毛片| 亚洲自拍偷拍九九九| 亚洲欧洲一区二区在线观看| 欧美69xxxxx| 91免费国产在线| 国产在线精品成人一区二区三区| 国产一区二区播放| 欧美a一欧美| 在线视频国内自拍亚洲视频| 少妇高潮流白浆| 日本中文字幕在线视频| 国产欧美日韩三级| 日本一区二区三区四区在线观看| 国产口爆吞精一区二区| 99精品免费视频| 亚洲 日韩 国产第一| 久久精品视频久久| 亚洲伦理一区| 琪琪第一精品导航| 欧美精品一区二区蜜桃| 精品无人区麻豆乱码久久久| 国产一区二区久久精品| 精品国产aaa| 欧美超碰在线| 久久成人精品电影| 国产精品密蕾丝袜| 欧美日韩一二| 久久视频这里只有精品| 久操视频免费在线观看| 亚洲国产电影| 欧美中文字幕视频| 欧产日产国产69| 日韩电影网1区2区| 欧美一区第一页| 国产在线观看第一页| 免费不卡在线视频| 91手机在线观看| 老熟妇高潮一区二区高清视频| 日韩av电影天堂| 97视频色精品| 国产婷婷色一区二区在线观看| 亚欧美无遮挡hd高清在线视频| 亚洲精品天天看| 九九热久久免费视频| 少妇精品久久久一区二区三区| 日韩免费观看高清完整版| 艳妇乳肉豪妇荡乳xxx| 欧美精品密入口播放| 在线播放亚洲激情| 麻豆成人在线视频| 久久久久久色| www.av一区视频| 国产一区二区影视| 亚洲丝袜自拍清纯另类| 亚洲欧美日韩另类精品一区二区三区 | 亚洲国产午夜| 国产精品扒开腿做爽爽爽的视频| 成人在线免费看视频| 亚洲午夜91| 国产精品第1页| 超碰在线观看av| 欧美国产日本视频| 日韩 欧美 视频| 成人影音在线| 欧美日韩一级大片网址| 激情av中文字幕| 国产精品zjzjzj在线观看| 国产亚洲欧美另类中文| 免费看一级一片| 激情欧美日韩一区| 国产精品视频在线播放| 婷婷丁香一区二区三区| 亚洲欧美一区二区久久| 欧美日韩一区二区在线免费观看| 日韩性xxx| 欧美草草影院在线视频| 性农村xxxxx小树林| 日韩理论电影院| 日本久久久久久久久久久| 国产又黄又猛又粗又爽| 日本视频一区二区| 久久66热这里只有精品| 精品推荐蜜桃传媒| 亚洲第一主播视频| 亚洲精品乱码久久久久久自慰| 肉色欧美久久久久久久免费看| 欧美亚洲综合色| 少妇精品一区二区三区| 亚洲激情一区| 高清国产一区| 青春草视频在线观看| 欧美精品久久久久久久久老牛影院| 日本亚洲一区二区三区| 色婷婷色综合| 国产69精品99久久久久久宅男| www日韩精品| 成人视屏免费看| 欧美大黑帍在线播放| 成人美女大片| 精品亚洲一区二区三区在线播放 | 亚洲色图.com| 中文字幕精品一区二区三区在线| 97久久亚洲| 欧美成人合集magnet| 136福利视频导航| www.亚洲免费av| 国产高清www| 久久精品福利| 久久精品在线播放| 91成人在线免费| 国产精品乱人伦一区二区| 我要看一级黄色大片| 欧美一区二区三区高清视频| 国产精品久久视频| 人妻精品一区一区三区蜜桃91| 国产校园另类小说区| 99热成人精品热久久66| 精品中文一区| 国产精品日韩精品| 亚洲欧美一区二区三| 一区免费观看视频| 天天做天天干天天操| 欧美日韩ab| 狠狠久久综合婷婷不卡| 亚洲一区站长工具| 色老头一区二区三区在线观看| 久久不卡免费视频| 久久久青草青青国产亚洲免观| 欧美一级特黄aaaaaa在线看片| 亚洲天堂一区二区| 日韩视频中文字幕| 亚洲黄色a级片| 色天天综合久久久久综合片| 网爆门在线观看| 国产激情一区二区三区| 精品久久一二三| 精品久久久久久久久久久aⅴ| 久久久久女教师免费一区| 亚洲自拍偷拍另类| 夜夜揉揉日日人人青青一国产精品| 欧美男女交配视频| 精品国产午夜| 日韩av日韩在线观看| 求av网址在线观看| 欧美日韩美女一区二区| 青娱乐国产在线| 久久精品亚洲一区二区三区浴池| 成人在线免费观看av| 欧美精品久久久久久| 成人在线视频网址| 成人在线黄色| 欧美精品videossex88| 国产xxxx孕妇| 色视频欧美一区二区三区| 亚洲人与黑人屁股眼交| 美女一区二区三区| 正在播放一区二区三区| 久久a爱视频| 成人午夜在线影院| 亚洲成人看片| 久久免费在线观看| 精品国产99久久久久久| 亚洲视频电影图片偷拍一区| 午夜美女福利视频| 欧美日韩二区三区| 无码人妻精品一区二区蜜桃色欲| 久久久777精品电影网影网| 91视频福利网| 影音先锋久久精品| 在线视频不卡国产| 国产精品欧美日韩一区| 国产区一区二区三区| 日韩黄色三级| 色综合久久88| 日本综合在线| 精品久久一二三区| 国产精品玖玖玖| 欧美在线观看你懂的| 亚洲综合一二三| 亚洲欧美激情插 | 91丨九色丨黑人外教| 久久精品久久99| 久久精品99国产精品日本| 大桥未久一区二区| 日韩欧美视频| 视频一区在线播放| 玖玖视频精品| 日本一区免费观看| 欧美绝顶高潮抽搐喷水合集| 亚洲一区二区三区视频播放| 亚洲成av在线| 中文字幕在线观看日韩| 欧美xxx.com| 欧美精品欧美精品系列| 青娱乐在线免费视频| 日韩欧美国产骚| 日韩欧美激情视频| 五月天视频一区| 日本熟妇成熟毛茸茸| 国产三级精品三级在线专区| 亚洲av网址在线| 97se亚洲国产综合自在线观| 无码av免费精品一区二区三区| 老牛影视一区二区三区| 久久精品免费一区二区| 99久久.com| 亚洲欧洲三级| 亚洲一区欧美| www.在线观看av| 亚洲网址在线| 国产极品尤物在线| 亚洲一区图片| 女人另类性混交zo| 午夜日韩视频| 国产va亚洲va在线va| 亚洲精品美女91| 国产91对白刺激露脸在线观看| 天天射—综合中文网| 在线无限看免费粉色视频| 91超碰成人| 日韩五码在线观看| 老鸭窝毛片一区二区三区| 国产一级不卡毛片| 久久精品72免费观看| 天天操精品视频| 三级亚洲高清视频| 国产色视频在线播放| 国产乱子伦视频一区二区三区 | 亚洲国产日韩一级| 欧美成人精品欧美一级乱黄| 色天天综合久久久久综合片| 国产精品自拍视频一区| 色欲综合视频天天天| 亚洲天堂网在线观看视频| 日韩片之四级片| 色综合888| 日韩一区视频在线| 成人免费在线电影| 欧美大尺度在线观看| 美女av在线免费看| 性欧美xxxx| 精品成人av| 114国产精品久久免费观看| 欧美高清视频看片在线观看 | 免费在线精品视频| 韩日成人av| 日韩av手机版| 国产不卡在线一区| 欧美 日韩 成人| 有码一区二区三区| 亚洲黄网在线观看| 日韩一区二区三区电影在线观看 | 久久久综合久久久| 91黄色激情网站| 亚洲黄色a级片| 中文日韩电影网站| 99re6在线精品视频免费播放| 欧美精品videosex牲欧美| 久久av色综合| 国模私拍视频一区| 色综合视频一区二区三区日韩 | 盗摄牛牛av影视一区二区| 欧美日韩精品免费在线观看视频| 思热99re视热频这里只精品| 91在线看www| 国产精品一区二区av交换| 天天想你在线观看完整版电影免费| 欧美成人日本| 国产精品入口免费软件| av中文字幕不卡| 欧美成人片在线观看| 在线观看www91| 色网站在线免费观看| 欧美激情亚洲国产| 只有精品亚洲| 亚洲精品久久久久久一区二区| 日韩精品dvd| 国产成人黄色片| 成人av在线资源| 麻豆一区产品精品蜜桃的特点 | 极品美女扒开粉嫩小泬| 国产美女一区二区| 999久久久国产| 欧美亚州韩日在线看免费版国语版| 91tv国产成人福利| 在线国产精品播放| 免费观看亚洲| 成人激情视频网| 日韩免费高清| 一区二区成人网| 国产农村妇女毛片精品久久麻豆| 国产极品美女在线| 欧美精品免费视频| 欧美69xxx| 亚洲va欧美va国产综合久久| 日韩一区电影| 欧美精品卡一卡二| 蜜桃91丨九色丨蝌蚪91桃色| 中文字幕乱妇无码av在线| av一区二区三区在线| 久久久久久久久精| 日韩午夜在线影院| 高清av在线| 久久久久久网站| 国产厕拍一区| 久久久国产精华液999999| 秋霞电影网一区二区| 日韩一级片在线免费观看| 在线免费不卡电影| 中文字幕在线免费| 91精品国产综合久久男男| 精品国产一区二区三区不卡蜜臂 | 激情欧美日韩| 一级黄色录像在线观看| 国产精品福利一区二区| 国产又粗又黄又爽| 九色91av视频| 欧美美女啪啪| 91热这里只有精品| 国产精品久久久久桃色tv| 国产片高清在线观看| 色综合久久久888| 牛牛影视久久网| 国产视频一区二区三区在线播放| 丰满亚洲少妇av| 日本五十熟hd丰满| 欧美一级午夜免费电影| 丁香花视频在线观看| 精品乱色一区二区中文字幕| 欧美成人一品| 污片免费在线观看| 在线中文字幕不卡| 精品美女在线观看视频在线观看| 日产精品久久久一区二区福利| 国产区精品视频在线观看豆花| 中文字幕中文字幕99| 高清av一区二区| 久久久久久久久毛片| 欧美乱熟臀69xxxxxx| 久久香蕉av| 日韩性感在线| 国产91在线|亚洲| 天天爱天天做天天爽| 亚洲女人天堂色在线7777| 四虎国产精品免费久久5151| 亚洲精品成人a8198a| 石原莉奈在线亚洲二区| 中文字幕免费视频| 色悠悠亚洲一区二区| 黄网页免费在线观看| 精品一区二区视频| 国产一区二区三区免费在线观看| www.毛片com| 国产网站欧美日韩免费精品在线观看| 91豆花视频在线播放| 亚洲一卡二卡三卡| 狠狠色丁香久久婷婷综合丁香| 黄色一级片一级片|