已开启
ffrt_dump when FFTS limit submit #1177
ffrt_dump when FFTS limit submit #1177
已开启
wenxingqi创建于 6 天前
5 个文件变更+51-6
@@ -42,6 +42,7 @@ static inline void BboxCheckAndFreeze(void)
42 42 
43bool FFRTIsWork(void);43bool FFRTIsWork(void);
44void RecordDebugInfo(void);44void RecordDebugInfo(void);
45+void SaveFFTSBbox(void);
45 46 
46std::string GetDumpPreface(void);47std::string GetDumpPreface(void);
47#ifdef FFRT_CO_BACKTRACE_OH_ENABLE48#ifdef FFRT_CO_BACKTRACE_OH_ENABLE
@@ -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_STAT27+ DUMP_STOP_STAT,
28+ DUMP_FFTS_RESOURCE_EXCEED
28} ffrt_dump_cmd_t;29} ffrt_dump_cmd_t;
29 30 
30typedef struct ffrt_stat {31typedef 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 
212static void DumpQueueTask(const char* tag, const std::vector<QueueTask*>& tasks,221static 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+#if (FFRT_TRACE_RECORD_LEVEL >= FFRT_TRACE_RECORD_LEVEL_2)
427+ SaveTaskCounter();
428+#endif
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+ 
413static void ResendSignal(siginfo_t* info)439static 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_succ59 * 测试用例名称 :dump_succ
47 * 测试用例描述:获取dump info失败60 * 测试用例描述:获取dump info失败