diff --git a/src/globals.c b/src/globals.c index 3d75b9f1b7..851853aad0 100644 --- a/src/globals.c +++ b/src/globals.c @@ -27,7 +27,7 @@ // HSAKMT global data -int kfd_fd; +int kfd_fd = -1; unsigned long kfd_open_count; unsigned long system_properties_count; pthread_mutex_t hsakmt_mutex = PTHREAD_MUTEX_INITIALIZER; diff --git a/src/openclose.c b/src/openclose.c index d52868e963..4da5ac6d5b 100644 --- a/src/openclose.c +++ b/src/openclose.c @@ -99,7 +99,7 @@ static void clear_after_fork(void) destroy_device_debugging_memory(); if (kfd_fd) { close(kfd_fd); - kfd_fd = 0; + kfd_fd = -1; } kfd_open_count = 0; parent_pid = -1; @@ -160,15 +160,17 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtOpenKFD(void) if (result != HSAKMT_STATUS_SUCCESS) goto open_failed; - fd = open(kfd_device_name, O_RDWR | O_CLOEXEC); + if (kfd_fd < 0) { + fd = open(kfd_device_name, O_RDWR | O_CLOEXEC); - if (fd == -1) { - result = HSAKMT_STATUS_KERNEL_IO_CHANNEL_NOT_OPENED; - goto open_failed; + if (fd == -1) { + result = HSAKMT_STATUS_KERNEL_IO_CHANNEL_NOT_OPENED; + goto open_failed; + } + + kfd_fd = fd; } - kfd_fd = fd; - init_page_size(); result = init_kfd_version(); @@ -223,10 +225,6 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtCloseKFD(void) if (--kfd_open_count == 0) { destroy_counter_props(); destroy_device_debugging_memory(); - if (kfd_fd) { - close(kfd_fd); - kfd_fd = 0; - } } result = HSAKMT_STATUS_SUCCESS;