The nvidia vulkan library doesn’t cleanly restart. Here is a test:
#include <vulkan/vulkan.h>
#include <stdio.h>
// gcc toy.c -lvulkan && valgrind ./a.out
//
// uname:
// 6.12.48+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.48-1 (2025-09-20) x86_64 GNU/Linux
// nvidia-smi:
// NVIDIA-SMI 550.163.01 Driver Version: 550.163.01 CUDA Version: 12.4
// ... NVIDIA GeForce RTX 4070
int main(void)
{
uint32_t original_num_phdevs = 0;
for (size_t i = 0; i < 1000; ++i) {
VkInstance inst;
VkApplicationInfo app_info = {
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.pNext = NULL,
.pApplicationName = "leak_test",
.applicationVersion = VK_MAKE_VERSION(0, 0, 1),
.pEngineName = "leak_test",
.engineVersion = VK_MAKE_VERSION(0, 0, 1),
.apiVersion = VK_API_VERSION_1_4,
};
VkInstanceCreateInfo create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
create_info.pNext = NULL;
create_info.pApplicationInfo = &app_info;
create_info.enabledExtensionCount = 0;
create_info.ppEnabledExtensionNames = NULL;
create_info.enabledLayerCount = 0;
create_info.ppEnabledLayerNames = NULL;
if (vkCreateInstance(&create_info, NULL, &inst) != VK_SUCCESS) {
printf("failed to create Vulkan instance\n");
return -1;
}
uint32_t num_phdevs;
if (vkEnumeratePhysicalDevices(inst, &num_phdevs, 0) != VK_SUCCESS) {
printf("failed to enumerate Vulkan instance\n");
return -1;
}
if (i == 0) {
original_num_phdevs = num_phdevs;
}
vkDestroyInstance(inst, NULL);
if (original_num_phdevs != num_phdevs) {
printf("Num phdevs mismatch at restart: %d %d %d\n", i, num_phdevs, original_num_phdevs);
return -1;
}
}
return 0;
}
for me the output is:
Num phdevs mismatch at restart: 9 2 3
(I have an integrated AMD and a CPU-llvm device, both keep showing up).
Also lots of valgrind issues for valgrind –leak-check=full ./a.out:
==27033==
==27033== HEAP SUMMARY:
==27033== in use at exit: 318,798 bytes in 2,756 blocks
==27033== total heap usage: 209,758 allocs, 207,002 frees, 12,365,515,310 bytes allocated
==27033==
==27033== 368 (40 direct, 328 indirect) bytes in 1 blocks are definitely lost in loss record 2,529 of 2,558
==27033== at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033== by 0xD1AD49D: ???
==27033== by 0xD1AD576: ???
==27033== by 0xD1A05F4: ???
==27033== by 0x4860404: ???
==27033== by 0x68CF63D: ???
==27033== by 0x68CE5EC: ???
==27033== by 0x68CF331: ???
==27033== by 0x48A755D: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x48ABDA2: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x48B70E3: vkCreateInstance (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x109247: main (in /tmp/silly_vulkan/a.out)
==27033==
==27033== 368 (40 direct, 328 indirect) bytes in 1 blocks are definitely lost in loss record 2,530 of 2,558
==27033== at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033== by 0xC1AD49D: ???
==27033== by 0xC1AD576: ???
==27033== by 0xC1A05F4: ???
==27033== by 0x4860404: ???
==27033== by 0x68CF63D: ???
==27033== by 0x68CE5EC: ???
==27033== by 0x68CF331: ???
==27033== by 0x48A755D: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x48ABDA2: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x48B70E3: vkCreateInstance (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x109247: main (in /tmp/silly_vulkan/a.out)
==27033==
==27033== 368 (40 direct, 328 indirect) bytes in 1 blocks are definitely lost in loss record 2,531 of 2,558
==27033== at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033== by 0xC8F449D: ???
==27033== by 0xC8F4576: ???
==27033== by 0xC8E75F4: ???
==27033== by 0x4860404: ???
==27033== by 0x68CF63D: ???
==27033== by 0x68CE5EC: ???
==27033== by 0x68CF331: ???
==27033== by 0x48A755D: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x48ABDA2: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x48B70E3: vkCreateInstance (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x109247: main (in /tmp/silly_vulkan/a.out)
==27033==
==27033== 512 bytes in 1 blocks are possibly lost in loss record 2,532 of 2,558
==27033== at 0x4844818: malloc (vg_replace_malloc.c:446)
==27033== by 0x40113A8: malloc (rtld-malloc.h:56)
==27033== by 0x40113A8: _dl_resize_dtv (dl-tls.c:559)
==27033== by 0x4011C76: _dl_update_slotinfo (dl-tls.c:880)
==27033== by 0x400C946: update_tls_slotinfo (dl-open.c:409)
==27033== by 0x400C946: dl_open_worker_begin (dl-open.c:729)
==27033== by 0x4002398: _dl_catch_exception (dl-catch.c:241)
==27033== by 0x400B9A7: dl_open_worker (dl-open.c:761)
==27033== by 0x4002398: _dl_catch_exception (dl-catch.c:241)
==27033== by 0x400BDA7: _dl_open (dl-open.c:874)
==27033== by 0x498A257: dlopen_doit (dlopen.c:56)
==27033== by 0x4002398: _dl_catch_exception (dl-catch.c:241)
==27033== by 0x40024BE: _dl_catch_error (dl-catch.c:260)
==27033== by 0x4989D66: _dlerror_run (dlerror.c:138)
==27033==
==27033== 1,201 (184 direct, 1,017 indirect) bytes in 1 blocks are definitely lost in loss record 2,542 of 2,558
==27033== at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033== by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD507797: dbus_bus_register (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==
==27033== 1,201 (184 direct, 1,017 indirect) bytes in 1 blocks are definitely lost in loss record 2,543 of 2,558
==27033== at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033== by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xEDB8090: ???
==27033==
==27033== 1,201 (184 direct, 1,017 indirect) bytes in 1 blocks are definitely lost in loss record 2,544 of 2,558
==27033== at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033== by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xF9B8090: ???
==27033==
==27033== 1,840 (200 direct, 1,640 indirect) bytes in 5 blocks are definitely lost in loss record 2,547 of 2,558
==27033== at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033== by 0xD1BB49D: ???
==27033== by 0xD1BB576: ???
==27033== by 0xD1AE5F4: ???
==27033== by 0x4860404: ???
==27033== by 0x68CF63D: ???
==27033== by 0x68CE5EC: ???
==27033== by 0x68CF331: ???
==27033== by 0x48A755D: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x48ABDA2: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x48B70E3: vkCreateInstance (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033== by 0x109247: main (in /tmp/silly_vulkan/a.out)
==27033==
==27033== 2,402 (368 direct, 2,034 indirect) bytes in 2 blocks are definitely lost in loss record 2,550 of 2,558
==27033== at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033== by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xF1B8090: ???
==27033==
==27033== 3,603 (552 direct, 3,051 indirect) bytes in 3 blocks are definitely lost in loss record 2,551 of 2,558
==27033== at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033== by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== by 0xF5B8090: ???
==27033==
==27033== LEAK SUMMARY:
==27033== definitely lost: 1,792 bytes in 16 blocks
==27033== indirectly lost: 10,760 bytes in 40 blocks
==27033== possibly lost: 512 bytes in 1 blocks
==27033== still reachable: 305,702 bytes in 2,698 blocks
==27033== suppressed: 32 bytes in 1 blocks
==27033== Reachable blocks (those to which a pointer was found) are not shown.
==27033== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==27033==
==27033== For lists of detected and suppressed errors, rerun with: -s
==27033== ERROR SUMMARY: 46 errors from 22 contexts (suppressed: 0 from 0)
I’m running this clean (on a machine with no window manager or other running graphics processes. Just from the tty of the machine).