Hi Wei Liu, Please do not pick up this patch, because actually MMIO VRAM can not work with fb_deferred_io. Previously I didn't test Xorg -- sorry. As soon as I tested it, I got the below warning and the Xorg program ternimated immediately: [ 28.148432] WARNING: CPU: 19 PID: 1410 at mm/vmalloc.c:383 vmalloc_to_page+0x14b/0x150 ... [ 28.192959] CPU: 19 PID: 1410 Comm: Xorg Tainted: G E 5.10.0-rc1+ #4 ... [ 28.208720] RIP: 0010:vmalloc_to_page+0x14b/0x150 ... [ 28.299231] Call Trace: [ 28.301428] fb_deferred_io_fault+0x3a/0xa0 [ 28.305276] __do_fault+0x36/0x120 [ 28.308276] handle_mm_fault+0x1144/0x1950 [ 28.311963] exc_page_fault+0x290/0x510 [ 28.315551] ? asm_exc_page_fault+0x8/0x30 [ 28.319186] asm_exc_page_fault+0x1e/0x30 [ 28.322969] RIP: 0033:0x7fbeda3ec2f5 The issue is that fb_deferred_io_page() requires that the PFN be backed by a struct page, but it looks the MMIO address does not have the struct page backed. So I have to drop this patch. Thanks Wei Hu and Michael for pointing this out! FYI: drivers/video/fbdev/core/fb_defio.c: static struct page *fb_deferred_io_page(struct fb_info *info, unsigned long offs) { void *screen_base = (void __force *) info->screen_base; struct page *page; if (is_vmalloc_addr(screen_base + offs)) page = vmalloc_to_page(screen_base + offs); else page = pfn_to_page((info->fix.smem_start + offs) >> PAGE_SHIFT); return page; } /* this is to find and return the vmalloc-ed fb pages */ static vm_fault_t fb_deferred_io_fault(struct vm_fault *vmf) { unsigned long offset; struct page *page; struct fb_info *info = vmf->vma->vm_private_data; offset = vmf->pgoff << PAGE_SHIFT; if (offset >= info->fix.smem_len) return VM_FAULT_SIGBUS; page = fb_deferred_io_page(info, offset); if (!page) return VM_FAULT_SIGBUS; Thanks, -- Dexuan