在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

Linux内核补丁举例分析

124次阅读
没有评论

共计 3363 个字符,预计需要花费 9 分钟才能阅读完成。

这篇文章主要介绍“Linux 内核补丁举例分析”,在日常操作中,相信很多人在 Linux 内核补丁举例分析问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux 内核补丁举例分析”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

如果在系统中读一个文件时会调用

generic_file_buffered_read

这个函数的功能是把磁盘中的数据读到 page 之后,或者直接获取 cache 中的 page, 然后调用 copy_page_to_iter 把 page 拷贝到用户层的 buffer 中。

一天寂静的下午,得空,打开电脑,准备仔细研究一下这个函数,发现这个函数的注释上面就写明了:

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

仔细看了一下代码,果然 ugly 的不像话,到处都是跳转和判断,令人眩晕,而且整个函数达到 300 行左右 (原谅我看了注释才斗胆这样讲:-)  ),发现要是把这个函数看下去,今天一整天的心情都不会好了 (当时看的是 Linux5.10 的代码)

ssize_t generic_file_buffered_read(struct kiocb *iocb, struct iov_iter *iter, ssize_t written) { find_page: if (fatal_signal_pending(current)) { error = -EINTR; goto out; } error = wait_on_page_locked_killable(page); if (unlikely(error)) goto readpage_error; if (PageUptodate(page)) goto page_ok; if (inode- i_blkbits == PAGE_SHIFT || !mapping- a_ops- is_partially_uptodate) goto page_not_up_to_date; /* pipes can t handle partially uptodate pages */ if (unlikely(iov_iter_is_pipe(iter))) goto page_not_up_to_date; if (!trylock_page(page)) goto page_not_up_to_date; /* Did it get truncated before we got the lock? */ if (!page- mapping) goto page_not_up_to_date_locked; if (!mapping- a_ops- is_partially_uptodate(page, offset, iter- count)) goto page_not_up_to_date_locked; unlock_page(page); }

于是就想内核社区这么多牛人,他们整天盯着这些代码,肯定很多人早已经注意到了,于是想去看看有没有人提交 patch 重构这个函数:

./scripts/get_maintainer.pl mm/filemap.c [email protected] (open list)

然后我就在下面网址中搜索 generic_file_buffered_read,果然在 10 月 25 号 (我看代码那天在 11 月 1 号前后), 就有人发了相关 patch:

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

然后迫不及待查看 patch,并把整个 patch 下载下来:

这里推荐一个工具,使用 b4 工具

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

可以直接从

https://lore.kernel.org

获取原始格式的 patch, 便于自己 git am 之后测试。

# b4 am https://lore.kernel.org/lkml/[email protected] v2_20201025_kent_overstreet_generic_file_buffered_read_improvements.cover v2_20201025_kent_overstreet_generic_file_buffered_read_improvements.mbx

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

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

打了这个 patch 之后,generic_file_buffered_read 变成了这个样子:

ssize_t generic_file_buffered_read(struct kiocb *iocb, struct iov_iter *iter, ssize_t written) { .. pg_nr = generic_file_buffered_read_get_pages(iocb, iter, pages, nr_pages); ... for (i = 0; i   pg_nr; i++) { copied = copy_page_to_iter(pages[i], offset, bytes, iter); }

而且

generic_file_buffered_read_get_pages

也非常之清晰:

static int generic_file_buffered_read_get_pages(struct kiocb *iocb, struct iov_iter *iter, struct page **pages, unsigned int nr) nr_got = find_get_pages_contig(mapping, index, nr, pages); if (nr_got) goto got_pages; if (iocb- ki_flags   IOCB_NOIO) return -EAGAIN; page_cache_sync_readahead(mapping, ra, filp, index, last_index - index); nr_got = find_get_pages_contig(mapping, index, nr, pages); if (nr_got) goto got_pages; ... }

到此,关于“Linux 内核补丁举例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计3363字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 亚洲免费福利 | 精品一区二区在线观看 | 久久久久久久性潮 | 色午夜视频 | 欧美日韩精品一区二区视频 | 久久精品国产一区二区 | 人人爽人人爽人人爽人人片av | 黄色精品视频 | 欧美久久网| 国产精品制服一区二区 | 久久精品国产亚洲av嫖农村妇女 | 国产精品视频免费看 | 苍井空张开腿实干12次 | 久久成人免费电影 | 久久成人免费观看全部免费 | 成人福利在线播放 | 九九精品国产 | 精品国产福利久久久 | 亚洲乱理伦片在线观看中字 | 久久精品94精品久久精品 | 欧美一级特黄高清免费 | 国产极品美女高潮无套在线观看 | 四虎影视884a精品国产四虎 | aa片在线观看视频在线播放 | 国产精品十八禁在线观看 | 成人99国产精品 | 天天搞天天干 | 熟女无套高潮内谢吼叫免费 | 永久天堂网 av手机版 | 国产成人无码午夜视频在线观看 | 999国产精品视频 | 免费中文字幕不卡视频 | 日本aaaa片毛片免费 | 欧美一级日韩一级亚洲一级va | 九九九九在线视频播放 | 国产永久一区二区三区 | 欧洲无码精品a码无人区 | 9色在线 | 香蕉视频一区二区三区 | 无码欧精品亚洲日韩一区 | 毛片免费电影 |