Messages in this thread | | | Date | Fri, 20 Oct 2000 18:45:59 -0400 (EDT) | From | Alexander Viro <> | Subject | Re: 2.4.0-test10-pre3:Oops in mm/filemap.c:filemap_write_pa |
| |
On Thu, 19 Oct 2000, Linus Torvalds wrote:
> You'd have to do something like > > LockPage(page); /* Nobody gets to write to this page (except through mmaps, ugh) */ > gather_all_mmap_users(page); /* THIS is the nasty one */
Wait a second. invalidate_inode_pages() has no idea of range, right? Finding all VMAs of shared mappings for given inode is not a big deal. Sure, repeating it for each bloody page would be painful at extreme, but "make sure that every access to address within _that_ VMA will result in pagefault" looks like a reasonable operation. Basically, we have two sides - pagecache and many VMAs. And loop over VMAs with per-VMA operations sounds more reasonable than loop over pages. We _can_ block pageins without messing with pages themselves (it starts with finding VMA, after all) and we can block new shared mappings (not a big deal).
Comments? Basically, I propose per-VMA rw-semaphore taken on page-in for read and on that "flush and make sure we'll reread" operation for write + rw-sem on i_mmap_shared. We could even make invalidation work for less than whole file, all we need for that is skipping the VMAs out of the range. Ingo, Linus?
> nfs_wb_page(page); /* force write-back on this page */ > ClearPageUptodate(page); /* mark it not up-to-date to force a read-in next time */ > UnlockPage(page); /* Ok, now the client can go wild */ > > where everything but the "gather_all_mmap_users()" part is fairly > straightforward. The "gather" phase is nasty - it would need to figure > out every place the page is mapped, make sure those are synchronized (ie > something like marking the page table entry write-protected and causing a > TLB invalidate SMP cross-call - at which point the resulting page fault > and the page lock will catch anybody who tries to write to the page)..
> In no case could you do something like what the current > invalidate_inode_pages() does, which is to just try to drop the page from > the cache - that really only works if we're the only user of that page, > which the "page_count != 1" test now enforces.
<AOL></AOL>
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
| |