<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=UVM_in_the_Guest</id>
	<title>UVM in the Guest - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=UVM_in_the_Guest"/>
	<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=UVM_in_the_Guest&amp;action=history"/>
	<updated>2026-10-12T06:58:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://open-iov.org/index.php?title=UVM_in_the_Guest&amp;diff=23991&amp;oldid=prev</id>
		<title>WikiBot: Fix repository links: point to the cgit tree URLs</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=UVM_in_the_Guest&amp;diff=23991&amp;oldid=prev"/>
		<updated>2026-10-12T04:41:02Z</updated>

		<summary type="html">&lt;p&gt;Fix repository links: point to the cgit tree URLs&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:41, 12 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l3&quot;&gt;Line 3:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 3:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= UVM in the Guest =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= UVM in the Guest =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;'''Scope.''' What UVM (&amp;lt;code&amp;gt;nvidia_uvm.ko&amp;lt;/code&amp;gt;) does inside the guest, why it is the most demanding consumer of the virtual GPU's semantics, and how it waits. Canonical source: [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/03-architecture/04-uvm.md &amp;lt;code&amp;gt;../docs/03-architecture/04-uvm.md&amp;lt;/code&amp;gt;]; where this page and the docs tree disagree, the docs tree wins.&amp;lt;/blockquote&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;'''Scope.''' What UVM (&amp;lt;code&amp;gt;nvidia_uvm.ko&amp;lt;/code&amp;gt;) does inside the guest, why it is the most demanding consumer of the virtual GPU's semantics, and how it waits. Canonical source: [https://git.vgpu.io/open-iov&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.git&lt;/ins&gt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tree&lt;/ins&gt;/docs/03-architecture/04-uvm.md &amp;lt;code&amp;gt;../docs/03-architecture/04-uvm.md&amp;lt;/code&amp;gt;]; where this page and the docs tree disagree, the docs tree wins.&amp;lt;/blockquote&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Status: 2026-10-12, tree &amp;lt;code&amp;gt;master @ 2f066727&amp;lt;/code&amp;gt;. Tags: &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt; observed with the stock guest driver; &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt; partially working, software bridge in charge; &amp;lt;code&amp;gt;[gated]&amp;lt;/code&amp;gt; implemented default-off; &amp;lt;code&amp;gt;[target]&amp;lt;/code&amp;gt; planned end state.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Status: 2026-10-12, tree &amp;lt;code&amp;gt;master @ 2f066727&amp;lt;/code&amp;gt;. Tags: &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt; observed with the stock guest driver; &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt; partially working, software bridge in charge; &amp;lt;code&amp;gt;[gated]&amp;lt;/code&amp;gt; implemented default-off; &amp;lt;code&amp;gt;[target]&amp;lt;/code&amp;gt; planned end state.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l152&quot;&gt;Line 152:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 152:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 9. Related documentation ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 9. Related documentation ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/03-architecture/04-uvm.md &amp;lt;code&amp;gt;../docs/03-architecture/04-uvm.md&amp;lt;/code&amp;gt;] — canonical chapter (this page's source).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://git.vgpu.io/open-iov&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.git&lt;/ins&gt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tree&lt;/ins&gt;/docs/03-architecture/04-uvm.md &amp;lt;code&amp;gt;../docs/03-architecture/04-uvm.md&amp;lt;/code&amp;gt;] — canonical chapter (this page's source).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[The Guest Stack and CUDASW|&amp;lt;code&amp;gt;Guest-Stack-and-CUDASW.md&amp;lt;/code&amp;gt;]], [[GSP and GSP-RM|&amp;lt;code&amp;gt;GSP-and-GSP-RM.md&amp;lt;/code&amp;gt;]] — the guest stack and the RM objects UVM consumes.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[The Guest Stack and CUDASW|&amp;lt;code&amp;gt;Guest-Stack-and-CUDASW.md&amp;lt;/code&amp;gt;]], [[GSP and GSP-RM|&amp;lt;code&amp;gt;GSP-and-GSP-RM.md&amp;lt;/code&amp;gt;]] — the guest stack and the RM objects UVM consumes.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[CUDA Userspace Driver|&amp;lt;code&amp;gt;CUDA-Userspace-Driver.md&amp;lt;/code&amp;gt;]] — the userspace half of the contract; [[The vGSP Execution Plane (vEP)|&amp;lt;code&amp;gt;Execution-Plane.md&amp;lt;/code&amp;gt;]], [[The Execution Frontier|&amp;lt;code&amp;gt;Execution-Frontier.md&amp;lt;/code&amp;gt;]] — how UVM's pushes execute, and the current wall.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[CUDA Userspace Driver|&amp;lt;code&amp;gt;CUDA-Userspace-Driver.md&amp;lt;/code&amp;gt;]] — the userspace half of the contract; [[The vGSP Execution Plane (vEP)|&amp;lt;code&amp;gt;Execution-Plane.md&amp;lt;/code&amp;gt;]], [[The Execution Frontier|&amp;lt;code&amp;gt;Execution-Frontier.md&amp;lt;/code&amp;gt;]] — how UVM's pushes execute, and the current wall.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/04-implementation/01-known-knowns-and-unknowns.md &amp;lt;code&amp;gt;../docs/04-implementation/01-known-knowns-and-unknowns.md&amp;lt;/code&amp;gt;] — server-owned page tables and the fault contract.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://git.vgpu.io/open-iov&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.git&lt;/ins&gt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tree&lt;/ins&gt;/docs/04-implementation/01-known-knowns-and-unknowns.md &amp;lt;code&amp;gt;../docs/04-implementation/01-known-knowns-and-unknowns.md&amp;lt;/code&amp;gt;] — server-owned page tables and the fault contract.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff::1.12:old-23957:rev-23991 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=UVM_in_the_Guest&amp;diff=23957&amp;oldid=prev</id>
		<title>WikiBot: Carry the site-wide About/licensing message on every page (2026-10-12)</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=UVM_in_the_Guest&amp;diff=23957&amp;oldid=prev"/>
		<updated>2026-10-12T04:29:53Z</updated>

		<summary type="html">&lt;p&gt;Carry the site-wide About/licensing message on every page (2026-10-12)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:29, 12 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{About message}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= UVM in the Guest =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= UVM in the Guest =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff::1.12:old-23874:rev-23957 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=UVM_in_the_Guest&amp;diff=23874&amp;oldid=prev</id>
		<title>WikiBot: Add page from tracked wiki source (2026 IA update)</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=UVM_in_the_Guest&amp;diff=23874&amp;oldid=prev"/>
		<updated>2026-10-12T04:22:16Z</updated>

		<summary type="html">&lt;p&gt;Add page from tracked wiki source (2026 IA update)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= UVM in the Guest =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Scope.''' What UVM (&amp;lt;code&amp;gt;nvidia_uvm.ko&amp;lt;/code&amp;gt;) does inside the guest, why it is the most demanding consumer of the virtual GPU's semantics, and how it waits. Canonical source: [https://git.vgpu.io/open-iov/blob/master/docs/03-architecture/04-uvm.md &amp;lt;code&amp;gt;../docs/03-architecture/04-uvm.md&amp;lt;/code&amp;gt;]; where this page and the docs tree disagree, the docs tree wins.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Status: 2026-10-12, tree &amp;lt;code&amp;gt;master @ 2f066727&amp;lt;/code&amp;gt;. Tags: &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt; observed with the stock guest driver; &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt; partially working, software bridge in charge; &amp;lt;code&amp;gt;[gated]&amp;lt;/code&amp;gt; implemented default-off; &amp;lt;code&amp;gt;[target]&amp;lt;/code&amp;gt; planned end state.&lt;br /&gt;
