Compare commits

...

2 Commits

Author SHA1 Message Date
Bananymous 62f6128ba1 Kernel: Cleanup NVMe Queue command submission
There is techically a race condition on thread sleep and checking
done mask. This patch allows read to success even if this race
condition is hit, although the full timeout has to be waited.

This can be fixed in future with some sort of wait queues that
can properly handle this race condition.
2024-03-19 13:01:27 +02:00
Bananymous 7f5c850744 Userspace: Add us keymap and make it default 2024-03-19 12:30:57 +02:00
3 changed files with 13 additions and 17 deletions

Binary file not shown.

View File

@ -67,25 +67,21 @@ namespace Kernel
}
const uint64_t start_time = SystemTimer::get().ms_since_boot();
while (SystemTimer::get().ms_since_boot() < start_time + s_nvme_command_poll_timeout_ms)
{
if (m_done_mask & cid_mask)
{
uint16_t status = m_status_codes[cid];
m_used_mask &= ~cid_mask;
return status;
}
}
while (!(m_done_mask & cid_mask) && SystemTimer::get().ms_since_boot() < start_time + s_nvme_command_poll_timeout_ms)
continue;
// FIXME: Here is a possible race condition if done mask is set before
// scheduler has put the current thread blocking.
// EINTR should also be handled here.
while (!(m_done_mask & cid_mask) && SystemTimer::get().ms_since_boot() < start_time + s_nvme_command_timeout_ms)
Scheduler::get().block_current_thread(&m_semaphore, start_time + s_nvme_command_timeout_ms);
while (SystemTimer::get().ms_since_boot() < start_time + s_nvme_command_timeout_ms)
{
if (m_done_mask & cid_mask)
{
uint16_t status = m_status_codes[cid];
m_used_mask &= ~cid_mask;
return status;
}
}
m_used_mask &= ~cid_mask;
return 0xFFFF;

View File

@ -27,7 +27,7 @@ int main()
if (signal(SIGINT, [](int) {}) == SIG_ERR)
perror("signal");
if (load_keymap("/usr/share/keymaps/fi.keymap") == -1)
if (load_keymap("/usr/share/keymaps/us.keymap") == -1)
perror("load_keymap");
if (fork() == 0)