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:
Flora Cui
2024-09-26 17:23:03 +08:00
revīziju iesūtīja Frank Min
vecāks 55fc454b9d
revīzija 7a67eb90e2
2 mainīti faili ar 7 papildinājumiem un 1 dzēšanām
+1
Parādīt failu
@@ -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
Parādīt failu
@@ -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_;
}