已开启
ffrt_dump when FFTS limit submit #1177
wenxingqi创建于 6 天前
ffrt_dump when FFTS limit submit #1177
已开启
共 5 个文件变更+51-6
| @@ -42,6 +42,7 @@ static inline void BboxCheckAndFreeze(void) | |||
| 42 | 42 | ||
| 43 | bool FFRTIsWork(void); | 43 | bool FFRTIsWork(void); |
| 44 | void RecordDebugInfo(void); | 44 | void RecordDebugInfo(void); |
| 45 | +void SaveFFTSBbox(void); | ||
| 45 | 46 | ||
| 46 | std::string GetDumpPreface(void); | 47 | std::string GetDumpPreface(void); |
| 47 | 48 | ||
| @@ -24,7 +24,8 @@ typedef enum { | |||
| 24 | DUMP_INFO_ALL = 0, | 24 | DUMP_INFO_ALL = 0, |
| 25 | DUMP_TASK_STATISTIC_INFO, | 25 | DUMP_TASK_STATISTIC_INFO, |
| 26 | DUMP_START_STAT, | 26 | DUMP_START_STAT, |
| 27 | - DUMP_STOP_STAT | 27 | + DUMP_STOP_STAT, |
| 28 | + DUMP_FFTS_RESOURCE_EXCEED | ||
| 28 | } ffrt_dump_cmd_t; | 29 | } ffrt_dump_cmd_t; |
| 29 | 30 | ||
| 30 | typedef struct ffrt_stat { | 31 | typedef struct ffrt_stat { |
| @@ -172,8 +172,17 @@ static inline void SaveNormalTaskStatus() | |||
| 172 | size_t idx = 1; | 172 | size_t idx = 1; |
| 173 | for (auto t : tmp) { | 173 | for (auto t : tmp) { |
| 174 | if (t->type == ffrt_normal_task) { | 174 | if (t->type == ffrt_normal_task) { |
| 175 | - FFRT_BBOX_LOG("<%zu/%zu> id %llu qos %d name %s", idx, | 175 | + auto inHandles = std::as_const(t->GetInHandles()); |
| 176 | - tmp.size(), t->gid, t->qos_(), t->GetLabel().c_str()); | 176 | + std::string inGids; |
| 177 | + for (auto in : inHandles) { | ||
| 178 | + if (!inGids.empty()) { | ||
| 179 | + inGids += ","; | ||
| 180 | + } | ||
| 181 | + inGids += std::to_string(in->gid); | ||
| 182 | + } | ||
| 183 | + // idx/all gid-qos:name[in1,in2...] | ||
| 184 | + FFRT_BBOX_LOG("%zu/%zu %llu-%d:%s[%s]", idx, | ||
| 185 | + tmp.size(), t->gid, t->qos_(), t->GetLabel().c_str(), inGids.c_str()); | ||
| 177 | idx++; | 186 | idx++; |
| 178 | } | 187 | } |
| 179 | if (t->coRoutine && (t->coRoutine->status.load() == static_cast<int>(CoStatus::CO_NOT_FINISH)) && | 188 | if (t->coRoutine && (t->coRoutine->status.load() == static_cast<int>(CoStatus::CO_NOT_FINISH)) && |
| @@ -192,9 +201,6 @@ static inline void SaveNormalTaskStatus() | |||
| 192 | }; | 201 | }; |
| 193 | // Do not dump tasks marked with a final status (e.g., FINISH or CANCELED), | 202 | // Do not dump tasks marked with a final status (e.g., FINISH or CANCELED), |
| 194 | // as they may be allocated by another submit and not initialized yet. | 203 | // as they may be allocated by another submit and not initialized yet. |
| 195 | - apply("pending task", [](CPUEUTask* t) { | ||
| 196 | - return t->curStatus == TaskStatus::SUBMITTED; | ||
| 197 | - }); | ||
| 198 | apply("ready task", [](CPUEUTask* t) { | 204 | apply("ready task", [](CPUEUTask* t) { |
| 199 | return t->curStatus == TaskStatus::READY; | 205 | return t->curStatus == TaskStatus::READY; |
| 200 | }); | 206 | }); |
| @@ -207,6 +213,9 @@ static inline void SaveNormalTaskStatus() | |||
| 207 | apply("blocked by synchronization primitive(mutex etc) or wait dependence", [](CPUEUTask* t) { | 213 | apply("blocked by synchronization primitive(mutex etc) or wait dependence", [](CPUEUTask* t) { |
| 208 | return (t->curStatus == TaskStatus::THREAD_BLOCK) || (t->curStatus == TaskStatus::COROUTINE_BLOCK); | 214 | return (t->curStatus == TaskStatus::THREAD_BLOCK) || (t->curStatus == TaskStatus::COROUTINE_BLOCK); |
| 209 | }); | 215 | }); |
| 216 | + apply("pending task", [](CPUEUTask* t) { | ||
| 217 | + return t->curStatus == TaskStatus::SUBMITTED; | ||
| 218 | + }); | ||
| 210 | } | 219 | } |
| 211 | 220 | ||
| 212 | static void DumpQueueTask(const char* tag, const std::vector<QueueTask*>& tasks, | 221 | static void DumpQueueTask(const char* tag, const std::vector<QueueTask*>& tasks, |
| @@ -410,6 +419,23 @@ void SaveTheBbox() | |||
| 410 | FFRT_BBOX_LOG("<<<=== ffrt black box(BBOX) finish ===>>>"); | 419 | FFRT_BBOX_LOG("<<<=== ffrt black box(BBOX) finish ===>>>"); |
| 411 | } | 420 | } |
| 412 | 421 | ||
| 422 | +void SaveFFTSBbox(void) | ||
| 423 | +{ | ||
| 424 | + FFRT_BBOX_LOG("<<<=== ffrt FFTS WaterLine BBOX start ===>>>"); | ||
| 425 | + SaveCurrent(); | ||
| 426 | + | ||
| 427 | + SaveTaskCounter(); | ||
| 428 | + | ||
| 429 | + SaveWorkerStatus(); | ||
| 430 | + if (getKeyStatus != nullptr) { | ||
| 431 | + getKeyStatus(); | ||
| 432 | + SaveKeyStatus(); | ||
| 433 | + } | ||
| 434 | + SaveNormalTaskStatus(); | ||
| 435 | + SaveTimeoutTask(); | ||
| 436 | + FFRT_BBOX_LOG("<<<=== ffrt FFTS WaterLine BBOX finish ===>>>"); | ||
| 437 | +} | ||
| 438 | + | ||
| 413 | static void ResendSignal(siginfo_t* info) | 439 | static void ResendSignal(siginfo_t* info) |
| 414 | { | 440 | { |
| 415 | syscall(SYS_rt_tgsigqueueinfo, getpid(), syscall(SYS_gettid), info->si_signo, info); | 441 | syscall(SYS_rt_tgsigqueueinfo, getpid(), syscall(SYS_gettid), info->si_signo, info); |
| @@ -174,6 +174,10 @@ int ffrt_dump(ffrt_dump_cmd_t cmd, char *buf, uint32_t len) | |||
| 174 | case DUMP_STOP_STAT: { | 174 | case DUMP_STOP_STAT: { |
| 175 | return ffrt::FFRTTraceRecord::StatsDisable(buf); | 175 | return ffrt::FFRTTraceRecord::StatsDisable(buf); |
| 176 | } | 176 | } |
| 177 | + case DUMP_FFTS_RESOURCE_EXCEED: { | ||
| 178 | + SaveFFTSBbox(); | ||
| 179 | + return 0; | ||
| 180 | + } | ||
| 177 | default: { | 181 | default: { |
| 178 | FFRT_LOGE("ffrt_dump unsupport cmd[%d]", cmd); | 182 | FFRT_LOGE("ffrt_dump unsupport cmd[%d]", cmd); |
| 179 | } | 183 | } |
| @@ -42,6 +42,19 @@ protected: | |||
| 42 | } | 42 | } |
| 43 | }; | 43 | }; |
| 44 | 44 | ||
| 45 | +/* | ||
| 46 | + * 测试用例名称 dump_ffts_succ | ||
| 47 | + * 测试用例描述:水线满时,获取当前硬件资源 | ||
| 48 | + * 操作步骤 :1、调用函数ffrt_dump获取ffts info | ||
| 49 | + * 预期结果 :获取成功 | ||
| 50 | + */ | ||
| 51 | +HWTEST_F(DumpTest, dump_ffts_succ, TestSize.Level1) | ||
| 52 | +{ | ||
| 53 | + char dumpinfo[1024 * 512] = {0}; | ||
| 54 | + int ret = ffrt_dump(ffrt_dump_cmd_t::DUMP_FFTS_RESOURCE_EXCEED, dumpinfo, 1024 * 512); | ||
| 55 | + EXPECT_EQ(ret, 0); | ||
| 56 | +} | ||
| 57 | + | ||
| 45 | /* | 58 | /* |
| 46 | * 测试用例名称 :dump_succ | 59 | * 测试用例名称 :dump_succ |
| 47 | * 测试用例描述:获取dump info失败 | 60 | * 测试用例描述:获取dump info失败 |