Line data Source code
1 : /**
2 : * Copyright (c) 2025 Huawei Technologies Co., Ltd.
3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4 : * CANN Open Software License Agreement Version 2.0 (the "License").
5 : * Please refer to the License for details. You may not use this file except in compliance with the License.
6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8 : * See LICENSE in the root of the software repository for the full text of the License.
9 : */
10 :
11 : #include "trace_attr.h"
12 : #include "adiag_print.h"
13 : #include "adiag_utils.h"
14 : #include "trace_driver_api.h"
15 : #include "trace_system_api.h"
16 :
17 : #define DEFAULT_ENV_TIMEOUT 0 // timeout default is 0
18 : #define MAX_ENV_TIMEOUT (3 * 60 * 1000) // max timeout 180s
19 :
20 : STATIC TraceInnerAttr g_traceAttr = { 0 };
21 :
22 1670 : STATIC void TraceAttrPlatformInit(void)
23 : {
24 1670 : g_traceAttr.systemAttr.platform = PLATFORM_INVALID_VALUE;
25 1670 : TraStatus ret = TraceDriverInit();
26 1670 : if (ret != TRACE_SUCCESS) {
27 40 : return;
28 : }
29 :
30 1650 : uint32_t platform = PLATFORM_INVALID_VALUE;
31 1650 : ret = TraceDrvGetPlatformInfo(&platform);
32 1650 : if (ret != TRACE_SUCCESS) {
33 0 : return;
34 : }
35 :
36 1650 : uint32_t devNum = 0;
37 1650 : ret = TraceDrvGetDevNum(&devNum);
38 1650 : if (ret != TRACE_SUCCESS) {
39 20 : return;
40 : }
41 :
42 1630 : if ((platform == PLATFORM_HOST_SIDE) && (devNum != 0)) {
43 1590 : g_traceAttr.systemAttr.platform = PLATFORM_HOST_SIDE; // EP host
44 : } else {
45 40 : g_traceAttr.systemAttr.platform = platform;
46 : }
47 : }
48 :
49 : #ifdef ATRACE_API
50 1317531 : STATIC uint32_t TraceAttrGetPlatform(void)
51 : {
52 1317531 : return g_traceAttr.systemAttr.platform;
53 : }
54 : #endif
55 :
56 : /**
57 : * @brief check atrace is supported or not
58 : * @return true for support, false for not support
59 : */
60 1317506 : bool AtraceCheckSupported(void)
61 : {
62 : #ifdef ATRACE_API
63 1317451 : if (TraceAttrGetPlatform() != PLATFORM_HOST_SIDE) {
64 140 : return false;
65 : }
66 : #endif
67 1317366 : return true;
68 : }
69 :
70 1590 : STATIC TraStatus TraceAttrIdInit(void)
71 : {
72 1590 : g_traceAttr.systemAttr.pid = getpid();
73 1590 : uint32_t uid = getuid();
74 1590 : const struct passwd *userInfo = getpwuid(uid);
75 1590 : if (userInfo != NULL) {
76 1570 : g_traceAttr.systemAttr.uid = userInfo->pw_uid;
77 1570 : g_traceAttr.systemAttr.gid = userInfo->pw_gid;
78 1570 : g_traceAttr.systemAttr.pgid = getpgrp();
79 1570 : return TRACE_SUCCESS;
80 : }
81 20 : ADIAG_ERR("get uid and gid failed, uid=%u, strerr=%s.", uid, strerror(AdiagGetErrorCode()));
82 20 : return TRACE_FAILURE;
83 : }
84 :
85 1570 : STATIC TraStatus TraceAttrTimeInit(void)
86 : {
87 1570 : AdiagStatus ret = TraceTimeDstInit();
88 1570 : ADIAG_CHK_EXPR_ACTION(ret != ADIAG_SUCCESS, return TRACE_FAILURE, "init time DST failed, ret=%d.", ret);
89 1550 : ret = TimestampToFileStr(GetRealTime(), g_traceAttr.systemAttr.timeStamp, TIMESTAMP_MAX_LENGTH);
90 1550 : ADIAG_CHK_EXPR_ACTION(ret != ADIAG_SUCCESS, return TRACE_FAILURE, "get timestamp string failed, ret=%d.", ret);
91 1550 : return TRACE_SUCCESS;
92 : }
93 :
94 1550 : STATIC void TraceAttrEnvInit(void)
95 : {
96 1550 : g_traceAttr.systemAttr.envTimeout = DEFAULT_ENV_TIMEOUT;
97 1550 : const char *env = NULL;
98 1550 : MM_SYS_GET_ENV(MM_ENV_ASCEND_LOG_DEVICE_FLUSH_TIMEOUT, (env));
99 1550 : if (env == NULL) {
100 1450 : ADIAG_INF("doesn't set env ASCEND_LOG_DEVICE_FLUSH_TIMEOUT, use default timeout=%dms.", g_traceAttr.systemAttr.envTimeout);
101 1450 : return;
102 : }
103 :
104 100 : int32_t value = -1;
105 100 : if ((AdiagStrToInt(env, &value) == TRACE_SUCCESS) && (value <= MAX_ENV_TIMEOUT) && (value >= 0)) {
106 40 : ADIAG_INF("set timeout %dms by env ASCEND_LOG_DEVICE_FLUSH_TIMEOUT.", g_traceAttr.systemAttr.envTimeout);
107 40 : g_traceAttr.systemAttr.envTimeout = value;
108 : } else {
109 60 : ADIAG_WAR("env ASCEND_LOG_DEVICE_FLUSH_TIMEOUT is invalid, use default timeout=%dms.", g_traceAttr.systemAttr.envTimeout);
110 : }
111 : }
112 :
113 280 : int32_t TraceGetTimeout(void)
114 : {
115 280 : return g_traceAttr.systemAttr.envTimeout;
116 : }
117 :
118 8733 : int32_t TraceAttrGetPid(void)
119 : {
120 8733 : return g_traceAttr.systemAttr.pid;
121 : }
122 :
123 8718 : int32_t TraceAttrGetPgid(void)
124 : {
125 8718 : return g_traceAttr.systemAttr.pgid;
126 : }
127 :
128 8718 : const char *TraceAttrGetTime(void)
129 : {
130 8718 : return (const char *)g_traceAttr.systemAttr.timeStamp;
131 : }
132 :
133 16204 : uint32_t TraceAttrGetUid(void)
134 : {
135 16204 : return g_traceAttr.systemAttr.uid;
136 : }
137 :
138 16204 : uint32_t TraceAttrGetGid(void)
139 : {
140 16204 : return g_traceAttr.systemAttr.gid;
141 : }
142 :
143 27 : TraStatus TraceSetGlobalAttr(const TraceGlobalAttr *attr)
144 : {
145 27 : if (attr == NULL) {
146 0 : return TRACE_FAILURE;
147 : }
148 27 : g_traceAttr.userAttr.saveMode = attr->saveMode;
149 27 : g_traceAttr.userAttr.deviceId = attr->deviceId;
150 27 : g_traceAttr.userAttr.pid = attr->pid;
151 27 : ADIAG_INF("set global attr successfully, saveMode=%u, device id=%u, pid=%u.", attr->saveMode, attr->deviceId, attr->pid);
152 27 : return TRACE_SUCCESS;
153 : }
154 :
155 35 : uint8_t TraceAttrGetSaveMode(void)
156 : {
157 35 : return g_traceAttr.userAttr.saveMode;
158 : }
159 :
160 44 : uint8_t TraceAttrGetGlobalDevId(void)
161 : {
162 44 : return g_traceAttr.userAttr.deviceId;
163 : }
164 :
165 35 : uint32_t TraceAttrGetGlobalPid(void)
166 : {
167 35 : return g_traceAttr.userAttr.pid;
168 : }
169 :
170 1670 : TraStatus TraceAttrInit(void)
171 : {
172 1670 : TraceAttrPlatformInit();
173 :
174 1670 : if (!AtraceCheckSupported()) {
175 80 : return TRACE_SUCCESS;
176 : }
177 1590 : TraStatus ret = TraceAttrIdInit();
178 1590 : if (ret != TRACE_SUCCESS) {
179 20 : ADIAG_ERR("init attr id failed.");
180 20 : return TRACE_FAILURE;
181 : }
182 :
183 1570 : ret = TraceAttrTimeInit();
184 1570 : if (ret != TRACE_SUCCESS) {
185 20 : ADIAG_ERR("init attr time failed.");
186 20 : return TRACE_FAILURE;
187 : }
188 :
189 1550 : TraceAttrEnvInit();
190 1550 : ADIAG_INF("attr init successfully, timeout=%dms.", g_traceAttr.systemAttr.envTimeout);
191 1550 : return TRACE_SUCCESS;
192 : }
193 :
194 1620 : void TraceAttrExit(void)
195 : {
196 1620 : TraceDriverExit();
197 1620 : }
|