国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一個令人驚嘆的Linux內(nèi)核補(bǔ)丁

系統(tǒng) Linux
我們都知道linux內(nèi)核中的代碼非常精妙,但是有些代碼由于歷史原因,一個函數(shù)為了兼容處理各種情況,到最后可能變得非常糟糕,到處都是goto 和if,看的想跳樓(宋老師口頭禪^_^)

[[351277]]

本文轉(zhuǎn)載自微信公眾號「相遇Linux」,作者JeffXie。轉(zhuǎn)載本文請聯(lián)系相遇Linux公眾號。   

 我們都知道linux內(nèi)核中的代碼非常精妙,但是有些代碼由于歷史原因,一個函數(shù)為了兼容處理各種情況,到最后可能變得非常糟糕,到處都是goto 和if,看的想跳樓(宋老師口頭禪^_^)

如果在系統(tǒng)中讀一個文件時會調(diào)用

generic_file_buffered_read

這個函數(shù)的功能是把磁盤中的數(shù)據(jù)讀到page之后,或者直接獲取cache中的page,然后調(diào)用copy_page_to_iter把page拷貝到用戶層的buffer中。

一天寂靜的下午,得空,打開電腦,準(zhǔn)備仔細(xì)研究一下這個函數(shù),發(fā)現(xiàn)這個函數(shù)的注釋上面就寫明了:

  1. * This is really ugly. But the goto's actually try to clarify some 
  2. of the logic when it comes to error handling etc. 

仔細(xì)看了一下代碼,果然ugly的不像話,到處都是跳轉(zhuǎn)和判斷,令人眩暈,而且整個函數(shù)達(dá)到300行左右(原諒我看了注釋才斗膽這樣講:-) ),發(fā)現(xiàn)要是把這個函數(shù)看下去,今天一整天的心情都不會好了(當(dāng)時看的是Linux5.10的代碼)

  1. ssize_t generic_file_buffered_read(struct kiocb *iocb, 
  2.                 struct iov_iter *iter, ssize_t written) 
  3.  
  4. find_page: 
  5.                 if (fatal_signal_pending(current)) { 
  6.                         error = -EINTR; 
  7.                         goto out
  8.                 } 
  9.                         error = wait_on_page_locked_killable(page); 
  10.                         if (unlikely(error)) 
  11.                                 goto readpage_error; 
  12.                         if (PageUptodate(page)) 
  13.                                 goto page_ok; 
  14.  
  15.                         if (inode->i_blkbits == PAGE_SHIFT || 
  16.                                         !mapping->a_ops->is_partially_uptodate) 
  17.                                 goto page_not_up_to_date; 
  18.                         /* pipes can't handle partially uptodate pages */ 
  19.                         if (unlikely(iov_iter_is_pipe(iter))) 
  20.                                 goto page_not_up_to_date; 
  21.                         if (!trylock_page(page)) 
  22.                                 goto page_not_up_to_date; 
  23.                         /* Did it get truncated before we got the lock? */ 
  24.                         if (!page->mapping) 
  25.                                 goto page_not_up_to_date_locked; 
  26.                         if (!mapping->a_ops->is_partially_uptodate(page, 
  27.                                                         offset, iter->count)) 
  28.                                 goto page_not_up_to_date_locked; 
  29.                         unlock_page(page); 
  30.                 } 

于是就想內(nèi)核社區(qū)這么多牛人,他們整天盯著這些代碼,肯定很多人早已經(jīng)注意到了,于是想去看看有沒有人提交patch重構(gòu)這個函數(shù):

  1. ./scripts/get_maintainer.pl   mm/filemap.c 
  2. linux-kernel@vger.kernel.org (open list) 

然后我就在下面網(wǎng)址中搜索generic_file_buffered_read,果然在10月25號(我看代碼那天在11月1號前后),就有人發(fā)了相關(guān)patch:

  1. https://lore.kernel.org/lkml/ 

然后迫不及待查看patch,并把整個patch 下載下來:

這里推薦一個工具,使用b4工具

  1. https://git.kernel.org/pub/scm/utils/b4/b4.git 

可以直接從

  1. https://lore.kernel.org 

獲取原始格式的patch,便于自己git am之后測試。

  1. # b4 am https://lore.kernel.org/lkml/20201025212949.602194-1-kent.overstreet@gmail.com 
  2. v2_20201025_kent_overstreet_generic_file_buffered_read_improvements.cover 
  3. v2_20201025_kent_overstreet_generic_file_buffered_read_improvements.mbx 

