<?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>SNVMe on Hellokitty&#39;s Blog</title>
    <link>https://yangyang233333.github.io/tags/snvme/</link>
    <description>Recent content in SNVMe on Hellokitty&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Thu, 03 Sep 2026 17:40:00 +0800</lastBuildDate>
    <atom:link href="https://yangyang233333.github.io/tags/snvme/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Tutti 源码阅读（二）：GPU 如何直接驱动 NVMe 队列</title>
      <link>https://yangyang233333.github.io/posts/tutti-snvme-source-reading/</link>
      <pubDate>Thu, 03 Sep 2026 17:40:00 +0800</pubDate>
      <guid>https://yangyang233333.github.io/posts/tutti-snvme-source-reading/</guid>
      <description>&lt;p&gt;Tutti 最具辨识度的代码位于运行时以下：自定义 &lt;code&gt;snvme&lt;/code&gt; 内核模块建立受控 NVMe queue pair，&lt;code&gt;libnvm&lt;/code&gt; 管理设备资源，GPU kernel 批量写 SQE、更新 doorbell 并轮询 CQE。数据通过 PCIe P2P DMA 在 SSD 与 HBM 之间移动，CPU 不再逐条提交 I/O。&lt;/p&gt;
&lt;p&gt;本文沿一次读请求下潜，分析为什么主线 Linux NVMe 驱动不够、控制面与数据面如何分离、GPU 如何构造命令，以及条带化和 layer-wise overlap 怎样落实到代码结构。&lt;/p&gt;
&lt;p&gt;项目源码：&lt;a href=&#34;https://github.com/xPU-IO/Tutti&#34;&gt;xPU-IO/Tutti&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;一为什么需要自定义-snvme&#34;&gt;一、为什么需要自定义 &lt;code&gt;snvme&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;NVMe 控制器的数据面并不复杂：主机写 Submission Queue，更新 MMIO doorbell，设备执行 DMA，再把 Completion Queue Entry 写回内存。&lt;/p&gt;
&lt;p&gt;问题是 Linux 主线 NVMe 驱动没有向普通应用提供一套稳定机制，用来同时完成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建应用独占或受控的 I/O queue pair；&lt;/li&gt;
&lt;li&gt;将 SQ/CQ 放入可被应用或 GPU 访问的固定内存；&lt;/li&gt;
&lt;li&gt;把对应 doorbell BAR 页安全映射给应用；&lt;/li&gt;
&lt;li&gt;将 GPU HBM 注册成 NVMe 可 DMA 的 peer memory；&lt;/li&gt;
&lt;li&gt;允许应用自行轮询 CQ，而不经过每请求系统调用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;传统 &lt;code&gt;read&lt;/code&gt;、&lt;code&gt;io_uring&lt;/code&gt; 或 GDS 可以缩短部分路径，但 NVMe 队列仍主要由内核或 CPU 侧库控制。Tutti 要让 GPU 成为请求生产者，因此需要一个负责授权与建图的内核控制面。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
