diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 955f50a9b..47d4df69c 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -32,19 +32,6 @@ void WaitObject::RemoveWaitingThread(Thread* thread) {
 }
 
 SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
-    // Remove the threads that are ready or already running from our waitlist
-    auto to_remove = waiting_threads.end();
-    do {
-        to_remove = std::find_if(waiting_threads.begin(), waiting_threads.end(),
-                                 [](const SharedPtr<Thread>& thread) {
-                                    return thread->status == THREADSTATUS_RUNNING ||
-                                           thread->status == THREADSTATUS_READY ||
-                                           thread->status == THREADSTATUS_DEAD;
-        });
-        // Call RemoveWaitingThread so that child classes can override the behavior.
-        RemoveWaitingThread(to_remove->get());
-    } while (to_remove != waiting_threads.end());
-
     Thread* candidate = nullptr;
     s32 candidate_priority = THREADPRIO_LOWEST + 1;
 
@@ -86,17 +73,16 @@ void WaitObject::WakeupAllWaitingThreads() {
         } else {
             for (auto& object : thread->wait_objects) {
                 object->Acquire(thread.get());
-                object->RemoveWaitingThread(thread.get());
             }
             // Note: This case doesn't update the output index of WaitSynchronizationN.
-            // Clear the thread's waitlist
-            thread->wait_objects.clear();
         }
 
+        for (auto& object : thread->wait_objects)
+            object->RemoveWaitingThread(thread.get());
+        thread->wait_objects.clear();
+
         thread->SetWaitSynchronizationResult(RESULT_SUCCESS);
         thread->ResumeFromWait();
-        // Note: Removing the thread from the object's waitlist will be
-        // done by GetHighestPriorityReadyThread.
     }
 }