Kernel: Don't enable write-combine for the Bochs framebuffer device

While write-combine greatly improves performance on bare metal, QEMU
appears to perform significantly worse when enabling it.
This commit is contained in:
Tom 2022-02-17 20:50:20 -07:00 committed by Andreas Kling
parent c8aae1ac52
commit 413bc9976c
Notes: sideshowbarker 2024-07-17 18:36:39 +09:00
3 changed files with 9 additions and 2 deletions

View file

@ -127,6 +127,8 @@ UNMAP_AFTER_INIT void BochsGraphicsAdapter::initialize_framebuffer_devices()
{
// FIXME: Find a better way to determine default resolution...
m_framebuffer_device = FramebufferDevice::create(*this, PhysicalAddress(PCI::get_BAR0(pci_address()) & 0xfffffff0), 1024, 768, 1024 * sizeof(u32));
// While write-combine helps greatly on actual hardware, it greatly reduces performance in QEMU
m_framebuffer_device->enable_write_combine(false);
// FIXME: Would be nice to be able to return a ErrorOr<void> here.
VERIFY(!m_framebuffer_device->try_to_initialize().is_error());
}

View file

@ -59,8 +59,10 @@ ErrorOr<Memory::Region*> FramebufferDevice::mmap(Process& process, OpenFileDescr
"Framebuffer",
prot,
shared));
if (auto result = m_userspace_framebuffer_region->set_write_combine(true); result.is_error())
dbgln("FramebufferDevice: Failed to enable Write-Combine on Framebuffer: {}", result.error());
if (m_write_combine) {
if (auto result = m_userspace_framebuffer_region->set_write_combine(true); result.is_error())
dbgln("FramebufferDevice: Failed to enable Write-Combine on Framebuffer: {}", result.error());
}
return m_userspace_framebuffer_region;
}

View file

@ -42,6 +42,8 @@ public:
virtual ErrorOr<ByteBuffer> get_edid(size_t head) const override;
void enable_write_combine(bool write_combine) { m_write_combine = write_combine; }
private:
virtual ErrorOr<void> set_head_resolution(size_t head, size_t width, size_t height, size_t pitch) override;
virtual ErrorOr<void> set_head_buffer(size_t head, bool second_buffer) override;
@ -64,6 +66,7 @@ private:
OwnPtr<Memory::Region> m_swapped_framebuffer_region;
bool m_graphical_writes_enabled { true };
bool m_write_combine { true };
RefPtr<Memory::AnonymousVMObject> m_userspace_real_framebuffer_vmobject;
Memory::Region* m_userspace_framebuffer_region { nullptr };