Messages in this thread | | | From | Nick Piggin <> | Subject | Re: vm_ops.page_mkwrite() fails with vmalloc on 2.6.23 | Date | Tue, 30 Oct 2007 01:28:24 +1100 |
| |
On Monday 29 October 2007 23:35, Peter Zijlstra wrote: > On Mon, 2007-10-29 at 11:11 +0100, Peter Zijlstra wrote: > > On Mon, 2007-10-29 at 01:17 -0700, Jaya Kumar wrote: > > > On 10/29/07, Andrew Morton <akpm@linux-foundation.org> wrote: > > > > On Mon, 22 Oct 2007 16:40:57 +0200 Stefani Seibold <stefani@seibold.net> wrote: > > > > > The problem original occurs with the fb_defio driver > > > > > (driver/video/fb_defio.c). This driver use the > > > > > vm_ops.page_mkwrite() handler for tracking the modified pages, > > > > > which will be in an extra thread handled, to perform the IO and > > > > > clean and write protect all pages with page_clean(). > > > > > > Hi, > > > > > > An aside, I just tested that deferred IO works fine on > > > 2.6.22.10/pxa255. > > > > > > I understood from the thread that PeterZ is looking into page_mkclean > > > changes which I guess went into 2.6.23. I'm also happy to help in any > > > way if the way we're doing fb_defio needs to change. > > > > Yeah, its the truncate race stuff introduced by Nick in > > d0217ac04ca6591841e5665f518e38064f4e65bd > > > > I'm a bit at a loss on how to go around fixing this. One ugly idea I had > > was to check page->mapping before going into page_mkwrite() and when > > that is null, don't bother with the truncate check. > > Something like this
I think it's a fine minimal patch. Maybe add a comment to say exactly what we're doing here (pagecache generally just uses !mapping to test for truncate).
Otherwise, Acked-by: Nick Piggin <npiggin@suse.de>, thanks!
> --- > mm/memory.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > Index: linux-2.6/mm/memory.c > =================================================================== > --- linux-2.6.orig/mm/memory.c > +++ linux-2.6/mm/memory.c > @@ -2300,6 +2300,8 @@ static int __do_fault(struct mm_struct * > * to become writable > */ > if (vma->vm_ops->page_mkwrite) { > + struct address_space *mapping = page->mapping; > + > unlock_page(page); > if (vma->vm_ops->page_mkwrite(vma, page) < 0) { > ret = VM_FAULT_SIGBUS; > @@ -2314,7 +2316,7 @@ static int __do_fault(struct mm_struct * > * reworking page_mkwrite locking API, which > * is better done later. > */ > - if (!page->mapping) { > + if (mapping != page->mapping) { > ret = 0; > anon = 1; /* no anon but release vmf.page */ > goto out; - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |