| 150 | } |
| 151 | |
| 152 | void AsyncXQueue::SetPreemptLevel(XPreemptLevel level) |
| 153 | { |
| 154 | XASSERT(level > kPreemptLevelUnknown && level < kPreemptLevelMax, |
| 155 | "invalid preempt level: %d", level); |
| 156 | // Dynamic level support of this AsyncXQueue depends on kHwQueue->SupportDynamicLevel(). |
| 157 | if (!this->GetFeatures(kQueueFeatureDynamicLevel)) { |
| 158 | XASSERT(level == level_, "AsyncXQueue does not support dynamic level"); |
| 159 | return; |
| 160 | } |
| 161 | if (level > kHwQueue->GetMaxSupportedLevel()) { |
| 162 | XWARN("preempt level %d is not supported by the HwQueue, " |
| 163 | "max supported level is %d", level, kHwQueue->GetMaxSupportedLevel()); |
| 164 | return; |
| 165 | } |
| 166 | // Not thread-safe (with Submit & Wait). |
| 167 | // TODO: change to thread-safe, because the level change may be triggered by scheduler or xcli. |
| 168 | this->WaitAll(); |
| 169 | kHwQueue->OnPreemptLevelChange(level); |
| 170 | launch_worker_->SetPreemptLevel(level); |
| 171 | level_ = level; |
| 172 | SchedAgent::SendEvent(std::make_shared<XQueueConfigUpdateEvent>(kHandle, kDevice, level_, |
| 173 | launch_worker_->GetThreshold(), launch_worker_->GetBatchSize())); |
| 174 | } |
| 175 | |
| 176 | void AsyncXQueue::SetLaunchConfig(int64_t threshold, int64_t batch_size) |
| 177 | { |
no test coverage detected