From: Grant T. <gt...@sw...> - 2002-06-06 21:59:21
|
>>>>> Grant Taylor <gt...@sw...> writes: > I'm going to bodge together some way to skip the page clear for this OK, I've done that. Here's my vmadump performance diff. Alas, this makes vmadump something less than a generic module, but if someday you hit some application where vmadump performance is really important, here it is... ===== include/linux/mm.h 1.2 vs edited ===== --- 1.2/include/linux/mm.h Thu Jan 10 16:40:15 2002 +++ edited/include/linux/mm.h Thu Jun 6 17:40:33 2002 @@ -103,6 +103,8 @@ #define VM_DONTEXPAND 0x00040000 /* Cannot expand with mremap() */ #define VM_RESERVED 0x00080000 /* Don't unmap it from swap_out */ +#define VM_NOCLEAR 0x00100000 /* Don't clear when faulting in anonymous pages */ + #define VM_STACK_FLAGS 0x00000177 #define VM_READHINTMASK (VM_SEQ_READ | VM_RAND_READ) ===== kernel/vmadump.c 1.4 vs edited ===== --- 1.4/kernel/vmadump.c Wed Mar 6 16:25:53 2002 +++ edited/kernel/vmadump.c Thu Jun 6 17:45:08 2002 @@ -430,21 +430,42 @@ } } +#define VM_SET_NOCLEAR_MAP_AT_ADDR(addr, noclear) { \ + if (addr) { \ + struct vm_area_struct *map; \ + down_write(¤t->mm->mmap_sem); \ + map = find_vma(current->mm, addr); \ + if (map) { \ + if (noclear) { \ + map->vm_flags |= VM_NOCLEAR; \ + } else { \ + map->vm_flags &= ~VM_NOCLEAR; \ + } \ + } \ + up_write(¤t->mm->mmap_sem); \ + } \ + } + /* Read in patched pages */ + VM_SET_NOCLEAR_MAP_AT_ADDR(addr, 1);/* don't clear page when faulting! */ r = read_kern(ctx, file, &page, sizeof(page)); while (r == sizeof(page) && page.start != ~0UL) { r = read_user(ctx, file, (void *) page.start, PAGE_SIZE); if (r != PAGE_SIZE) goto err; - flush_icache_range(page.start, page.start + PAGE_SIZE); + if (mmap_prot & PROT_EXEC) { + flush_icache_range(page.start, page.start + PAGE_SIZE); + } r = read_kern(ctx, file, &page, sizeof(page)); } if (r != sizeof(page)) goto err; + VM_SET_NOCLEAR_MAP_AT_ADDR(addr, 0); if (k_mprotect(head->start,head->end - head->start, mmap_prot)) printk("vmadump: thaw: mprotect failed. (ignoring)\n"); return 0; err: + VM_SET_NOCLEAR_MAP_AT_ADDR(addr, 0); if (r >= 0) r = -EIO; /* map short reads to EIO */ return r; } ===== mm/memory.c 1.2 vs edited ===== --- 1.2/mm/memory.c Thu Jan 10 16:40:56 2002 +++ edited/mm/memory.c Thu Jun 6 17:23:23 2002 @@ -1174,7 +1174,10 @@ page = alloc_page(GFP_HIGHUSER); if (!page) goto no_mem; - clear_user_highpage(page, addr); + if (!(vma->vm_flags & VM_NOCLEAR)) { + /* Clear (unless hackish noclear flag was set by ie vmadump) */ + clear_user_highpage(page, addr); + } spin_lock(&mm->page_table_lock); if (!pte_none(*page_table)) { -- Grant Taylor - x285 - http://pasta/~gtaylor/ Starent Networks - +1.978.851.1185 |