diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-alpha/mman.h 2.6.12-madvise/include/asm-alpha/mman.h --- /home/linux/views/linux-2.6.12/include/asm-alpha/mman.h 2003-12-17 18:58:04.000000000 -0800 +++ 2.6.12-madvise/include/asm-alpha/mman.h 2005-07-06 09:27:11.000000000 -0700 @@ -42,6 +42,7 @@ #define MADV_WILLNEED 3 /* will need these pages */ #define MADV_SPACEAVAIL 5 /* ensure resources are available */ #define MADV_DONTNEED 6 /* don't need these pages */ +#define MADV_DISCARD 7 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-arm/mman.h 2.6.12-madvise/include/asm-arm/mman.h --- /home/linux/views/linux-2.6.12/include/asm-arm/mman.h 2003-12-17 18:58:39.000000000 -0800 +++ 2.6.12-madvise/include/asm-arm/mman.h 2005-07-06 09:28:31.000000000 -0700 @@ -35,6 +35,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-arm26/mman.h 2.6.12-madvise/include/asm-arm26/mman.h --- /home/linux/views/linux-2.6.12/include/asm-arm26/mman.h 2003-12-17 18:58:04.000000000 -0800 +++ 2.6.12-madvise/include/asm-arm26/mman.h 2005-07-06 09:28:40.000000000 -0700 @@ -35,6 +35,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-cris/mman.h 2.6.12-madvise/include/asm-cris/mman.h --- /home/linux/views/linux-2.6.12/include/asm-cris/mman.h 2003-12-17 18:59:44.000000000 -0800 +++ 2.6.12-madvise/include/asm-cris/mman.h 2005-07-06 09:28:53.000000000 -0700 @@ -37,6 +37,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-frv/mman.h 2.6.12-madvise/include/asm-frv/mman.h --- /home/linux/views/linux-2.6.12/include/asm-frv/mman.h 2005-03-02 03:00:08.000000000 -0800 +++ 2.6.12-madvise/include/asm-frv/mman.h 2005-07-06 09:29:01.000000000 -0700 @@ -35,6 +35,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-h8300/mman.h 2.6.12-madvise/include/asm-h8300/mman.h --- /home/linux/views/linux-2.6.12/include/asm-h8300/mman.h 2005-06-17 17:21:39.000000000 -0700 +++ 2.6.12-madvise/include/asm-h8300/mman.h 2005-07-06 09:29:05.000000000 -0700 @@ -35,6 +35,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-i386/mman.h 2.6.12-madvise/include/asm-i386/mman.h --- /home/linux/views/linux-2.6.12/include/asm-i386/mman.h 2003-12-17 18:58:15.000000000 -0800 +++ 2.6.12-madvise/include/asm-i386/mman.h 2005-07-06 09:29:10.000000000 -0700 @@ -35,6 +35,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-ia64/mman.h 2.6.12-madvise/include/asm-ia64/mman.h --- /home/linux/views/linux-2.6.12/include/asm-ia64/mman.h 2004-04-05 16:25:06.000000000 -0700 +++ 2.6.12-madvise/include/asm-ia64/mman.h 2005-07-06 09:29:14.000000000 -0700 @@ -43,6 +43,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-m32r/mman.h 2.6.12-madvise/include/asm-m32r/mman.h --- /home/linux/views/linux-2.6.12/include/asm-m32r/mman.h 2004-10-18 15:51:10.000000000 -0700 +++ 2.6.12-madvise/include/asm-m32r/mman.h 2005-07-06 09:29:20.000000000 -0700 @@ -37,6 +37,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-m68k/mman.h 2.6.12-madvise/include/asm-m68k/mman.h --- /home/linux/views/linux-2.6.12/include/asm-m68k/mman.h 2003-12-17 18:58:16.000000000 -0800 +++ 2.6.12-madvise/include/asm-m68k/mman.h 2005-07-06 09:29:25.000000000 -0700 @@ -35,6 +35,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-mips/mman.h 2.6.12-madvise/include/asm-mips/mman.h --- /home/linux/views/linux-2.6.12/include/asm-mips/mman.h 2003-12-17 18:58:39.000000000 -0800 +++ 2.6.12-madvise/include/asm-mips/mman.h 2005-07-06 09:29:37.000000000 -0700 @@ -65,6 +65,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-parisc/mman.h 2.6.12-madvise/include/asm-parisc/mman.h --- /home/linux/views/linux-2.6.12/include/asm-parisc/mman.h 2003-12-17 18:58:58.000000000 -0800 +++ 2.6.12-madvise/include/asm-parisc/mman.h 2005-07-06 09:32:51.000000000 -0700 @@ -38,6 +38,7 @@ #define MADV_SPACEAVAIL 5 /* insure that resources are reserved */ #define MADV_VPS_PURGE 6 /* Purge pages from VM page cache */ #define MADV_VPS_INHERIT 7 /* Inherit parents page size */ +#define MADV_DISCARD 8 /* free memory and page cache now */ /* The range 12-64 is reserved for page size specification. */ #define MADV_4K_PAGES 12 /* Use 4K pages */ diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-ppc/mman.h 2.6.12-madvise/include/asm-ppc/mman.h --- /home/linux/views/linux-2.6.12/include/asm-ppc/mman.h 2003-12-17 19:00:03.000000000 -0800 +++ 2.6.12-madvise/include/asm-ppc/mman.h 2005-07-06 09:33:13.000000000 -0700 @@ -36,6 +36,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-ppc64/mman.h 2.6.12-madvise/include/asm-ppc64/mman.h --- /home/linux/views/linux-2.6.12/include/asm-ppc64/mman.h 2003-12-17 18:58:47.000000000 -0800 +++ 2.6.12-madvise/include/asm-ppc64/mman.h 2005-07-06 09:33:25.000000000 -0700 @@ -44,6 +44,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-s390/mman.h 2.6.12-madvise/include/asm-s390/mman.h --- /home/linux/views/linux-2.6.12/include/asm-s390/mman.h 2003-12-17 18:58:08.000000000 -0800 +++ 2.6.12-madvise/include/asm-s390/mman.h 2005-07-06 09:33:36.000000000 -0700 @@ -43,6 +43,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-sh/mman.h 2.6.12-madvise/include/asm-sh/mman.h --- /home/linux/views/linux-2.6.12/include/asm-sh/mman.h 2003-12-17 18:59:27.000000000 -0800 +++ 2.6.12-madvise/include/asm-sh/mman.h 2005-07-06 09:33:57.000000000 -0700 @@ -35,6 +35,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-sparc/mman.h 2.6.12-madvise/include/asm-sparc/mman.h --- /home/linux/views/linux-2.6.12/include/asm-sparc/mman.h 2003-12-17 18:59:43.000000000 -0800 +++ 2.6.12-madvise/include/asm-sparc/mman.h 2005-07-06 09:35:02.000000000 -0700 @@ -54,6 +54,7 @@ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ +#define MADV_DISCARD 0x6 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-sparc64/mman.h 2.6.12-madvise/include/asm-sparc64/mman.h --- /home/linux/views/linux-2.6.12/include/asm-sparc64/mman.h 2003-12-17 18:58:49.000000000 -0800 +++ 2.6.12-madvise/include/asm-sparc64/mman.h 2005-07-06 09:35:15.000000000 -0700 @@ -54,6 +54,7 @@ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ +#define MADV_DISCARD 0x6 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-v850/mman.h 2.6.12-madvise/include/asm-v850/mman.h --- /home/linux/views/linux-2.6.12/include/asm-v850/mman.h 2003-12-17 18:59:26.000000000 -0800 +++ 2.6.12-madvise/include/asm-v850/mman.h 2005-07-06 09:35:35.000000000 -0700 @@ -32,6 +32,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/include/asm-x86_64/mman.h 2.6.12-madvise/include/asm-x86_64/mman.h --- /home/linux/views/linux-2.6.12/include/asm-x86_64/mman.h 2003-12-17 18:59:05.000000000 -0800 +++ 2.6.12-madvise/include/asm-x86_64/mman.h 2005-07-06 09:35:40.000000000 -0700 @@ -36,6 +36,7 @@ #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ #define MADV_WILLNEED 0x3 /* pre-fault pages */ #define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_DISCARD 0x5 /* free memory and page cache now */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff -purN -X /home/dvhart/.diff.exclude /home/linux/views/linux-2.6.12/mm/madvise.c 2.6.12-madvise/mm/madvise.c --- /home/linux/views/linux-2.6.12/mm/madvise.c 2005-03-02 03:00:18.000000000 -0800 +++ 2.6.12-madvise/mm/madvise.c 2005-07-06 10:15:09.000000000 -0700 @@ -111,6 +111,37 @@ static long madvise_dontneed(struct vm_a return 0; } +static long madvise_discard(struct vm_area_struct * vma, + unsigned long start, unsigned long end) +{ + struct semaphore *i_sem; + loff_t offset; + + if (vma->vm_file && vma->vm_file->f_mapping) { + if (vma->vm_file->f_mapping == &swapper_space) { + printk("%s: vma (%p)'s mapping is swapper_space\n", __FUNCTION__, vma); + return -EINVAL; + } + + if (!vma->vm_file->f_mapping->host) { + printk("%s: vma (%p)'s mapping->host is null\n", __FUNCTION__, vma); + return -EINVAL; + } + + /* looks good, try and rip it out of page cache */ + printk("%s: trying to rip shm vma (%p) inode from page cache\n", __FUNCTION__, vma); + i_sem = &vma->vm_file->f_mapping->host->i_sem; + offset = (loff_t)(start - vma->vm_start); + printk("%s: call truncate_inode_pages(%p, %x\n", __FUNCTION__, + vma->vm_file->f_mapping, (unsigned int)offset); + down(i_sem); + truncate_inode_pages(vma->vm_file->f_mapping, offset); + up(i_sem); + } + + return 0; +} + static long madvise_vma(struct vm_area_struct * vma, unsigned long start, unsigned long end, int behavior) { @@ -130,6 +161,9 @@ static long madvise_vma(struct vm_area_s case MADV_DONTNEED: error = madvise_dontneed(vma, start, end); break; + case MADV_DISCARD: + error = madvise_discard(vma, start, end); + break; default: error = -EINVAL;