33#include < cstring>
44#include < infinirt.h>
55#include < iostream>
6+ #include < memory>
67#include < numeric>
78#include < vector>
89
@@ -111,7 +112,7 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
111112 // Test 1: Basic virtual memory allocation and release
112113 {
113114 std::cout << " \n Test 1: Basic virtual memory allocation and release" << std::endl;
114- infinirtVirtualMem_t vm;
115+ void * vm;
115116 size_t vm_len = 10 * min_granularity;
116117 if (infinirtCreateVirtualMem (&vm, vm_len) != INFINI_STATUS_SUCCESS) {
117118 std::cerr << " Failed to reserve virtual memory" << std::endl;
@@ -120,7 +121,7 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
120121 std::cout << " Virtual memory reserved: " << vm_len << " bytes" << std::endl;
121122
122123 // Release virtual memory
123- if (infinirtReleaseVirtualMem (vm) != INFINI_STATUS_SUCCESS) {
124+ if (infinirtReleaseVirtualMem (vm, vm_len ) != INFINI_STATUS_SUCCESS) {
124125 std::cerr << " Failed to release virtual memory" << std::endl;
125126 return false ;
126127 }
@@ -130,15 +131,15 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
130131 // Test 2: Physical memory allocation and release
131132 {
132133 std::cout << " \n Test 2: Physical memory allocation and release" << std::endl;
133- infinirtPhyMem_t phy_mem ;
134- if (infinirtCreatePhysicalMem (&phy_mem , min_granularity) != INFINI_STATUS_SUCCESS) {
134+ infinirtPhysicalMemoryHandle_t pm_handle ;
135+ if (infinirtCreatePhysicalMem (&pm_handle , min_granularity) != INFINI_STATUS_SUCCESS) {
135136 std::cerr << " Failed to create physical memory" << std::endl;
136137 return false ;
137138 }
138139 std::cout << " Physical memory created: " << min_granularity << " bytes" << std::endl;
139140
140141 // Release physical memory
141- if (infinirtReleasePhysicalMem (phy_mem ) != INFINI_STATUS_SUCCESS) {
142+ if (infinirtReleasePhysicalMem (pm_handle ) != INFINI_STATUS_SUCCESS) {
142143 std::cerr << " Failed to release physical memory" << std::endl;
143144 return false ;
144145 }
@@ -150,23 +151,22 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
150151 std::cout << " \n Test 3: Virtual memory mapping and data verification" << std::endl;
151152
152153 // Create virtual memory regions
153- infinirtVirtualMem_t vm1, vm2;
154+ void * vm1, * vm2;
154155 size_t vm_len = 10 * min_granularity;
155156 if (infinirtCreateVirtualMem (&vm1, vm_len) != INFINI_STATUS_SUCCESS || infinirtCreateVirtualMem (&vm2, 2 * min_granularity) != INFINI_STATUS_SUCCESS) {
156157 std::cerr << " Failed to create virtual memory regions" << std::endl;
157158 return false ;
158159 }
159160
160161 // Create physical memory
161- infinirtPhyMem_t phy_mem ;
162- if (infinirtCreatePhysicalMem (&phy_mem , min_granularity) != INFINI_STATUS_SUCCESS) {
162+ infinirtPhysicalMemoryHandle_t pm_handle ;
163+ if (infinirtCreatePhysicalMem (&pm_handle , min_granularity) != INFINI_STATUS_SUCCESS) {
163164 std::cerr << " Failed to create physical memory" << std::endl;
164165 return false ;
165166 }
166167
167168 // Map physical memory to both virtual memory regions
168- void *mapped_ptr1, *mapped_ptr2;
169- if (infinirtMapVirtualMem (&mapped_ptr1, vm1, min_granularity, phy_mem) != INFINI_STATUS_SUCCESS || infinirtMapVirtualMem (&mapped_ptr2, vm2, min_granularity, phy_mem) != INFINI_STATUS_SUCCESS) {
169+ if (infinirtMapVirtualMem (vm1, min_granularity, 0 , pm_handle) != INFINI_STATUS_SUCCESS || infinirtMapVirtualMem (vm2, min_granularity, 0 , pm_handle) != INFINI_STATUS_SUCCESS) {
170170 std::cerr << " Failed to map virtual memory" << std::endl;
171171 return false ;
172172 }
@@ -175,14 +175,14 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
175175 size_t num_elements = min_granularity / sizeof (size_t );
176176 std::vector<size_t > host_data (num_elements);
177177 std::iota (host_data.begin (), host_data.end (), 0 );
178- if (infinirtMemcpy (mapped_ptr1 , host_data.data (), min_granularity, INFINIRT_MEMCPY_H2D) != INFINI_STATUS_SUCCESS) {
178+ if (infinirtMemcpy (vm1 , host_data.data (), min_granularity, INFINIRT_MEMCPY_H2D) != INFINI_STATUS_SUCCESS) {
179179 std::cerr << " Failed to copy data to device" << std::endl;
180180 return false ;
181181 }
182182
183183 // Read data through second mapping
184184 std::vector<size_t > host_data2 (num_elements, 0 );
185- if (infinirtMemcpy (host_data2.data (), mapped_ptr2 , min_granularity, INFINIRT_MEMCPY_D2H) != INFINI_STATUS_SUCCESS) {
185+ if (infinirtMemcpy (host_data2.data (), vm2 , min_granularity, INFINIRT_MEMCPY_D2H) != INFINI_STATUS_SUCCESS) {
186186 std::cerr << " Failed to copy data from device" << std::endl;
187187 return false ;
188188 }
@@ -200,7 +200,7 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
200200 }
201201
202202 // Verify memory access fails after unmapping
203- if (infinirtMemcpy (host_data.data (), mapped_ptr1 , min_granularity, INFINIRT_MEMCPY_D2H) == INFINI_STATUS_SUCCESS) {
203+ if (infinirtMemcpy (host_data.data (), vm1 , min_granularity, INFINIRT_MEMCPY_D2H) == INFINI_STATUS_SUCCESS) {
204204 std::cerr << " Memory access after unmap should fail" << std::endl;
205205 return false ;
206206 }
@@ -215,24 +215,83 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
215215 }
216216
217217 // Release physical memory
218- if (infinirtReleasePhysicalMem (phy_mem ) != INFINI_STATUS_SUCCESS) {
218+ if (infinirtReleasePhysicalMem (pm_handle ) != INFINI_STATUS_SUCCESS) {
219219 std::cerr << " Failed to release physical memory" << std::endl;
220220 return false ;
221221 }
222222
223223 // Release virtual memory regions
224- if (infinirtReleaseVirtualMem (vm1) != INFINI_STATUS_SUCCESS) {
224+ if (infinirtReleaseVirtualMem (vm1, vm_len ) != INFINI_STATUS_SUCCESS) {
225225 std::cerr << " Failed to release first virtual memory" << std::endl;
226226 return false ;
227227 }
228- if (infinirtReleaseVirtualMem (vm2) != INFINI_STATUS_SUCCESS) {
228+ if (infinirtReleaseVirtualMem (vm2, 2 * min_granularity ) != INFINI_STATUS_SUCCESS) {
229229 std::cerr << " Failed to release second virtual memory" << std::endl;
230230 return false ;
231231 }
232232
233233 std::cout << " All resources cleaned up successfully" << std::endl;
234234 }
235235
236+ // Test 4: Release virtual memory without unmapping
237+ {
238+ std::cout << " \n Test 4: Release virtual memory without unmapping" << std::endl;
239+
240+ // Create virtual memory
241+ void *vm;
242+ size_t vm_len = 2 * min_granularity;
243+ if (infinirtCreateVirtualMem (&vm, vm_len) != INFINI_STATUS_SUCCESS) {
244+ std::cerr << " Failed to create virtual memory" << std::endl;
245+ return false ;
246+ }
247+
248+ // Create physical memory
249+ infinirtPhysicalMemoryHandle_t pm_handle;
250+ if (infinirtCreatePhysicalMem (&pm_handle, min_granularity) != INFINI_STATUS_SUCCESS) {
251+ std::cerr << " Failed to create physical memory" << std::endl;
252+ infinirtReleaseVirtualMem (vm, vm_len);
253+ return false ;
254+ }
255+
256+ // Map virtual memory to physical memory
257+ if (infinirtMapVirtualMem (vm, min_granularity, 0 , pm_handle) != INFINI_STATUS_SUCCESS) {
258+ std::cerr << " Failed to map virtual memory" << std::endl;
259+ infinirtReleasePhysicalMem (pm_handle);
260+ infinirtReleaseVirtualMem (vm, vm_len);
261+ return false ;
262+ }
263+
264+ std::cout << " Attempting to release virtual memory without unmapping first..." << std::endl;
265+ // Try to release virtual memory without unmapping - this should fail
266+ if (infinirtReleaseVirtualMem (vm, vm_len) == INFINI_STATUS_SUCCESS) {
267+ std::cerr << " ERROR: Virtual memory release succeeded without unmapping first!" << std::endl;
268+ // Clean up anyway
269+ infinirtUnmapVirtualMem (vm, min_granularity);
270+ infinirtReleasePhysicalMem (pm_handle);
271+ return false ;
272+ }
273+ std::cout << " As expected, virtual memory release failed when mapped" << std::endl;
274+
275+ // Clean up properly
276+ if (infinirtUnmapVirtualMem (vm, min_granularity) != INFINI_STATUS_SUCCESS) {
277+ std::cerr << " Failed to unmap virtual memory during cleanup" << std::endl;
278+ infinirtReleasePhysicalMem (pm_handle);
279+ return false ;
280+ }
281+
282+ if (infinirtReleasePhysicalMem (pm_handle) != INFINI_STATUS_SUCCESS) {
283+ std::cerr << " Failed to release physical memory during cleanup" << std::endl;
284+ return false ;
285+ }
286+
287+ // Now release should succeed
288+ if (infinirtReleaseVirtualMem (vm, vm_len) != INFINI_STATUS_SUCCESS) {
289+ std::cerr << " Failed to release virtual memory after unmapping" << std::endl;
290+ return false ;
291+ }
292+ std::cout << " Successfully released virtual memory after proper unmapping" << std::endl;
293+ }
294+
236295 std::cout << " \n All virtual memory tests PASSED!" << std::endl;
237296 return true ;
238297}
0 commit comments