From bd5b1d1413a913c9791c2959bf4bbe554c71f214 Mon Sep 17 00:00:00 2001 From: Sahan Fernando Date: Tue, 22 Jun 2021 00:51:47 +1000 Subject: [PATCH] Kernel: Use fewer supervisor pages in VirtIOQueues --- Kernel/VirtIO/VirtIOQueue.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Kernel/VirtIO/VirtIOQueue.cpp b/Kernel/VirtIO/VirtIOQueue.cpp index 8d2611d7c3..4fa2085631 100644 --- a/Kernel/VirtIO/VirtIOQueue.cpp +++ b/Kernel/VirtIO/VirtIOQueue.cpp @@ -17,7 +17,11 @@ VirtIOQueue::VirtIOQueue(u16 queue_size, u16 notify_offset) size_t size_of_descriptors = sizeof(VirtIOQueueDescriptor) * queue_size; size_t size_of_driver = sizeof(VirtIOQueueDriver) + queue_size * sizeof(u16); size_t size_of_device = sizeof(VirtIOQueueDevice) + queue_size * sizeof(VirtIOQueueDeviceItem); - m_queue_region = MM.allocate_contiguous_kernel_region(page_round_up(size_of_descriptors + size_of_driver + size_of_device), "VirtIO Queue", Region::Access::Read | Region::Access::Write); + auto queue_region_size = page_round_up(size_of_descriptors + size_of_driver + size_of_device); + if (queue_region_size <= PAGE_SIZE) + m_queue_region = MM.allocate_kernel_region(queue_region_size, "VirtIO Queue", Region::Access::Read | Region::Access::Write); + else + m_queue_region = MM.allocate_contiguous_kernel_region(queue_region_size, "VirtIO Queue", Region::Access::Read | Region::Access::Write); VERIFY(m_queue_region); // TODO: ensure alignment!!! u8* ptr = m_queue_region->vaddr().as_ptr();