HSAKMT_STATUS HSAKMTAPI hsaKmtOpenKFD(void) { HSAKMT_STATUS result; pthread_mutex_lock(&hsakmt_mutex); if (kfd_open_count == 0) { int fd = open(kfd_device_name, O_RDWR | O_CLOEXEC); if (fd != -1) { kfd_fd = fd; kfd_open_count = 1; result = fmm_init_process_apertures(); if (result != HSAKMT_STATUS_SUCCESS) close(fd); } else { result = HSAKMT_STATUS_KERNEL_IO_CHANNEL_NOT_OPENED; } amd_hsa_thunk_lock_fd = open(tmp_file, O_CREAT | //create the file if it's not present. O_RDWR, //only need write access for the internal locking semantics. S_IRUSR | S_IWUSR); //permissions on the file, 600 here. } else { kfd_open_count++; result = HSAKMT_STATUS_SUCCESS; } pthread_mutex_unlock(&hsakmt_mutex); return result; }
HSAKMT_STATUS HSAKMTAPI hsaKmtOpenKFD(void) { HSAKMT_STATUS result; int fd; HsaSystemProperties sys_props; pthread_mutex_lock(&hsakmt_mutex); if (kfd_open_count == 0) { fd = open(kfd_device_name, O_RDWR | O_CLOEXEC); if (fd != -1) { kfd_fd = fd; kfd_open_count = 1; } else { result = HSAKMT_STATUS_KERNEL_IO_CHANNEL_NOT_OPENED; goto open_failed; } result = topology_sysfs_get_system_props(&sys_props); if (result != HSAKMT_STATUS_SUCCESS) goto topology_sysfs_failed; result = fmm_init_process_apertures(sys_props.NumNodes); if (result != HSAKMT_STATUS_SUCCESS) goto init_process_aperture_failed; result = init_process_doorbells(sys_props.NumNodes); if (result != HSAKMT_STATUS_SUCCESS) goto init_doorbell_failed; if (init_device_debugging_memory(sys_props.NumNodes) != HSAKMT_STATUS_SUCCESS) printf("Insufficient Memory. Debugging unavailable\n"); if (init_counter_props(sys_props.NumNodes) != HSAKMT_STATUS_SUCCESS) printf("Insufficient Memory. Performance Counter information unavailable\n"); amd_hsa_thunk_lock_fd = open(tmp_file, O_CREAT | //create the file if it's not present. O_RDWR, //only need write access for the internal locking semantics. S_IRUSR | S_IWUSR); //permissions on the file, 600 here. } else { kfd_open_count++; result = HSAKMT_STATUS_SUCCESS; } pthread_mutex_unlock(&hsakmt_mutex); return result; init_doorbell_failed: fmm_destroy_process_apertures(); init_process_aperture_failed: topology_sysfs_failed: close(fd); open_failed: pthread_mutex_unlock(&hsakmt_mutex); return result; }