KThread: Send termination interrupt to all cores a thread has affinity to
KThread::RequestTerminate may run from a thread which is not the CurrentCore, and thus masking this out is erroneous.
This commit is contained in:
		@@ -1258,11 +1258,11 @@ ThreadState KThread::RequestTerminate() {
 | 
				
			|||||||
        // Change the thread's priority to be higher than any system thread's.
 | 
					        // Change the thread's priority to be higher than any system thread's.
 | 
				
			||||||
        this->IncreaseBasePriority(TerminatingThreadPriority);
 | 
					        this->IncreaseBasePriority(TerminatingThreadPriority);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // If the thread is runnable, send a termination interrupt to other cores.
 | 
					        // If the thread is runnable, send a termination interrupt to cores it may be running on.
 | 
				
			||||||
        if (this->GetState() == ThreadState::Runnable) {
 | 
					        if (this->GetState() == ThreadState::Runnable) {
 | 
				
			||||||
            if (const u64 core_mask = m_physical_affinity_mask.GetAffinityMask() &
 | 
					            // NOTE: We do not mask the "current core", because this code may not actually be
 | 
				
			||||||
                                      ~(1ULL << GetCurrentCoreId(m_kernel));
 | 
					            //       executing from the thread representing the "current core".
 | 
				
			||||||
                core_mask != 0) {
 | 
					            if (const u64 core_mask = m_physical_affinity_mask.GetAffinityMask(); core_mask != 0) {
 | 
				
			||||||
                Kernel::KInterruptManager::SendInterProcessorInterrupt(m_kernel, core_mask);
 | 
					                Kernel::KInterruptManager::SendInterProcessorInterrupt(m_kernel, core_mask);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user