| From a24643aefcf6fd5eca01fc3a942dcadd066343d1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 17 Nov 2020 16:03:05 -0800 |
| Subject: video: hyperv_fb: Fix the cache type when mapping the VRAM |
| |
| From: Dexuan Cui <decui@microsoft.com> |
| |
| [ Upstream commit 5f1251a48c17b54939d7477305e39679a565382c ] |
| |
| x86 Hyper-V used to essentially always overwrite the effective cache type |
| of guest memory accesses to WB. This was problematic in cases where there |
| is a physical device assigned to the VM, since that often requires that |
| the VM should have control over cache types. Thus, on newer Hyper-V since |
| 2018, Hyper-V always honors the VM's cache type, but unexpectedly Linux VM |
| users start to complain that Linux VM's VRAM becomes very slow, and it |
| turns out that Linux VM should not map the VRAM uncacheable by ioremap(). |
| Fix this slowness issue by using ioremap_cache(). |
| |
| On ARM64, ioremap_cache() is also required as the host also maps the VRAM |
| cacheable, otherwise VM Connect can't display properly with ioremap() or |
| ioremap_wc(). |
| |
| With this change, the VRAM on new Hyper-V is as fast as regular RAM, so |
| it's no longer necessary to use the hacks we added to mitigate the |
| slowness, i.e. we no longer need to allocate physical memory and use |
| it to back up the VRAM in Generation-1 VM, and we also no longer need to |
| allocate physical memory to back up the framebuffer in a Generation-2 VM |
| and copy the framebuffer to the real VRAM. A further big change will |
| address these for v5.11. |
| |
| Fixes: 68a2d20b79b1 ("drivers/video: add Hyper-V Synthetic Video Frame Buffer Driver") |
| Tested-by: Boqun Feng <boqun.feng@gmail.com> |
| Signed-off-by: Dexuan Cui <decui@microsoft.com> |
| Reviewed-by: Michael Kelley <mikelley@microsoft.com> |
| Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com> |
| Link: https://lore.kernel.org/r/20201118000305.24797-1-decui@microsoft.com |
| Signed-off-by: Wei Liu <wei.liu@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/video/fbdev/hyperv_fb.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c |
| index 2dcb7c58b31e1..81671272aa58f 100644 |
| --- a/drivers/video/fbdev/hyperv_fb.c |
| +++ b/drivers/video/fbdev/hyperv_fb.c |
| @@ -703,7 +703,12 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info) |
| goto err1; |
| } |
| |
| - fb_virt = ioremap(par->mem->start, screen_fb_size); |
| + /* |
| + * Map the VRAM cacheable for performance. This is also required for |
| + * VM Connect to display properly for ARM64 Linux VM, as the host also |
| + * maps the VRAM cacheable. |
| + */ |
| + fb_virt = ioremap_cache(par->mem->start, screen_fb_size); |
| if (!fb_virt) |
| goto err2; |
| |
| -- |
| 2.27.0 |
| |