&lt;br /&gt;
== 1. What UVM is ==&lt;br /&gt;
&lt;br /&gt;
UVM provides unified memory and GPU-driven page-fault handling. In practice it is a '''second GPU driver layered on the RM''', owning GPU address spaces and running its own memory-management work on the GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Component&lt;br /&gt;
! Role&lt;br /&gt;
|-&lt;br /&gt;
| VA spaces (&amp;lt;code&amp;gt;uvm_va_space&amp;lt;/code&amp;gt;)&lt;br /&gt;
| per-process GPU address spaces&lt;br /&gt;
|-&lt;br /&gt;
| Channel managers&lt;br /&gt;
| pools of GPU channels (CE, SEC2, GR as needed) for UVM's work&lt;br /&gt;
|-&lt;br /&gt;
| Push buffers / GPFIFO&lt;br /&gt;
| UVM builds and submits its own pushes&lt;br /&gt;
|-&lt;br /&gt;
| Semaphores and trackers&lt;br /&gt;
| UVM waits on GPU-written semaphores to track completion&lt;br /&gt;
|-&lt;br /&gt;
| Page trees&lt;br /&gt;
| GPU page tables for its VA spaces&lt;br /&gt;
|-&lt;br /&gt;
| Fault handling&lt;br /&gt;
| fault buffer plus notification; UVM resolves and replays/cancels faults&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For CUDA, UVM is entered early: &amp;lt;code&amp;gt;cuInit&amp;lt;/code&amp;gt; → driver init → &amp;lt;code&amp;gt;UVM_REGISTER_GPU&amp;lt;/code&amp;gt;. If UVM cannot register the GPU, CUDA does not start — which is why &amp;quot;UVM advances&amp;quot; is the project's primary correctness metric on the way to CUDA.&lt;br /&gt;
&lt;br /&gt;
== 2. The registration path (traced end to end) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;libcuda: UVM_REGISTER_GPU ioctl (0x25)&lt;br /&gt;
  uvm_api_register_gpu -&amp;amp;gt; uvm_va_space_register_gpu -&amp;amp;gt; uvm_gpu_retain_by_uuid&lt;br /&gt;
    nvUvmInterfaceRegisterGpu / GetGpuInfo; alloc_parent_gpu / add_gpu&lt;br /&gt;
      nvUvmInterfaceDeviceCreate          (RM object creation)&lt;br /&gt;
      uvm_hal_init_gpu / get_gpu_caps     (CE caps)&lt;br /&gt;
      uvm_ats_add_gpu / uvm_gpu_init_isr  (fault/interrupt plumbing)&lt;br /&gt;
    init_channel_manager&lt;br /&gt;
      create semaphore pool (sysmem)&lt;br /&gt;
      create channels per CE (GPFIFO + pushbuffer + semaphores)&lt;br /&gt;
      channel_init() -&amp;amp;gt; first push -&amp;amp;gt; semaphore release -&amp;amp;gt; wait&lt;br /&gt;
    uvm_page_tree_init                      (page tables for the VA space)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each stage has a distinct failure signature — see [[Guest Driver Lifecycle: A Field Guide|&amp;lt;code&amp;gt;Driver-Lifecycle-Field-Guide.md&amp;lt;/code&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
== 3. What UVM requires from the &amp;quot;GPU&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Requirement&lt;br /&gt;
! Detail&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| GPU identity&lt;br /&gt;
| must match the UUID from RM&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CE capabilities&lt;br /&gt;
| per-engine support bits; UVM requires &amp;lt;code&amp;gt;supported &amp;amp;amp;&amp;amp;amp; !grce &amp;amp;amp;&amp;amp;amp; sysmem&amp;lt;/code&amp;gt; for CPU_TO_GPU / GPU_TO_CPU channels&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt; caps accepted; &amp;lt;code&amp;gt;[gated]&amp;lt;/code&amp;gt; copies forwarded to the physical copy engine&lt;br /&gt;
|-&lt;br /&gt;
| Channel creation&lt;br /&gt;
| RM channel objects with GPFIFO/userd/instance parameters&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Pushes executed&lt;br /&gt;
| first action on a new channel is an init push plus a semaphore-tracked wait&lt;br /&gt;
| &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt; software bridge executes memsets, copies and releases; &amp;lt;code&amp;gt;[gated]&amp;lt;/code&amp;gt; CE-class copies forwarded&lt;br /&gt;
|-&lt;br /&gt;
| Page trees&lt;br /&gt;
| UVM initializes page trees with its own pushes; server-owned ranges must be populated by us&lt;br /&gt;
| &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fault delivery&lt;br /&gt;
| fault buffer plus notification; replay/cancel semantics&lt;br /&gt;
| &amp;lt;code&amp;gt;[gated]&amp;lt;/code&amp;gt; backend-side observation/relay; guest contract &amp;lt;code&amp;gt;[target]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Completion semantics&lt;br /&gt;
| tracker values must advance exactly&lt;br /&gt;
| &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Current frontier.''' Context creation and the full CUDA driver-API smoke pass (&amp;lt;code&amp;gt;ALL OK&amp;lt;/code&amp;gt;, copies matched) run end to end. CE-class copies are forwarded to the physical copy engine (default off) with engine-authored releases and a fault relay. For GR, a forwarded guest launch reaches the front-end but the inline launch-descriptor install has not been observed; context validity at dispatch is ruled out ([[The Execution Frontier|&amp;lt;code&amp;gt;Execution-Frontier.md&amp;lt;/code&amp;gt;]]). The remaining UVM work is completion translation and the guest-side fault replay/cancel contract.&lt;br /&gt;
&lt;br /&gt;
== 4. The discovery that defines the work: how UVM waits ==&lt;br /&gt;
&lt;br /&gt;
UVM's tracker is the single most visible symptom of an unfaithful GPU. It spins, and after 30 seconds it dumps its state:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;uvm_tracker.c:285 Tracker entry for value 1 (sema VA 0x121000000)&lt;br /&gt;
uvm_channel.c:4184 pending push '' started at uvm_channel.c:2535 in channel_init()&lt;br /&gt;
    releasing value 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mechanically, UVM built a push ending in a '''semaphore release''' — a method sequence (CE channel class, e.g. &amp;lt;code&amp;gt;TURING_DMA_COPY_A&amp;lt;/code&amp;gt;) that sets an address and a payload and launches a DMA operation to write the payload to memory — then submitted it and waits for the payload to appear. On real hardware the copy engine writes it; on our device nobody does unless the emulation does. The push we found in guest RAM decodes as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;20010000 0000c5b5   set-object (TURING_DMA_COPY_A)&lt;br /&gt;
2001a000 0000c076   set-object (GP100_UVM_SW)&lt;br /&gt;
20038090 00000001   incrementing-method header: count 3, addr 0x240&lt;br /&gt;
21000000 00000001   lower 32 bits of the semaphore VA; payload (1)&lt;br /&gt;
200180c0 0000000c   LAUNCH_DMA with SEMAPHORE_TYPE=RELEASE_ONE_WORD&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So the emulation's job for this push is: '''write &amp;lt;code&amp;gt;payload&amp;lt;/code&amp;gt; to the memory at the semaphore's GPU VA''', which requires a GPU-VA → guest-PA translation. The host does this through the learned VA→PA map: while the channel's GPFIFO has pending entries it reads each push, decodes the method stream and runs the work (page-table memsets, copies, semaphore releases). When a push page cannot be resolved — or a channel consumes entries without any release landing — it falls back to content: guest RAM is scanned for release groups and pending payloads are applied forward-only. A release is applied only when &amp;lt;code&amp;gt;payload &amp;amp;gt; current&amp;lt;/code&amp;gt;, so recycled push buffers and stale copies are harmless. One pitfall observed live: a semaphore-page VA can flap between two physical pages across map rebuilds; pinning the validated translation fixes the stalled wait.&lt;br /&gt;
&lt;br /&gt;
== 5. The memory model UVM assumes ==&lt;br /&gt;
&lt;br /&gt;
* UVM's semaphore pool is '''system memory''' (&amp;lt;code&amp;gt;UVM_APERTURE_SYS&amp;lt;/code&amp;gt;), one 4 KiB page per channel manager, addressed as 4-byte slots (1024 per page).&lt;br /&gt;
* Each page has a '''GPU VA''' (chosen by the client's RM) and a '''CPU VA''' (a kernel mapping). UVM polls the CPU VA; the GPU writes the GPU VA.&lt;br /&gt;
* Both addresses are recorded in UVM's structures in guest memory — the key that makes translation possible without extra help from the guest.&lt;br /&gt;
* The CPU VA is a direct-map address, so &amp;lt;code&amp;gt;PA = cpu_va - page_offset_base&amp;lt;/code&amp;gt; (verified live: writing the payload there completes the push).&lt;br /&gt;
* Values are per channel and monotonic (1, 2, 3 …); UVM's own check (&amp;lt;code&amp;gt;UVM_GPU_SEMAPHORE_MAX_JUMP&amp;lt;/code&amp;gt;) detects and reports wrong values.&lt;br /&gt;
* The client's page tables for '''server-owned ranges are empty chains''': the client hands us the physical addresses of its page-table levels and expects the server to own the lower levels ([[GSP and GSP-RM|&amp;lt;code&amp;gt;GSP-and-GSP-RM.md&amp;lt;/code&amp;gt;]]).&lt;br /&gt;
&lt;br /&gt;
== 6. Page trees and faults ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uvm_page_tree_init&amp;lt;/code&amp;gt; initializes a VA space's page tables with pushes on UVM's own channels (memops and page-table writes; the copy engine executes them on real hardware). Fault handling is event-driven: UVM programs a fault buffer (replayable and non-replayable; sizes from &amp;lt;code&amp;gt;INTERNAL_GMMU_GET_STATIC_INFO&amp;lt;/code&amp;gt;, answered by the emulation) and, on a fault, reads the entry, populates the page table and replays or cancels the fault with a &amp;lt;code&amp;gt;MEM_OP&amp;lt;/code&amp;gt; push. Reconciling the guest's memory model with the real GPU's here is the deepest remaining work.&lt;br /&gt;
&lt;br /&gt;
== 7. How to observe UVM ==&lt;br /&gt;
&lt;br /&gt;
In the guest, UVM prints nothing by default:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;echo 1 | sudo tee /sys/module/nvidia_uvm/parameters/uvm_debug_prints&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Messages then appear with the &amp;lt;code&amp;gt;nvidia-uvm:&amp;lt;/code&amp;gt; prefix. Known-good markers, in order: &amp;lt;code&amp;gt;uvm_gpu_retain_by_uuid&amp;lt;/code&amp;gt; → channel manager created → &amp;lt;code&amp;gt;uvm_page_tree_init&amp;lt;/code&amp;gt; pushes → &amp;lt;code&amp;gt;UVM_REGISTER_GPU&amp;lt;/code&amp;gt; returns and CUDA proceeds. Failure signatures characterized live:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Failed to initialize the channel manager: NV_ERR_NOT_SUPPORTED&amp;lt;/code&amp;gt;&lt;br /&gt;
| CE caps wrong or missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stuck waiting&amp;lt;/code&amp;gt; plus &amp;lt;code&amp;gt;Tracker entry ... channel_init()&amp;lt;/code&amp;gt;&lt;br /&gt;
| the push's semaphore was never written&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assert failed ... unexpected semaphore ... jump from 0x0 to 0x1010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| a wrong payload was written; UVM caught it&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Why UVM is the perfect correctness oracle ==&lt;br /&gt;
&lt;br /&gt;
UVM exercises in minutes what a driver test suite would test in hours: memory allocation, page tables, channel setup, push generation, semaphore semantics, fault handling and error recovery — all with continuous self-checks and loud diagnostics. When UVM registers cleanly and CUDA workloads pass, the device is behaving like a real GPU.&lt;br /&gt;
&lt;br /&gt;
== 9. Related documentation ==&lt;br /&gt;
&lt;br /&gt;
* [https://git.vgpu.io/open-iov/blob/master/docs/03-architecture/04-uvm.md &amp;lt;code&amp;gt;../docs/03-architecture/04-uvm.md&amp;lt;/code&amp;gt;] — canonical chapter (this page's source).&lt;br /&gt;
* [[The Guest Stack and CUDASW|&amp;lt;code&amp;gt;Guest-Stack-and-CUDASW.md&amp;lt;/code&amp;gt;]], [[GSP and GSP-RM|&amp;lt;code&amp;gt;GSP-and-GSP-RM.md&amp;lt;/code&amp;gt;]] — the guest stack and the RM objects UVM consumes.&lt;br /&gt;
* [[CUDA Userspace Driver|&amp;lt;code&amp;gt;CUDA-Userspace-Driver.md&amp;lt;/code&amp;gt;]] — the userspace half of the contract; [[The vGSP Execution Plane (vEP)|&amp;lt;code&amp;gt;Execution-Plane.md&amp;lt;/code&amp;gt;]], [[The Execution Frontier|&amp;lt;code&amp;gt;Execution-Frontier.md&amp;lt;/code&amp;gt;]] — how UVM's pushes execute, and the current wall.&lt;br /&gt;
* [https://git.vgpu.io/open-iov/blob/master/docs/04-implementation/01-known-knowns-and-unknowns.md &amp;lt;code&amp;gt;../docs/04-implementation/01-known-knowns-and-unknowns.md&amp;lt;/code&amp;gt;] — server-owned page tables and the fault contract.&lt;/div&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
</feed>