1 /* 2 * Copyright 2019 Google LLC 3 * SPDX-License-Identifier: MIT 4 * 5 * based in part on anv and radv which are: 6 * Copyright 2015 Intel Corporation 7 * Copyright 2016 Red Hat. 8 * Copyright 2016 Bas Nieuwenhuizen 9 */ 10 11 #include "vn_common.h" 12 13 #include <stdarg.h> 14 15 #include "util/debug.h" 16 #include "util/log.h" 17 #include "util/os_misc.h" 18 #include "vk_enum_to_str.h" 19 20 static const struct debug_control vn_debug_options[] = { 21 { "init", VN_DEBUG_INIT }, 22 { "result", VN_DEBUG_RESULT }, 23 { "vtest", VN_DEBUG_VTEST }, 24 { "wsi", VN_DEBUG_WSI }, 25 { NULL, 0 }, 26 }; 27 28 uint64_t vn_debug; 29 30 static void 31 vn_debug_init_once(void) 32 { 33 vn_debug = parse_debug_string(os_get_option("VN_DEBUG"), vn_debug_options); 34 } 35 36 void 37 vn_debug_init(void) 38 { 39 static once_flag once = ONCE_FLAG_INIT; 40 call_once(&once, vn_debug_init_once); 41 } 42 43 void 44 vn_trace_init(void) 45 { 46 #ifdef ANDROID 47 atrace_init(); 48 #endif 49 } 50 51 void 52 vn_log(struct vn_instance *instance, const char *format, ...) 53 { 54 va_list ap; 55 56 va_start(ap, format); 57 mesa_log_v(MESA_LOG_DEBUG, "MESA-VIRTIO", format, ap); 58 va_end(ap); 59 60 /* instance may be NULL or partially initialized */ 61 } 62 63 VkResult 64 vn_log_result(struct vn_instance *instance, 65 VkResult result, 66 const char *where) 67 { 68 vn_log(instance, "%s: %s", where, vk_Result_to_str(result)); 69 return result; 70 } 71 72 void 73 vn_relax(uint32_t *iter, const char *reason) 74 { 75 /* Yield for the first 2^busy_wait_order times and then sleep for 76 * base_sleep_us microseconds for the same number of times. After that, 77 * keep doubling both sleep length and count. 78 */ 79 const uint32_t busy_wait_order = 4; 80 const uint32_t base_sleep_us = 10; 81 const uint32_t warn_order = 12; 82 83 (*iter)++; 84 if (*iter < (1 << busy_wait_order)) { 85 thrd_yield(); 86 return; 87 } 88 89 /* warn occasionally if we have slept at least 1.28ms for 2048 times (plus 90 * another 2047 shorter sleeps) 91 */ 92 if (unlikely(*iter % (1 << warn_order) == 0)) 93 vn_log(NULL, "stuck in %s wait with iter at %d", reason, *iter); 94 95 const uint32_t shift = util_last_bit(*iter) - busy_wait_order - 1; 96 os_time_sleep(base_sleep_us << shift); 97 } 98