wsl/hsakmt: add lock for sdma packet processing
Suggested-by: Shane Xiao <shane.xiao@amd.com> Signed-off-by: Flora Cui <flora.cui@amd.com> Reviewed-by: Shane Xiao <shane.xiao@amd.com> Reviewed-by: Shi.Leslie <Yuliang.Shi@amd.com> Part-of: <http://10.67.69.192/wsl/libhsakmt/-/merge_requests/31>
Šī revīzija ir iekļauta:
revīziju iesūtīja
Frank Min
vecāks
55fc454b9d
revīzija
7a67eb90e2
@@ -285,6 +285,7 @@ private:
|
||||
uint64_t rptr_next;
|
||||
uint64_t doorbell_;
|
||||
std::queue<std::pair<uint64_t, uint64_t>> wptr_queue_;
|
||||
std::mutex wptr_queue_lock_;
|
||||
uint64_t ib_size;
|
||||
uint64_t ib_start_addr;
|
||||
|
||||
|
||||
+6
-1
@@ -989,9 +989,11 @@ void SDMAQueue::SdmaThread(SDMAQueue *queue) {
|
||||
|
||||
while (true) {
|
||||
if (!queue->wptr_queue_.empty()) {
|
||||
std::unique_lock<std::mutex> lock(queue->wptr_queue_lock_);
|
||||
uint64_t start = queue->wptr_queue_.front().first;
|
||||
uint64_t end = queue->wptr_queue_.front().second;
|
||||
queue->wptr_queue_.pop();
|
||||
lock.unlock();
|
||||
debug_print("SDMA: wptr %lx %lx\n", start, end);
|
||||
|
||||
SDMA_PKT_POLL_REGMEM* poll_pkt = reinterpret_cast<SDMA_PKT_POLL_REGMEM*>(queue->cmdbuf_addr + queue->WrapIntoRocrRing(start));
|
||||
@@ -1081,7 +1083,10 @@ SDMAQueue::~SDMAQueue() {
|
||||
void SDMAQueue::RingDoorbell() {
|
||||
debug_print("SDMA: ringdoorbell %#llx %#llx\n", wptr_pre_, wptr_next_);
|
||||
|
||||
wptr_queue_.emplace(wptr_pre_, wptr_next_);
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(wptr_queue_lock_);
|
||||
wptr_queue_.emplace(wptr_pre_, wptr_next_);
|
||||
}
|
||||
thread_cond_.notify_one();
|
||||
wptr_pre_ = wptr_next_;
|
||||
}
|
||||
|
||||
Atsaukties uz šo jaunā problēmā
Block a user