然后直接 git am ,非常方便,這樣就打上了lore.kernel.org上提交的patch.

  1. git am v2_20201025_kent_overstreet_generic_file_buffered_read_improvements.mbx 
  2. 提示:在git am之前,可以提前git apply --check 一下 
  1. # gitlogdate -3 
  2. fc5608fc9917    2020-10-25      Kent Overstreet fs: generic_file_buffered_read() now uses find_get_pages_contig 
  3. 3bcadc3306be    2020-10-25      Kent Overstreet fs: Break generic_file_buffered_read up into multiple functions 
  4. 3650b228f83a    2020-10-25      Linus Torvalds  Linux 5.10-rc1 
  5.  
  6. alias gitlogdate='git log --pretty=format:"%h%x09%ad%x09%an%x09%s" --date=short' 

打了這個patch之后,generic_file_buffered_read變成了這個樣子:

  1. ssize_t generic_file_buffered_read(struct kiocb *iocb, 
  2.                 struct iov_iter *iter, ssize_t written) 
  3. .. 
  4. pg_nr = generic_file_buffered_read_get_pages(iocb, iter, 
  5.                                  pages, nr_pages); 
  6.                                   
  7. ... 
  8. for (i = 0; i < pg_nr; i++) { 
  9.    copied = copy_page_to_iter(pages[i], offset, bytes, iter); 
  10.    } 

而且

  1. generic_file_buffered_read_get_pages 

也非常之清晰:

  1. static int generic_file_buffered_read_get_pages(struct kiocb *iocb, 
  2.                                                 struct iov_iter *iter, 
  3.                                                 struct page **pages, 
  4.                                                 unsigned int nr) 
  5.         nr_got = find_get_pages_contig(mapping, index, nr, pages); 
  6.         if (nr_got) 
  7.                 goto got_pages; 
  8.  
  9.         if (iocb->ki_flags & IOCB_NOIO) 
  10.                 return -EAGAIN; 
  11.  
  12.         page_cache_sync_readahead(mapping, ra, filp, index, last_index - index); 
  13.  
  14.         nr_got = find_get_pages_contig(mapping, index, nr, pages); 
  15.         if (nr_got) 
  16.                 goto got_pages; 
  17. ... 

看完generic_file_buffered_read()之后,整個下午的心情都好多了。

 

責(zé)任編輯:武曉燕 來源: 相遇Linux
相關(guān)推薦

2023-12-10 14:19:31

JupyterPython編碼

2011-03-18 09:56:19

JavaScript

2020-12-22 15:47:02

Python開發(fā)工具

2012-03-01 11:32:18

硅谷女性

2022-03-23 15:11:04

Arch LinuxLinuxCutefish 桌

2011-04-07 11:33:00

HTML 5JavaScript

2021-11-29 07:02:24

Python函數(shù)操作

2025-02-17 11:10:49

2020-02-19 14:47:25

人工智能技術(shù)無人駕駛

2024-07-31 08:38:36

2012-11-15 09:59:35

HTML5WebHTML5特效

2024-05-16 11:09:40

Python字符串代碼

2024-08-05 08:38:13

2024-02-04 18:20:53

AI模型代碼

2022-01-26 13:00:07

Vue.js UI組件Web

2018-06-19 07:49:49

物聯(lián)網(wǎng)足球科技世界杯

2023-11-18 09:07:59

Go語言技巧

2024-05-31 11:32:32

2020-08-18 17:21:01

開發(fā)工具前端開發(fā)

2023-07-06 10:31:24

CSS網(wǎng)格生成器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

