Messages in this thread Patch in this message | | | Date | Mon, 17 Mar 2003 18:38:51 +0100 | From | wind-lkml@cocodril ... | Subject | Re: 2.4 vm, program load, page faulting, ... |
| |
On Mon, Mar 17, 2003 at 06:12:46PM +0100, wind-lkml@cocodriloo.com wrote: > On Mon, Mar 17, 2003 at 07:50:04PM +0300, Alex Tomas wrote: > > >>>>> wind (w) writes: > > > > w> On Mon, Mar 17, 2003 at 11:01:31AM -0500, Rik van Riel wrote: > > >> On Mon, 17 Mar 2003, William Lee Irwin III wrote: > > >> > On Sat, 15 Mar 2003, Paul Albrecht wrote: > > >> > >> ... Why does the kernel page fault on text pages, present in > > >> the page > >> cache, when a program starts? Couldn't the pte's for > > >> text present in the > >> page cache be resolved when they're > > >> mapped to memory? > > >> > > > > > w> You should ask Andrew about his patch to do exactly that: he > > w> forced all PROC_EXEC mmaps to be nonlinear-mapped and this forced > > w> all programs to suck entire binaries into memory... I recall he > > w> saw at least 25% improvement at launching gnome. > > > > they talked about pages _already present_ in pagecache. > > I wonder if this could be done by walking and faulting > all pages at fs/binfmt_elf.c::elf_map just after do_mmap... > will try it just now :)
OK, this is not tested, since I'm compiling it now... feel free to correct :)
--- orig/fs/binfmt_elf.c Mon Mar 17 18:26:59 2003 +++ work/fs/binfmt_elf.c Mon Mar 17 18:26:31 2003 @@ -259,12 +259,23 @@ create_elf_tables(struct linux_binprm *b static inline unsigned long elf_map (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int type) { - unsigned long map_addr; + unsigned long map_addr, pgoff; + struct mm *mm; down_write(¤t->mm->mmap_sem); map_addr = do_mmap(filep, ELF_PAGESTART(addr), eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr), prot, type, eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr)); + + /* preload elf image */ + + mm = current->mm; + addr = ELF_PAGESTART(addr); + for(pgoff = 0; pgoff < eppnt->p_filesz;){ + do_mmap_pgoff(mm, filep, addr, PAGE_SIZE, prot, type, pgoff); + addr += PAGE_SIZE; + pgoff += PAGE_SIZE; + } up_write(¤t->mm->mmap_sem); return(map_addr); | |