On Tue, Jun 01, 2021 at 03:30:30PM +0100, Matthew Wilcox wrote:
On Tue, Jun 01, 2021 at 04:10:32PM +0200, Daniel Vetter wrote:
On Sun, May 30, 2021 at 10:14:22PM +0100, Matthew Wilcox wrote:
On Sun, May 30, 2021 at 12:13:05PM -0700, Nathan Chancellor wrote:
Hi Matthew,
On Wed, Mar 10, 2021 at 06:55:30PM +0000, Matthew Wilcox (Oracle) wrote:
There's no need to give the page an address_space. Leaving the page->mapping as NULL will cause the VM to handle set_page_dirty() the same way that it's handled now, and that was the only reason to set the address_space in the first place.
Signed-off-by: Matthew Wilcox (Oracle) willy@infradead.org Reviewed-by: Christoph Hellwig hch@lst.de Reviewed-by: William Kucharski william.kucharski@oracle.com
This patch in mainline as commit ccf953d8f3d6 ("fb_defio: Remove custom address_space_operations") causes my Hyper-V based VM to no longer make it to a graphical environment.
Hi Nathan,
Thanks for the report. I sent Daniel a revert patch with a full explanation last week, which I assume he'll queue up for a pull soon. You can just git revert ccf953d8f3d6 for yourself until that shows up. Sorry for the inconvenience.
Uh that patch didn't get cc'ed to any list so I've ignored it. I've found it now, but lack of lore link is awkward. Can you pls resubmit with dri-devel on cc? fbdev list is dead, I don't look there.
How about I just attach it here?
Thanks, that worked with Link: and everything and no choking of my script :-)
Cheers, Daniel
From e88921d0775d87323a8688af37dfd7cdebdde5a9 Mon Sep 17 00:00:00 2001 From: "Matthew Wilcox (Oracle)" willy@infradead.org Date: Tue, 25 May 2021 08:37:33 -0400 Subject: [PATCH] Revert "fb_defio: Remove custom address_space_operations"
Commit ccf953d8f3d6 makes framebuffers which use deferred I/O stop displaying updates after the first one. This is because the pages handled by fb_defio no longer have a page_mapping(). That prevents page_mkclean() from marking the PTEs as clean, and so writes are only noticed the first time.
Reported-by: Andy Shevchenko andy.shevchenko@gmail.com Signed-off-by: Matthew Wilcox (Oracle) willy@infradead.org
drivers/video/fbdev/core/fb_defio.c | 35 +++++++++++++++++++++++++++++ drivers/video/fbdev/core/fbmem.c | 4 ++++ include/linux/fb.h | 3 +++ 3 files changed, 42 insertions(+)
diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c index b292887a2481..a591d291b231 100644 --- a/drivers/video/fbdev/core/fb_defio.c +++ b/drivers/video/fbdev/core/fb_defio.c @@ -52,6 +52,13 @@ static vm_fault_t fb_deferred_io_fault(struct vm_fault *vmf) return VM_FAULT_SIGBUS;
get_page(page);
if (vmf->vma->vm_file)
page->mapping = vmf->vma->vm_file->f_mapping;
else
printk(KERN_ERR "no mapping available\n");
BUG_ON(!page->mapping); page->index = vmf->pgoff;
vmf->page = page;
@@ -144,6 +151,17 @@ static const struct vm_operations_struct fb_deferred_io_vm_ops = { .page_mkwrite = fb_deferred_io_mkwrite, };
+static int fb_deferred_io_set_page_dirty(struct page *page) +{
- if (!PageDirty(page))
SetPageDirty(page);
- return 0;
+}
+static const struct address_space_operations fb_deferred_io_aops = {
- .set_page_dirty = fb_deferred_io_set_page_dirty,
+};
int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma) { vma->vm_ops = &fb_deferred_io_vm_ops; @@ -194,12 +212,29 @@ void fb_deferred_io_init(struct fb_info *info) } EXPORT_SYMBOL_GPL(fb_deferred_io_init);
+void fb_deferred_io_open(struct fb_info *info,
struct inode *inode,
struct file *file)
+{
- file->f_mapping->a_ops = &fb_deferred_io_aops;
+} +EXPORT_SYMBOL_GPL(fb_deferred_io_open);
void fb_deferred_io_cleanup(struct fb_info *info) { struct fb_deferred_io *fbdefio = info->fbdefio;
struct page *page;
int i;
BUG_ON(!fbdefio); cancel_delayed_work_sync(&info->deferred_work);
/* clear out the mapping that we setup */
for (i = 0 ; i < info->fix.smem_len; i += PAGE_SIZE) {
page = fb_deferred_io_page(info, i);
page->mapping = NULL;
}
mutex_destroy(&fbdefio->lock);
} EXPORT_SYMBOL_GPL(fb_deferred_io_cleanup); diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 072780b0e570..98f193078c05 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -1415,6 +1415,10 @@ __releases(&info->lock) if (res) module_put(info->fbops->owner); } +#ifdef CONFIG_FB_DEFERRED_IO
- if (info->fbdefio)
fb_deferred_io_open(info, inode, file);
+#endif out: unlock_fb_info(info); if (res) diff --git a/include/linux/fb.h b/include/linux/fb.h index a8dccd23c249..ecfbcc0553a5 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -659,6 +659,9 @@ static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, /* drivers/video/fb_defio.c */ int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma); extern void fb_deferred_io_init(struct fb_info *info); +extern void fb_deferred_io_open(struct fb_info *info,
struct inode *inode,
struct file *file);
extern void fb_deferred_io_cleanup(struct fb_info *info); extern int fb_deferred_io_fsync(struct file *file, loff_t start, loff_t end, int datasync); -- 2.30.2