libhsakmt: Fix use of uninitialized variable
When is hsaKmtCreateQueue called first time for node doorbells[NodeId].size is initialized to zero in init_process_doorbells but used to calculate the doorbell offset. It works just by accident because doorbells[NodeId].size is uint32_t so -1 will be 0xFFFFFFFF which is zero extended into 0x00000000FFFFFFFF and it will work as long as mmap offset bits are not within lower 32 bits. Bug: https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface/issues/78 Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Change-Id: Ia791adfc51363d4704cb50fa4f01137b7dd48a75
Этот коммит содержится в:
+4
-4
@@ -654,16 +654,16 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtCreateQueue(HSAuint32 NodeId,
|
||||
q->queue_id = args.queue_id;
|
||||
|
||||
if (IS_SOC15(q->gfxv)) {
|
||||
HSAuint64 mask = DOORBELLS_PAGE_SIZE(DOORBELL_SIZE(q->gfxv)) - 1;
|
||||
|
||||
/* On SOC15 chips, the doorbell offset within the
|
||||
* doorbell page is included in the doorbell offset
|
||||
* returned by KFD. This allows CP queue doorbells to be
|
||||
* allocated dynamically (while SDMA queue doorbells fixed)
|
||||
* rather than based on the its process queue ID.
|
||||
*/
|
||||
doorbell_mmap_offset = args.doorbell_offset &
|
||||
~(HSAuint64)(doorbells[NodeId].size - 1);
|
||||
doorbell_offset = args.doorbell_offset &
|
||||
(doorbells[NodeId].size - 1);
|
||||
doorbell_mmap_offset = args.doorbell_offset & ~mask;
|
||||
doorbell_offset = args.doorbell_offset & mask;
|
||||
} else {
|
||||
/* On older chips, the doorbell offset within the
|
||||
* doorbell page is based on the queue ID.
|
||||
|
||||
Ссылка в новой задаче
Block a user