[[email protected]: my paging work]
Subsystems (3)
Hi,
Here's davem's page-based swapout snapshot. It's UNFINISHED + DANGEROUS + WILL_EAT_YOUR_DISK (his words!), but somebody may want to archive this and pick up on the work in 2.5.
--Stephen
----- Forwarded message from "David S. Miller" <[email protected]> -----
Date: Sun, 30 Apr 2000 22:29:29 -0700
X-Authentication-Warning: pizda.ninka.net: davem set sender to [email protected] using -f
From: "David S. Miller" <[email protected]>
To: [email protected]
Subject: my paging work
I'm abandoning it for the time being, there are more important things to work on for 2.4.x :-) A lot of things started to really not work out the way I wanted them to. One example was the locking, because once you have LRU of all interesting pages in the system the natural way to swap them out is to lock the page->mapping->i_shared_lock and walk the VMA's tapping on the ptes in each. This is backwards to how the rest of the kernel locks this stuff, you can see my attempted band-aid in the patch below with the lock_vma_mappings() stuff.
The code mostly works, no major SMP deadlocks, but the swap cache leaks heavily under any swap load and the machine still goes into a catatonic state when paging pressure is high.
The anon layer is done incorrectly, it does in fact have the problem of making the swapper look at vma's which don't even have the page for the private file mapping case (very common for pages containing shared library data sections, and also for elf PLT pages, for example). This was very disappointing because I would have been so happy if we could do it this way and only have a per-VMA cost for this stuff when there is no paging going on. The only evident other solution would be per-page pte chaining just like freebsd does, and I am rather confident that this would make the changes an instant "no way" from Linus's perspective because of the high added cost. I would also find this kind of cost unacceptable, ho hum...
Anyways, I send you a copy since I'm going off to work on other stuff for the time being. Enjoy.
Index: Makefile
===================================================================
RCS file: /cvs/linux/Makefile,v
retrieving revision 1.306
Makefile +1 -1
@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 3 SUBLEVEL = 99 -EXTRAVERSION = -pre6 +EXTRAVERSION = -pre6ANON KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
Index: arch/ia64/ia32/binfmt_elf32.c
===================================================================
RCS file: /cvs/linux/arch/ia64/ia32/binfmt_elf32.c,v retrieving revision 1.5
ia64/ia32/binfmt_elf32.c +1 -1
@@ -178,7 +178,7 @@ mpnt->vm_ops =NULL ; mpnt->vm_pgoff =0 ; mpnt->vm_file =NULL ; - mpnt->vm_private_data =0 ; + mpnt->vm_anon =NULL ;insert_vm_struct (current->mm, mpnt); current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >>PAGE_SHIFT ; }
Index: arch/ia64/mm/init.c
===================================================================
RCS file: /cvs/linux/arch/ia64/mm/init.c,v
retrieving revision 1.6
ia64/mm/init.c +1 -1
@@ -160,7 +160,7 @@ vma->vm_ops =NULL ; vma->vm_pgoff =0 ; vma->vm_file =NULL ; - vma->vm_private_data =NULL ; + vma->vm_anon =NULL ;insert_vm_struct (current->mm, vma); } }
Index: fs/exec.c
===================================================================
RCS file: /cvs/linux/fs/exec.c,v
retrieving revision 1.108
exec.c +8 -3
@@ -240,7 +240,7 @@* This routine is used to map in a page into an address space: needed by * execve() for the initial stack and environment pages. */ -void put_dirty_page (struct task_struct * tsk,struct page *page,unsigned long address) +void put_dirty_page (struct task_struct * tsk,struct vm_area_struct *vma,struct page *page,unsigned long address) {pgd_t * pgd;pmd_t * pmd;
@@ -248,6 +248,11 @@if (page_count (page) !=1 )printk ("mem_map disagrees with %p at %08lx\n" , page, address); +if (anon_page_add (vma, address, page)) { +__free_page (page); +force_sig (SIGKILL , tsk); +return ; + } pgd =pgd_offset (tsk->mm, address); pmd =pmd_alloc (pgd, address);if (!pmd) {
@@ -297,7 +302,7 @@ mpnt->vm_ops =NULL ; mpnt->vm_pgoff =0 ; mpnt->vm_file =NULL ; - mpnt->vm_private_data = (void *)0 ; + mpnt->vm_anon =NULL ;vmlist_modify_lock (current->mm);insert_vm_struct (current->mm, mpnt);vmlist_modify_unlock (current->mm);
@@ -307,7 +312,7 @@for (i =0 ; i <MAX_ARG_PAGES ; i++) {if (bprm->page[i]) { current->mm->rss++; -put_dirty_page (current,bprm->page[i],stack_base); +put_dirty_page (current,mpnt,bprm->page[i],stack_base); } stack_base +=PAGE_SIZE ; }
Index: fs/adfs/inode.c
===================================================================
RCS file: /cvs/linux/fs/adfs/inode.c,v
retrieving revision 1.11
adfs/inode.c +1 -0
@@ -76,6 +76,7 @@ sync_page: block_sync_page, prepare_write: adfs_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: _adfs_bmap };
Index: fs/affs/file.c
===================================================================
RCS file: /cvs/linux/fs/affs/file.c,v
retrieving revision 1.33
affs/file.c +1 -0
@@ -361,6 +361,7 @@ sync_page: block_sync_page, prepare_write: affs_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: _affs_bmap };
Index: fs/affs/symlink.c
===================================================================
RCS file: /cvs/linux/fs/affs/symlink.c,v
retrieving revision 1.21
affs/symlink.c +1 -0
@@ -73,6 +73,7 @@struct address_space_operations affs_symlink_aops = { readpage: affs_symlink_readpage, + try_to_free_page: filemap_try_to_free_page };struct inode_operations affs_symlink_inode_operations = {
Index: fs/bfs/file.c
===================================================================
RCS file: /cvs/linux/fs/bfs/file.c,v
retrieving revision 1.13
bfs/file.c +1 -0
@@ -153,6 +153,7 @@ sync_page: block_sync_page, prepare_write: bfs_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: bfs_bmap };
Index: fs/coda/symlink.c
===================================================================
RCS file: /cvs/linux/fs/coda/symlink.c,v
retrieving revision 1.13
coda/symlink.c +2 -1
@@ -49,5 +49,6 @@ }struct address_space_operations coda_symlink_aops = { - readpage: coda_symlink_filler + readpage: coda_symlink_filler, + try_to_free_page: filemap_try_to_free_page };
Index: fs/cramfs/inode.c
===================================================================
RCS file: /cvs/linux/fs/cramfs/inode.c,v
retrieving revision 1.9
cramfs/inode.c +2 -1
@@ -335,7 +335,8 @@ }static struct address_space_operations cramfs_aops = { - readpage: cramfs_readpage + readpage: cramfs_readpage, + try_to_free_page: filemap_try_to_free_page };/*
Index: fs/efs/inode.c
===================================================================
RCS file: /cvs/linux/fs/efs/inode.c,v
retrieving revision 1.8
efs/inode.c +1 -0
@@ -22,6 +22,7 @@struct address_space_operations efs_aops = { readpage: efs_readpage, sync_page: block_sync_page, + try_to_free_page: filemap_try_to_free_page, bmap: _efs_bmap };
Index: fs/efs/symlink.c
===================================================================
RCS file: /cvs/linux/fs/efs/symlink.c,v
retrieving revision 1.8
efs/symlink.c +2 -1
@@ -49,5 +49,6 @@ }struct address_space_operations efs_symlink_aops = { - readpage: efs_symlink_readpage + readpage: efs_symlink_readpage, + try_to_free_page: filemap_try_to_free_page, };
Index: fs/ext2/inode.c
===================================================================
RCS file: /cvs/linux/fs/ext2/inode.c,v
retrieving revision 1.46
ext2/inode.c +1 -0
@@ -642,6 +642,7 @@ sync_page: block_sync_page, prepare_write: ext2_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: ext2_bmap };
Index: fs/fat/inode.c
===================================================================
RCS file: /cvs/linux/fs/fat/inode.c,v
retrieving revision 1.52
fat/inode.c +1 -0
@@ -752,6 +752,7 @@ sync_page: block_sync_page, prepare_write: fat_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: _fat_bmap };
Index: fs/hfs/inode.c
===================================================================
RCS file: /cvs/linux/fs/hfs/inode.c,v
retrieving revision 1.11
hfs/inode.c +1 -0
@@ -240,6 +240,7 @@ sync_page: block_sync_page, prepare_write: hfs_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: hfs_bmap };
Index: fs/hpfs/file.c
===================================================================
RCS file: /cvs/linux/fs/hpfs/file.c,v
retrieving revision 1.12
hpfs/file.c +1 -0
@@ -109,6 +109,7 @@ sync_page: block_sync_page, prepare_write: hpfs_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: _hpfs_bmap };
Index: fs/hpfs/inode.c
===================================================================
RCS file: /cvs/linux/fs/hpfs/inode.c,v
retrieving revision 1.12
hpfs/inode.c +2 -1
@@ -48,7 +48,8 @@ };struct address_space_operations hpfs_symlink_aops = { - readpage: hpfs_symlink_readpage + readpage: hpfs_symlink_readpage, + try_to_free_page: filemap_try_to_free_page };void hpfs_read_inode (struct inode *i)
Index: fs/isofs/inode.c
===================================================================
RCS file: /cvs/linux/fs/isofs/inode.c,v
retrieving revision 1.62
isofs/inode.c +1 -0
@@ -992,6 +992,7 @@static struct address_space_operations isofs_aops = { readpage: isofs_readpage, sync_page: block_sync_page, + try_to_free_page: filemap_try_to_free_page, bmap: _isofs_bmap };
Index: fs/isofs/rock.c
===================================================================
RCS file: /cvs/linux/fs/isofs/rock.c,v
retrieving revision 1.17
isofs/rock.c +2 -1
@@ -542,5 +542,6 @@ }struct address_space_operations isofs_symlink_aops = { - readpage: rock_ridge_symlink_readpage + readpage: rock_ridge_symlink_readpage, + try_to_free_page: filemap_try_to_free_page };
Index: fs/minix/inode.c
===================================================================
RCS file: /cvs/linux/fs/minix/inode.c,v
retrieving revision 1.45
minix/inode.c +1 -0
@@ -1028,6 +1028,7 @@ sync_page: block_sync_page, prepare_write: minix_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: minix_bmap };
Index: fs/ncpfs/symlink.c
===================================================================
RCS file: /cvs/linux/fs/ncpfs/symlink.c,v
retrieving revision 1.6
ncpfs/symlink.c +1 -0
@@ -98,6 +98,7 @@*/ struct address_space_operations ncp_symlink_aops = { readpage: ncp_symlink_readpage, + try_to_free_page: filemap_try_to_free_page, };/* ----- create a new symbolic link -------------------------------------- */
Index: fs/nfs/file.c
===================================================================
RCS file: /cvs/linux/fs/nfs/file.c,v
retrieving revision 1.52
nfs/file.c +2 -1
@@ -203,7 +203,8 @@ sync_page: nfs_sync_page, writepage: nfs_writepage, prepare_write: nfs_prepare_write, - commit_write: nfs_commit_write + commit_write: nfs_commit_write, + try_to_free_page: filemap_try_to_free_page };/*
Index: fs/ntfs/fs.c
===================================================================
RCS file: /cvs/linux/fs/ntfs/fs.c,v
retrieving revision 1.30
ntfs/fs.c +1 -0
@@ -610,6 +610,7 @@ sync_page: block_sync_page, prepare_write: ntfs_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: _ntfs_bmap };/* ntfs_read_inode is called by the Virtual File System (the kernel layer that
Index: fs/qnx4/inode.c
===================================================================
RCS file: /cvs/linux/fs/qnx4/inode.c,v
retrieving revision 1.20
qnx4/inode.c +1 -0
@@ -433,6 +433,7 @@ sync_page: block_sync_page, prepare_write: qnx4_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: qnx4_bmap };
Index: fs/ramfs/inode.c
===================================================================
RCS file: /cvs/linux/fs/ramfs/inode.c,v
retrieving revision 1.2
ramfs/inode.c +2 -1
@@ -324,7 +324,8 @@ readpage: ramfs_readpage, writepage: ramfs_writepage, prepare_write: ramfs_prepare_write, - commit_write: ramfs_commit_write + commit_write: ramfs_commit_write, + try_to_free_page: filemap_try_to_free_page };static struct file_operations ramfs_file_operations = {
Index: fs/romfs/inode.c
===================================================================
RCS file: /cvs/linux/fs/romfs/inode.c,v
retrieving revision 1.42
romfs/inode.c +2 -1
@@ -428,7 +428,8 @@/* Mapping from our types to the kernel */ static struct address_space_operations romfs_aops = { - readpage: romfs_readpage + readpage: romfs_readpage, + try_to_free_page: filemap_try_to_free_page };static struct file_operations romfs_dir_operations = {
Index: fs/smbfs/file.c
===================================================================
RCS file: /cvs/linux/fs/smbfs/file.c,v
retrieving revision 1.38
smbfs/file.c +2 -1
@@ -290,7 +290,8 @@ readpage: smb_readpage, writepage: smb_writepage, prepare_write: smb_prepare_write, - commit_write: smb_commit_write + commit_write: smb_commit_write, + try_to_free_page: filemap_try_to_free_page };/*
Index: fs/sysv/inode.c
===================================================================
RCS file: /cvs/linux/fs/sysv/inode.c,v
retrieving revision 1.41
sysv/inode.c +1 -0
@@ -961,6 +961,7 @@ sync_page: block_sync_page, prepare_write: sysv_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: sysv_bmap };
Index: fs/udf/file.c
===================================================================
RCS file: /cvs/linux/fs/udf/file.c,v
retrieving revision 1.18
udf/file.c +1 -0
@@ -121,6 +121,7 @@ sync_page: block_sync_page, prepare_write: udf_adinicb_prepare_write, commit_write: udf_adinicb_commit_write, + try_to_free_page: filemap_try_to_free_page }; static ssize_t udf_file_write(struct file * file, const char * buf,
Index: fs/udf/inode.c
===================================================================
RCS file: /cvs/linux/fs/udf/inode.c,v
retrieving revision 1.14
udf/inode.c +1 -0
@@ -151,6 +151,7 @@ sync_page: block_sync_page, prepare_write: udf_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: udf_bmap, };
Index: fs/udf/symlink.c
===================================================================
RCS file: /cvs/linux/fs/udf/symlink.c,v
retrieving revision 1.5
udf/symlink.c +1 -0
@@ -123,4 +123,5 @@*/ struct address_space_operations udf_symlink_aops = { readpage: udf_symlink_filler, + try_to_free_page: filemap_try_to_free_page };
Index: fs/ufs/inode.c
===================================================================
RCS file: /cvs/linux/fs/ufs/inode.c,v
retrieving revision 1.15
ufs/inode.c +1 -0
@@ -562,6 +562,7 @@ sync_page: block_sync_page, prepare_write: ufs_prepare_write, commit_write: generic_commit_write, + try_to_free_page: filemap_try_to_free_page, bmap: ufs_bmap };
Index: include/linux/fs.h
===================================================================
RCS file: /cvs/linux/include/linux/fs.h,v
retrieving revision 1.167
linux/fs.h +3 -0
@@ -343,9 +343,12 @@int (*sync_page)(struct page *);int (*prepare_write)(struct file *,struct page *,unsigned ,unsigned );int (*commit_write)(struct file *,struct page *,unsigned ,unsigned ); +int (*try_to_free_page)(struct page *);/* Unfortunately this kludge is needed for FIBMAP. Don't use it */ int (*bmap)(struct address_space *,long ); }; + +extern int filemap_try_to_free_page (struct page *);struct address_space {struct list_head pages;/* list of pages */
Index: include/linux/mm.h
===================================================================
RCS file: /cvs/linux/include/linux/mm.h,v
retrieving revision 1.115
linux/mm.h +34 -8
92 lines not on this page · raw message
Index: include/linux/swap.h
===================================================================
RCS file: /cvs/linux/include/linux/swap.h,v
retrieving revision 1.54
linux/swap.h +42 -14
76 lines not on this page · raw message
Index: init/main.c
===================================================================
RCS file: /cvs/linux/init/main.c,v
retrieving revision 1.210
main.c +1 -0
@@ -570,6 +570,7 @@filescache_init ();dcache_init (mempages);vma_init (); +anon_init ();buffer_init (mempages);page_cache_init (mempages);kiobuf_setup ();
Index: ipc/shm.c
===================================================================
RCS file: /cvs/linux/ipc/shm.c,v
retrieving revision 1.99
shm.c +1 -0
@@ -1344,6 +1344,7 @@*/ static int shm_swapout (struct page * page,struct file *file) { +UnlockPage (page);return 0 ; }
Index: kernel/fork.c
===================================================================
RCS file: /cvs/linux/kernel/fork.c,v
retrieving revision 1.116
fork.c +3 -0
@@ -270,6 +270,9 @@spin_unlock (&inode->i_mapping->i_shared_lock); } +if (tmp->vm_anon) +anon_dup (mpnt, tmp); +/* Copy the pages, but defer checking for errors */ retval =copy_page_range (mm, current->mm, tmp);if (!retval && tmp->vm_ops && tmp->vm_ops->open)
Index: kernel/ksyms.c
===================================================================
RCS file: /cvs/linux/kernel/ksyms.c,v
retrieving revision 1.174
ksyms.c +1 -0
@@ -253,6 +253,7 @@EXPORT_SYMBOL (filemap_swapout);EXPORT_SYMBOL (filemap_sync);EXPORT_SYMBOL (lock_page); +EXPORT_SYMBOL (filemap_try_to_free_page);#if !defined(CONFIG_NFSD ) && defined(CONFIG_NFSD_MODULE )EXPORT_SYMBOL (do_nfsservctl);
Index: mm/Makefile
===================================================================
RCS file: /cvs/linux/mm/Makefile,v
retrieving revision 1.13
Makefile +1 -1
@@ -10,7 +10,7 @@ O_TARGET := mm.o O_OBJS := memory.o mmap.o filemap.o mprotect.o mlock.o mremap.o \ vmalloc.o slab.o bootmem.o swap.o vmscan.o page_io.o \ - page_alloc.o swap_state.o swapfile.o numa.o + page_alloc.o swap_state.o swapfile.o numa.o anon.o ifeq ($(CONFIG_HIGHMEM),y) O_OBJS += highmem.o
Index: mm/filemap.c
===================================================================
RCS file: /cvs/linux/mm/filemap.c,v
retrieving revision 1.144
filemap.c +57 -159
303 lines not on this page · raw message
Index: mm/highmem.c
===================================================================
RCS file: /cvs/linux/mm/highmem.c,v
retrieving revision 1.12
highmem.c +1 -0
@@ -74,6 +74,7 @@kunmap (highpage);/* Preserve the caching of the swap_entry. */ +#error This does not work with the new anon cache, FIXME -DaveM highpage->index = page->index; highpage->mapping = page->mapping;
Index: mm/memory.c
===================================================================
RCS file: /cvs/linux/mm/memory.c,v
retrieving revision 1.111
memory.c +38 -31
148 lines not on this page · raw message
Index: mm/mlock.c
===================================================================
RCS file: /cvs/linux/mm/mlock.c,v
retrieving revision 1.28
mlock.c +18 -4
@@ -36,11 +36,15 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);vmlist_modify_lock (vma->vm_mm); vma->vm_pgoff += (end - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = end; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n); +if (vma->vm_anon) +__anon_dup (vma, n);vmlist_modify_unlock (vma->vm_mm); +unlock_vma_mappings (vma);return 0 ; }
@@ -61,10 +65,14 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);vmlist_modify_lock (vma->vm_mm); vma->vm_end = start; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n); +if (vma->vm_anon) +__anon_dup (vma, n);vmlist_modify_unlock (vma->vm_mm); +unlock_vma_mappings (vma);return 0 ; }
@@ -96,15 +104,21 @@ vma->vm_ops->open (left); vma->vm_ops->open (right); } +lock_vma_mappings (vma);vmlist_modify_lock (vma->vm_mm); vma->vm_pgoff += (start - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = start; vma->vm_end = end; vma->vm_flags = newflags; vma->vm_raend =0 ; -insert_vm_struct (current->mm, left); -insert_vm_struct (current->mm, right); +__insert_vm_struct (current->mm, left); +__insert_vm_struct (current->mm, right); +if (vma->vm_anon) { +__anon_dup (vma, left); +__anon_dup (vma, right); + }vmlist_modify_unlock (vma->vm_mm); +unlock_vma_mappings (vma);return 0 ; }
Index: mm/mmap.c
===================================================================
RCS file: /cvs/linux/mm/mmap.c,v
retrieving revision 1.96
mmap.c +94 -17
240 lines not on this page · raw message
Index: mm/mprotect.c
===================================================================
RCS file: /cvs/linux/mm/mprotect.c,v
retrieving revision 1.27
mprotect.c +18 -4
@@ -111,11 +111,15 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);vmlist_modify_lock (vma->vm_mm); vma->vm_pgoff += (end - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = end; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n); +if (vma->vm_anon) +__anon_dup (vma, n);vmlist_modify_unlock (vma->vm_mm); +unlock_vma_mappings (vma);return 0 ; }
@@ -138,10 +142,14 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);vmlist_modify_lock (vma->vm_mm); vma->vm_end = start; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n); +if (vma->vm_anon) +__anon_dup (vma, n);vmlist_modify_unlock (vma->vm_mm); +unlock_vma_mappings (vma);return 0 ; }
@@ -172,6 +180,7 @@ vma->vm_ops->open (left); vma->vm_ops->open (right); } +lock_vma_mappings (vma);vmlist_modify_lock (vma->vm_mm); vma->vm_pgoff += (start - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = start;
@@ -179,9 +188,14 @@ vma->vm_flags = newflags; vma->vm_raend =0 ; vma->vm_page_prot = prot; -insert_vm_struct (current->mm, left); -insert_vm_struct (current->mm, right); +__insert_vm_struct (current->mm, left); +__insert_vm_struct (current->mm, right); +if (vma->vm_anon) { +__anon_dup (vma, left); +__anon_dup (vma, right); + }vmlist_modify_unlock (vma->vm_mm); +unlock_vma_mappings (vma);return 0 ; }
Index: mm/mremap.c
===================================================================
RCS file: /cvs/linux/mm/mremap.c,v
retrieving revision 1.34
mremap.c +5 -1
@@ -141,10 +141,14 @@get_file (new_vma->vm_file);if (new_vma->vm_ops && new_vma->vm_ops->open) new_vma->vm_ops->open (new_vma); +lock_vma_mappings (vma);vmlist_modify_lock (current->mm); -insert_vm_struct (current->mm, new_vma); +__insert_vm_struct (current->mm, new_vma); +if (vma->vm_anon) +__anon_dup (vma, new_vma);merge_segments (current->mm, new_vma->vm_start, new_vma->vm_end);vmlist_modify_unlock (vma->vm_mm); +unlock_vma_mappings (vma);do_munmap (current->mm, addr, old_len); current->mm->total_vm += new_len >>PAGE_SHIFT ;if (new_vma->vm_flags &VM_LOCKED ) {
Index: mm/page_alloc.c
===================================================================
RCS file: /cvs/linux/mm/page_alloc.c,v
retrieving revision 1.85
page_alloc.c +9 -11
@@ -24,6 +24,8 @@#define NUMNODES numnodes#endif +extern int nr_anon_pages; +int nr_swap_pages =0 ;int nr_lru_pages =0 ;pg_data_t *pgdat_list = (pg_data_t *)0 ;
@@ -273,8 +275,6 @@struct page *__alloc_pages (zonelist_t *zonelist,unsigned long order) {zone_t **zone = zonelist->zones; -int gfp_mask = zonelist->gfp_mask; -static int low_on_memory;/* * If this is a recursive call, we'd better
@@ -284,11 +284,6 @@if (current->flags &PF_MEMALLOC ) goto allocate_ok; -/* If we're a memory hog, unmap some pages */ -if (current->hog && low_on_memory && - (gfp_mask & __GFP_WAIT)) -swap_out (4 , gfp_mask); -/* * (If anyone calls gfp from interrupts nonatomically then it * will sooner or later tripped up by a schedule().)
@@ -306,13 +301,11 @@/* Are we supposed to free memory? Don't make it worse.. */ if (!z->zone_wake_kswapd && z->free_pages > z->pages_low) {struct page *page =rmqueue (z, order); - low_on_memory =0 ;if (page)return page; } } - low_on_memory =1 ;/* * Ok, no obvious zones were available, start * balancing things a bit..
@@ -396,8 +389,9 @@nr_free_pages () << (PAGE_SHIFT -10 ), nr_free_highpages() << (PAGE_SHIFT-10)); - printk("( Free: %d, lru_cache: %d (%d %d %d) )\n", + printk("( Free: %d, anon: %d lru_cache: %d (%d %d %d) )\n", nr_free_pages(), + nr_anon_pages, nr_lru_pages, freepages.min, freepages.low,
@@ -539,7 +533,11 @@ freepages.min += i; freepages.low += i *2 ; freepages.high += i *3 ; -memlist_init (&lru_cache); +memlist_init (&lru_active); +memlist_init (&lru_inactive); +memlist_init (&lru_dirty); + inactive_pages =0 ; + inactive_goal = realtotalpages /3 ;/* * Some architectures (with lots of mem and discontinous memory
Index: mm/page_io.c
===================================================================
RCS file: /cvs/linux/mm/page_io.c,v
retrieving revision 1.35
page_io.c +9 -8
@@ -89,8 +89,9 @@return 1 ;wait_on_page (page); +/* This shouldn't happen, but check to be sure. */ -if (page_count (page) ==0 ) +if (page_count (page) <=1 )printk (KERN_ERR "rw_swap_page: page unused while waiting!\n" );return 1 ;
@@ -101,21 +102,21 @@* that all swap pages go through the swap cache! We verify that: * - the page is locked * - it's marked as being swap-cache -* - it's associated with the swap inode +* - if we're writing, it is in the anon cache +* - it has a valid swap handle */ void rw_swap_page (int rw,struct page *page,int wait) { -swp_entry_t entry; - - entry.val = page->index; -if (!PageLocked (page))PAGE_BUG (page);if (!PageSwapCache (page))PAGE_BUG (page); -if (page->mapping != &swapper_space) +if (rw ==WRITE && !PageAnon (page))PAGE_BUG (page); -if (!rw_swap_page_base (rw, entry, page, wait)) +if (!page->swapid.val) +PAGE_BUG (page); + +if (!rw_swap_page_base (rw, page->swapid, page, wait))UnlockPage (page); }
Index: mm/swap_state.c
===================================================================
RCS file: /cvs/linux/mm/swap_state.c,v
retrieving revision 1.35
swap_state.c +97 -45
244 lines not on this page · raw message
Index: mm/swapfile.c
===================================================================
RCS file: /cvs/linux/mm/swapfile.c,v
retrieving revision 1.72
swapfile.c +5 -3
@@ -211,9 +211,9 @@ goto new_swap_entry;/* We have the old entry in the page offset still */ -if (!page->index) +if (!page->swapid.val) goto new_swap_entry; - entry.val = page->index; + entry = page->swapid; type =SWP_TYPE (entry);if (type >= nr_swapfiles) goto new_swap_entry;
@@ -271,6 +271,8 @@ }if (pte_val (pte) != entry.val)return ; +if (anon_page_add (vma, address, page)) +return ;set_pte (dir,pte_mkdirty (mk_pte (page, vma->vm_page_prot)));swap_free (entry);get_page (page);
@@ -934,7 +936,7 @@swp_entry_t entry;int retval =0 ; - entry.val = page->index; + entry = page->swapid;if (!entry.val) goto bad_entry; type =SWP_TYPE (entry);
Index: mm/vmscan.c
===================================================================
RCS file: /cvs/linux/mm/vmscan.c,v
retrieving revision 1.97
vmscan.c +592 -442
1,123 lines not on this page · raw message
anon.c new file +406 -0
202 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
----- End forwarded message -----
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux.eu.org/Linux-MM/
Part of the diff is not shown here. View the raw message.