summaryrefslogtreecommitdiff
path: root/Kernel
AgeCommit message (Collapse)Author
2022-02-03Kernel: Protect FramebufferDevice with spinlock instead of mutexAndreas Kling
2022-02-03Kernel: Protect global device map with spinlock instead of mutxAndreas Kling
2022-02-03Kernel: Protect Inode's list of watchers with spinlock instead of mutexAndreas Kling
2022-02-03Kernel: Protect mounted filesystem list with spinlock instead of mutexAndreas Kling
2022-02-03Kernel: Protect network adapter list with spinlock instead of mutexAndreas Kling
2022-02-03Kernel: Protect PTYMultiplexer freelist with spinlock instead of mutexAndreas Kling
2022-02-03Kernel: Protect ARP table with spinlock instead of mutexAndreas Kling
2022-02-03Kernel: Convert OpenFileDescriptor from mutex to spinlockAndreas Kling
A mutex is useful when we need to be able to block the current thread until it's available. This is overkill for OpenFileDescriptor. First off, this patch wraps the main state member variables inside a SpinlockProtected<State> to enforce synchronized access. This also avoids "free locking" where figuring out which variables are guarded by which lock is left as an unamusing exercise for the reader. Then we remove mutex locking from the functions that simply call through to the underlying File or Inode, since those fields never change anyway, and the target objects perform their own synchronization.
2022-02-03Kernel: Move Spinlock lock/unlock functions out of lineAndreas Kling
I don't see why these have to be inlined everywhere in the kernel.
2022-02-02Kernel: Add polling support to NVMePankaj Raghav
Add polling support to NVMe so that it does not use interrupt to complete a IO but instead actively polls for completion. This probably is not very efficient in terms of CPU usage but it does not use interrupts to complete a IO which is beneficial at the moment as there is no MSI(X) support and it can reduce the latency of an IO in a very fast NVMe device. The NVMeQueue class has been made the base class for NVMeInterruptQueue and NVMePollQueue. The factory function `NVMeQueue::try_create` will return the appropriate queue to the controller based on the polling boot parameter. The polling mode can be enabled by adding an extra boot parameter: `nvme_poll`.
2022-02-02Kernel: Add conditional call to disable_irq in IRQHandler constructorPankaj Raghav
There is no use in calling disable_irq function in the IRQHandler constructor if irq was not registered before. So add a condition where we call disable_irq only if the irq was registered before.
2022-02-02Kernel: Add nvme_poll command line parametersPankaj Raghav
As we don't currently support MSI(X) interrupts, it could be an issue to boot on some newer hardware. NVMe devices support polling mode where the driver actively polls for completion instead of waiting for an interrupt.
2022-02-02Revert "Kernel: Only update page tables for faulting region"Andreas Kling
This reverts commit 1c5ffaae41be4e67f81b46c3bfdce7f54a1dc8e0. This broke shared memory as used by OutOfProcessWebView. Let's do a revert until we can figure out what went wrong.
2022-02-02Kernel: Only update page tables for faulting regionAndreas Kling
When a page fault led to the mapping of a new physical page, we were updating the page tables for *every* region that shared the same underlying VMObject. Let's just not do that, avoiding a bunch of unnecessary page table updates and TLB invalidations.
2022-01-30Kernel/Interrupts: Initialize two spurious handlers when PIC is disabledLiav A
Even if the PIC was disabled it can still generate noise (spurious IRQs) so we need to register two handlers for handling such cases. Also, we declare interrupt service routine offset 0x20 to 0x2f as reserved, so when the PIC is disabled, we can handle spurious IRQs from the PIC at separate handlers.
2022-01-30Kernel: Use a constexpr declaration for the disabled PIC IRQ baseLiav A
2022-01-30Kernel: Don't mark current thread as inactive after successful exec()Andreas Kling
At the end of sys$execve(), we perform a context switch from the old executable into the new executable. However, the Kernel::Thread object we are switching to is the *same* thread as the one we are switching from. So we must not assume the from_thread and to_thread are different threads. We had a bug caused by this misconception, where the "from" thread would always get marked as "inactive" when switching to a new thread. This meant that threads would always get switched into "inactive" mode on first context switch into them. If a thread then tried blocking on a kernel mutex within its first time slice, we'd end up in Thread::block(Mutex&) with an inactive thread. Once a thread is inactive, the scheduler believes it's okay to reactivate the thread (by scheduling it.) If a thread got re-scheduled prematurely while setting up a mutex block, things would fall apart and we'd crash in Thread::block() due to the thread state being "Runnable" instead of the expected "Running".
2022-01-30Kernel: Release page directory and MM locks sooner in space finalizationAndreas Kling
We don't need to hold these locks when tearing down the region tree. Release them as soon as unmapping is finished.
2022-01-30Kernel: Take scheduler lock before block lock in unblock_from_mutex()Andreas Kling
This matches the acquisition order used elsewhere.
2022-01-30Kernel: Remove unused bool return values from scheduler functionsAndreas Kling
Turns out nobody actually cared whether the scheduler switched to a new thread or not (which is what we were returning.)
2022-01-30Kernel: Simplify x86 IOPL sanity checkAndreas Kling
Move this architecture-specific sanity check (IOPL must be 0) out of Scheduler and into the x86 enter_thread_context(). Also do this for every thread and not just userspace ones.
2022-01-30Kernel: VERIFY that Scheduler::context_switch() always has a from-threadAndreas Kling
We always context_switch() from somewhere, so there's no need to handle the case where from_thread is null.
2022-01-30Kernel: Enforce that Thread::unblock_from_mutex() doesn't happen in IRQAndreas Kling
Mutexes are not usable from IRQ handlers, so unblock_from_mutex() can simply VERIFY() that the current processor is not in an IRQ.
2022-01-30Kernel: Update terminology around Thread's "blocking mutex"Andreas Kling
It's more accurate to say that we're blocking on a mutex, rather than blocking on a lock. The previous terminology made sense when this code was using something called Kernel::Lock, but since it was renamed to Kernel::Mutex, this updates brings the language back in sync.
2022-01-30Kernel: Make Thread::State an `enum class` and use it consistentlyAndreas Kling
It was annoyingly hard to spot these when we were using them with different amounts of qualification everywhere. This patch uses Thread::State::Foo everywhere instead of Thread::Foo or just Foo.
2022-01-30Kernel: Don't dispatch signals in Thread::block_impl()Andreas Kling
If the blocker is interrupted by a signal, that signal will be delivered to the process when returning to userspace (at the syscall exit point.) We don't have to perform the dispatch manually in Thread::block_impl().
2022-01-30Kernel: Don't dispatch signals in Processor::enter_current()Andreas Kling
Signal dispatch is already taken care of elsewhere, so there appears to be no need for the hack in enter_current(). This also allows us to remove the Thread::m_in_block flag, simplifying thread blocking logic somewhat. Verified with the original repro for #4336 which this was meant to fix.
2022-01-30Kernel: Remove unnecessary includes from Thread.hAndreas Kling
...and deal with the fallout by adding missing includes everywhere.
2022-01-30Kernel: Move Thread::block<BlockerType>() out of the Thread.h headerAndreas Kling
This function is large and unwieldy and forces Thread.h to #include a bunch of things. The only reason it was in the header is because we need to instantiate a blocker based on the templated BlockerType. We actually keep block<BlockerType>() in the header, but move the bulk of the function body out of line into Thread::block_impl(). To preserve destructor ordering, we add Blocker::finalize() which is called where we'd previously destroy the Blocker.
2022-01-30Kernel: Support PS/2 right super keyJelle Raaijmakers
We currently support the left super key. This poses an issue on keyboards that only have a right super key, such as my Steelseries 6G. The implementation mirrors the left/right shift key logic and effectively considers the right super key identical to the left one.
2022-01-29Kernel: Use HashCompatible HashMap lookups instead of specifying a hashIdan Horowitz
2022-01-29Kernel: Make {Nonnull,}OwnPtr<KString> hash compatible with StringViewIdan Horowitz
This will allow us to use KString as HashTable/HashMap keys more easily
2022-01-29Everywhere: Remove redundant inline keywordLenny Maiorani
`constexpr` implies `inline` so when both are used it is redundant.
2022-01-29Kernel: Stop using HashMap in MutexIdan Horowitz
This commit removes the usage of HashMap in Mutex, thereby making Mutex be allocation-free. In order to achieve this several simplifications were made to Mutex, removing unused code-paths and extra VERIFYs: * We no longer support 'upgrading' a shared lock holder to an exclusive holder when it is the only shared holder and it did not unlock the lock before relocking it as exclusive. NOTE: Unlike the rest of these changes, this scenario is not VERIFY-able in an allocation-free way, as a result the new LOCK_SHARED_UPGRADE_DEBUG debug flag was added, this flag lets Mutex allocate in order to detect such cases when debugging a deadlock. * We no longer support checking if a Mutex is locked by the current thread when the Mutex was not locked exclusively, the shared version of this check was not used anywhere. * We no longer support force unlocking/relocking a Mutex if the Mutex was not locked exclusively, the shared version of these functions was not used anywhere.
2022-01-29Kernel: Optimize StorageDevice read and write functionPankaj Raghav
Use shift operator with log size instead of division while calculating the index and len.
2022-01-29Kernel: Add block_size_log helper to BlockDevicePankaj Raghav
It is useful to have the log2 value of the block size while calculating index for an IO.
2022-01-29Kernel: Cache blocks_per_page in StorageDevice classPankaj Raghav
Instead of calculating blocks_per_page in every IO, cache it to save CPU cycles as that value will not change after initialization.
2022-01-29Kernel: Remove the assumption of 512 block size in read/write_blockPankaj Raghav
Devices such as NVMe can have blocks bigger that 512. Use the m_block_size variable in read/write_block function instead of the hardcoded 512 block size.
2022-01-29AK+Kernel: Implement UUID mixed endianness supportLiav A
This is being used by GUID partitions so the first three dash-delimited fields of the GUID are stored in little endian order but the last two fields are stored in big endian order, hence it's a representation which is mixed.
2022-01-29Kernel: Only lock process file descriptor table once in sys$poll()Andreas Kling
Grab the OpenFileDescriptions mutex once and hold on to it while populating the SelectBlocker::FDVector.
2022-01-29Kernel: Switch process file descriptor table from spinlock to mutexAndreas Kling
There's no reason for this to use a spinlock. Instead, let's allow threads to block if someone else is using the descriptor table.
2022-01-29Kernel: Convert process file descriptor table to a SpinlockProtectedAndreas Kling
Instead of manually locking in the various member functions of Process::OpenFileDescriptions, simply wrap it in a SpinlockProtected.
2022-01-28Kernel: Allocate entire SelectBlocker::FDVector at onceAndreas Kling
Use try_ensure_capacity() + unchecked_append() instead of repeatedly doing try_append().
2022-01-28Kernel: Move kernel region checks from x86 page fault handler to MMAndreas Kling
Ideally the x86 fault handler would only do x86 specific things and delegate the rest of the work to MemoryManager. This patch moves some of the address checks to a more generic place.
2022-01-28Kernel: Quickly reject userspace addresses in kernel_region_from_vaddr()Andreas Kling
This avoids taking and releasing the MM lock just to reject an address that we can tell from just looking at it that it won't ever be in the kernel regions tree.
2022-01-28Kernel: Remove unimplemented AHCIPort::is_hot_pluggable declarationIdan Horowitz
2022-01-28Kernel: Convert MemoryManager::allocate_user_physical_page to ErrorOrIdan Horowitz
This allows is to use the TRY macro at the call sites, instead of using clunky null checks.
2022-01-28Kernel: Make allocate_supervisor_physical_page OOM-fallibleIdan Horowitz
2022-01-28Kernel: Make allocate_contiguous_supervisor_physical_pages OOM-fallibleIdan Horowitz
2022-01-28Kernel: Use memset instead of fast_u32_fill in MemoryManager zero fillsIdan Horowitz
When the values we're setting are not actually u32s and the size of the area we're setting is PAGE_SIZE-aligned and a multiple of PAGE_SIZE in size, there's no point in using fast_u32_fill, as that forces us to use STOSDs instead of STOSQs.