Skip to content

Commit

Permalink
Merge Pull Request #2341 from plafratt/sst-elements/issue-fix-2319
Browse files Browse the repository at this point in the history
Automatically Merged using SST Pull Request AutoTester
PR Title: b'Update futex wake to wake multiple waiters.'
PR Author: plafratt
  • Loading branch information
sst-autotester committed Mar 28, 2024
2 parents 8fd0854 + 0a6cc98 commit d900a0c
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 17 deletions.
71 changes: 54 additions & 17 deletions src/sst/elements/vanadis/os/syscall/futex.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
#include <sst_config.h>

#include "os/syscall/futex.h"
#include "os/callev/voscallfutex.h"
#include "os/vnodeos.h"
#include "os/voscallev.h"

#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
Expand Down Expand Up @@ -58,7 +60,7 @@ VanadisFutexSyscall::VanadisFutexSyscall( VanadisNodeOSComponent* os, SST::Link*
{
m_output->verbose(CALL_INFO, 2, VANADIS_OS_DBG_SYSCALL,
"[syscall-futex] addr=%#" PRIx64 " op=%#x val=%#" PRIx32 " timeAddr=%#" PRIx64 " callStackAddr=%#" PRIx64
" addr2=%#" PRIx64 " val3=%#x, \n",
" addr2=%#" PRIx64 " val3=%#x, \n",
event->getAddr(), event->getOp(), event->getVal(), event->getTimeAddr(), event->getStackPtr(), event->getAddr2(), event->getVal3() );

m_op = event->getOp();
Expand All @@ -77,22 +79,7 @@ VanadisFutexSyscall::VanadisFutexSyscall( VanadisNodeOSComponent* os, SST::Link*
switch ( m_op ) {
case FUTEX_WAKE:
{
m_output->verbose(CALL_INFO, 3, VANADIS_OS_DBG_SYSCALL,
"[syscall-futex] FUTEX_WAKE tid=%d addr=%#" PRIx64 "\n", process->gettid(), event->getAddr());

VanadisSyscall* syscall = m_process->findFutex( event->getAddr() );
if ( syscall ) {
m_output->verbose(CALL_INFO, 3, VANADIS_OS_DBG_SYSCALL,
"[syscall-futex] FUTEX_WAKE tid=%d addr=%#" PRIx64 " found waiter, wakeup tid=%d\n",
process->gettid(), event->getAddr(),syscall->getTid());
dynamic_cast<VanadisFutexSyscall*>( syscall )->wakeup();
delete syscall;
setReturnSuccess(1);
} else {
m_output->verbose(CALL_INFO, 3, VANADIS_OS_DBG_SYSCALL,
"[syscall-futex] FUTEX_WAKE tid=%d addr=%#" PRIx64 " no waiter\n", process->gettid(), event->getAddr());
setReturnSuccess(0);
}
futexWake(event);
} break;

case FUTEX_WAIT_BITSET:
Expand Down Expand Up @@ -134,6 +121,56 @@ VanadisFutexSyscall::VanadisFutexSyscall( VanadisNodeOSComponent* os, SST::Link*
}
}

void VanadisFutexSyscall::wakeWaiter(VanadisSyscallFutexEvent* event) const
{
auto syscall = m_process->findFutex(event->getAddr());
if( !syscall )
{
m_output->fatal(CALL_INFO, 1, "syscall should not be null here. "
"wakeWaiter() should not be called when no threads are waiting.\n");
}
m_output->verbose(CALL_INFO, 3, VANADIS_OS_DBG_SYSCALL,
"[syscall-futex] FUTEX_WAKE tid=%d addr=%#" PRIx64 " found waiter, wakeup tid=%d\n",
m_process->gettid(), event->getAddr(),syscall->getTid());
dynamic_cast<VanadisFutexSyscall*>( syscall )->wakeup();
delete syscall;
}

int VanadisFutexSyscall::getNumWaitersToWake(VanadisSyscallFutexEvent* event) const
{
uint32_t numWaiters = m_process->futexGetNumWaiters(event->getAddr());
uint32_t numWaitersToWake = std::min(numWaiters, event->getVal());
if( numWaiters == 0 )
{
m_output->verbose(CALL_INFO, 3, VANADIS_OS_DBG_SYSCALL,
"[syscall-futex] FUTEX_WAKE tid=%d addr=%#" PRIx64 " no waiter\n", m_process->gettid(), event->getAddr());
}
else
{
m_output->verbose(CALL_INFO, 3, VANADIS_OS_DBG_SYSCALL,
"[syscall-futex] FUTEX_WAKE tid=%d addr=%#" PRIx64 " %u waiters, "
" val is %u, will wake %u threads \n",
m_process->gettid(), event->getAddr(), numWaiters, event->getVal(), numWaitersToWake);

}
return numWaitersToWake;
}

int VanadisFutexSyscall::wakeWaiters(VanadisSyscallFutexEvent* event) const
{
auto numWaiters = getNumWaitersToWake(event);
for(int curWaiter=0;curWaiter<numWaiters;curWaiter++)
{
wakeWaiter(event);
}
return numWaiters;
}

void VanadisFutexSyscall::futexWake(VanadisSyscallFutexEvent* event)
{
setReturnSuccess(wakeWaiters(event));
}

void VanadisFutexSyscall::wakeup()
{
m_output->verbose(CALL_INFO, 3, VANADIS_OS_DBG_SYSCALL, "[syscall-futex] FUTEX_WAIT tid=%d wakeup \n",m_process->gettid());
Expand Down
5 changes: 5 additions & 0 deletions src/sst/elements/vanadis/os/syscall/futex.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ class VanadisFutexSyscall : public VanadisSyscall {
int m_op;
std::vector<uint8_t> m_buffer;
int m_numWokeup;

void futexWake(VanadisSyscallFutexEvent* event);
int wakeWaiters(VanadisSyscallFutexEvent* event) const;
void wakeWaiter(VanadisSyscallFutexEvent* event) const;
int getNumWaitersToWake(VanadisSyscallFutexEvent* event) const;
};

} // namespace Vanadis
Expand Down

0 comments on commit d900a0c

Please sign in to comment.