<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Linux I/O on Hellokitty&#39;s Blog</title>
    <link>https://yangyang233333.github.io/tags/linux-i/o/</link>
    <description>Recent content in Linux I/O on Hellokitty&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Fri, 21 Aug 2026 10:47:00 +0800</lastBuildDate>
    <atom:link href="https://yangyang233333.github.io/tags/linux-i/o/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>nvidia-fs 源码阅读（三）：文件 I/O、批处理、完成路径与诊断</title>
      <link>https://yangyang233333.github.io/posts/nvidia-fs-source-code-reading-io/</link>
      <pubDate>Fri, 21 Aug 2026 10:47:00 +0800</pubDate>
      <guid>https://yangyang233333.github.io/posts/nvidia-fs-source-code-reading-io/</guid>
      <description>&lt;p&gt;前两篇分别介绍了 &lt;code&gt;nvidia-fs&lt;/code&gt; 的模块结构，以及 GPU virtual address 到 peer DMA address 的映射。本文沿一次 &lt;code&gt;cuFileRead&lt;/code&gt; 对应的内核路径，分析文件 I/O 如何提交、完成和清理，并介绍 batch、稀疏文件、RDMA 与 &lt;code&gt;/proc&lt;/code&gt; 诊断接口。&lt;/p&gt;
&lt;p&gt;阅读版本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;commit: 328d1d8cce1175c013720985c30e123e9a35242c
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GDS_VERSION: 2.29.4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;一io-入口&#34;&gt;一、I/O 入口&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;nvfs_ioctl()&lt;/code&gt; 接收：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NVFS_IOCTL_READ
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NVFS_IOCTL_WRITE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NVFS_IOCTL_BATCH_IO
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;单次读写共用两阶段结构：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nvfs_io_init(op, ioargs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; 验证并构造 nvfs_io
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nvfs_io_start_op(nvfsio)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; 向目标文件提交真正 I/O
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;分成两步的意义在于：参数验证、对象引用和资源分配都应在进入异步 I/O 前完成。一旦请求提交，完成回调可能很快发生，初始化不完整会造成竞态。&lt;/p&gt;
&lt;h2 id=&#34;二nvfs_io_init-做了什么&#34;&gt;二、&lt;code&gt;nvfs_io_init&lt;/code&gt; 做了什么&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;nvfs_io_init()&lt;/code&gt; 是用户参数到内核 I/O 对象的转换层，主要工作包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;根据文件描述符取得目标 &lt;code&gt;struct file&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;检查读写权限；&lt;/li&gt;
&lt;li&gt;查找已经注册的 GPU buffer/mgroup；&lt;/li&gt;
&lt;li&gt;验证 GPU buffer offset、文件 offset 和长度；&lt;/li&gt;
&lt;li&gt;建立影子 page 对应的 iov 或迭代器；&lt;/li&gt;
&lt;li&gt;初始化 &lt;code&gt;kiocb&lt;/code&gt;、完成函数和统计字段；&lt;/li&gt;
&lt;li&gt;为同步、异步和特殊文件系统路径设置标志。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;源码还会检查文件系统类型、direct I/O 条件和文件权限。写操作比读操作更复杂，因为它可能涉及文件扩展、页缓存一致性及磁盘空间预分配。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