免费亚色电影在线观看| 免费精品视频最新在线| 中文av在线全新| 亚洲视频播放| 日韩精品一区二区三区四区| 桥本有菜av在线| 欧美黑人巨大xxxxx| 久久精品av麻豆的观看方式| 樱桃国产成人精品视频| 精品久久一区二区三区| 日韩av高清不卡| 冲田杏梨av在线| 久久久久久成人| 在线女人免费视频| 在线观看免费一区| 中文字幕毛片| 国产日韩精品久久久| 亚洲欧洲一区二区| 国产日韩1区| 国产高清一区视频| 亚洲色图欧美| 成人综合网网址| 国产欧美日韩精品一区二区三区| 久久久免费电影| 国产日本亚洲| 欧美精品亚州精品| 国产美女精品视频免费播放软件| 亚洲男人天堂网| videos性欧美另类高清| 亚洲欧美综合另类中字| 91九色美女在线视频| 亚洲精品一区二区三区影院| 黄色小说在线播放| 亚洲国产日韩欧美在线99| 毛片网站在线看| 精品国产成人在线影院 | 欧美在线一二三四区| 少妇性bbb搡bbb爽爽爽欧美| 欧美在线你懂得| 超碰在线caoporn| 亚洲精品美女在线| 亚洲精品大全| 奇米影视亚洲狠狠色| 911久久香蕉国产线看观看| 97超级在线观看免费高清完整版电视剧| 色777狠狠狠综合伊人| 91精品一区二区三区综合在线爱| 欧洲在线/亚洲| 免费在线国产| 一区二区三区四区高清视频 | 精品精品国产高清a毛片牛牛| 日韩中出av| 99热99热| 欧美视频中文一区二区三区在线观看| sdde在线播放一区二区| 亚洲老板91色精品久久| av在线中文| 亚洲一区二区欧美日韩| av网站一区| 在线观看亚洲成人| 爱情岛亚洲播放路线| 国内露脸中年夫妇交换精品| av不卡在线观看| 最色在线观看| 亚洲电影第1页| 欧美精品国产白浆久久久久| 日韩久久久久久久| 欧美三级中文字幕在线观看| 婷婷综合成人| 成人黄色影视| 正在播放亚洲1区| 日韩在线视频播放| 欧美成人自拍| 国产一区二区在线免费视频| 香蕉视频成人在线观看| 天海翼女教师无删减版电影| 婷婷久久国产对白刺激五月99| 免费av在线一区二区| 成人性生交大合| 午夜激情视频在线| 国产成人啪精品视频免费网| 国产精品亚洲专一区二区三区| 头脑特工队2在线播放| 久久综合电影一区| 亚洲精品一区二区妖精| 国产日韩精品综合网站| 久久av中文字幕片| 肉肉视频在线观看| 欧美精品一区二区三区在线看午夜 | 精品久久久久国产| 久久经典视频| 成人妇女免费播放久久久| 久久久久久97三级| 亚洲无线观看| 美日韩在线观看| 国产精品入口夜色视频大尺度| 中文字幕中文字幕在线一区| eeuss影院在线观看| 国产91av在线| 久久精品国产99国产| 1024国产在线| 亚洲国产午夜伦理片大全在线观看网站| 亚洲一区国产一区| 亚洲一区高清| 色综合天天综合在线视频| 欧美xxxxx视频| 精品av中文字幕在线毛片 | 欧美一级爱爱视频| 亚洲欧美日韩一区二区三区在线| 国产乱对白刺激视频不卡| 日本一本在线免费福利| 日韩国产精品毛片| 欧美亚洲国产日本| 欧美日本视频在线| 极品少妇一区二区| 亚洲综合图色| 国产高清中文字幕在线| av免费观看网| 国产精品久久久久久久久免费看 | 国产原创精品| 亚洲久久久久久久久久| 欧美视频免费在线观看| 欧美精美视频| 福利成人在线观看| 永久免费看av| 国产精品你懂得| 日韩欧美一级二级三级| 久久久国产亚洲精品| 久久91麻豆精品一区| 91欧美在线视频| 玩弄中年熟妇正在播放| 国产一区二区精品免费| 久久国产精品首页| 在线观看三级视频欧美| 玖玖国产精品视频| 日韩综合一区| 欧美成人影院| 亚洲日本一区二区三区在线观看| 一区二区传媒有限公司| 国产在线欧美日韩| 亚洲精品粉嫩美女一区| 日本24小时在线高清视频| 亚洲电影免费| 亚洲在线www| 欧美一区二区三区免费视| 91麻豆精品国产91久久久久| 亚洲精品成a人| 国产精品三级av在线播放| www.性欧美| 免费一区视频| 午夜精品久久久久99热蜜桃导演 | 日本午夜大片a在线观看| 国产一级片在线| 国产三级电影在线观看| 你懂的免费在线观看视频网站| 在线视频se| 欧美日韩国产亚洲沙发| 精品电影在线| 1024在线看片你懂得| 伊伊综合在线| 国产精品白丝av嫩草影院| 亚洲区小说区| 色综合天天综合网中文字幕| 999国产精品永久免费视频app| 国产精品网站在线看| 一区二区三区视频播放| 综合激情网...| 欧美一性一交| 国产欧美精品| av成人免费在线观看| 国产精品色婷婷| 天天色图综合网| 欧美天天综合网| 精品av久久707| 午夜欧美在线一二页| 中文字幕一区二区在线播放| 综合av第一页| 精品久久久久久久久久久久久久久久久| 亚洲人成伊人成综合网久久久| 日韩a在线观看| 欧美激情性爽国产精品17p| www.视频在线.com| 五月婷婷丁香色| 视频一区二区在线播放| 国产精品免费播放| 日韩一区二区三区免费| 欧美人与动xxxxz0oz| 一区二区三区精品视频在线观看| 婷婷综合伊人| 丝袜美腿亚洲一区| 国产精品人妖ts系列视频| 日韩欧美福利视频| 欧美精品在线看| 亚洲综合第一页| 在线观看成人影院| 一级毛片在线| 国产一区一一区高清不卡| 在线欧美一区| 欧美视频在线观看免费| 曰本色欧美视频在线|