On Fri, 17 Feb 2012 18:24:26 +0900 KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> wrote: > > This patch set is for removing 2 flags PCG_FILE_MAPPED and PCG_MOVE_LOCK on > page_cgroup->flags. After this, page_cgroup has only 3bits of flags. > And, this set introduces a new method to update page status accounting per memcg. > With it, we don't have to add new flags onto page_cgroup if 'struct page' has > information. This will be good for avoiding a new flag for page_cgroup. > > Fixed pointed out parts. > - added more comments > - fixed texts > - removed redundant arguments. > > Passed some tests on 3.3.0-rc3-next-20120216. > Here is a micro benchmark test before/after this series. mmap 1G bytes twice and repeat fault->drop repeatedly. (test program is attached) == Before == 3 runs after 1st run [root@bluextal test]# time ./mmap 1G real 0m21.053s user 0m6.046s sys 0m14.743s [root@bluextal test]# time ./mmap 1G real 0m21.302s user 0m6.027s sys 0m14.979s [root@bluextal test]# time ./mmap 1G real 0m21.061s user 0m6.020s sys 0m14.722s == After == 3 runs after 1st run [root@bluextal test]# time ./mmap 1G real 0m20.969s user 0m5.960s sys 0m14.777s [root@bluextal test]# time ./mmap 1G real 0m20.968s user 0m6.069s sys 0m14.650s [root@bluextal test]# time ./mmap 1G real 0m21.164s user 0m6.152s sys 0m14.707s I think there is no regression. Thanks, -Kame
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <sys/mman.h> #include <fcntl.h> void reader(int fd, int size) { int i, off, x; char *addr; addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); for (i = 0; i < 100; i++) { for(off = 0; off < size; off += 4096) { x += *(addr + off); } madvise(addr, size, MADV_DONTNEED); } } int main(int argc, char *argv[]) { int fd; char *addr, *c; unsigned long size; struct stat statbuf; fd = open(argv[1], O_RDONLY); if (fd < 0) { perror("cannot open file"); return 1; } if (fstat(fd, &statbuf)) { perror("fstat failed"); return 1; } size = statbuf.st_size; /* mmap in 2 place. */ addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); mlock(addr, size); reader(fd, size); }