Messages in this thread | | | Date | Sun, 5 Oct 2008 02:13:39 +0400 | From | Alexey Dobriyan <> | Subject | Re: [PATCH 2/2] Report the pagesize backing a VMA in /proc/pid/maps |
| |
On Fri, Oct 03, 2008 at 05:46:55PM +0100, Mel Gorman wrote: > This patch adds a new field for hugepage-backed memory regions to show the > pagesize in /proc/pid/maps. While the information is available in smaps, > maps is more human-readable and does not incur the cost of calculating Pss. An > example of a /proc/self/maps output for an application using hugepages with > this patch applied is; > > 08048000-0804c000 r-xp 00000000 03:01 49135 /bin/cat > 0804c000-0804d000 rw-p 00003000 03:01 49135 /bin/cat > 08400000-08800000 rw-p 00000000 00:10 4055 /mnt/libhugetlbfs.tmp.QzPPTJ (deleted) (hpagesize=4096kB)
> To be predictable for parsers, the patch adds the notion of reporting on VMA > attributes by appending one or more fields that look like "(attribute)". This > already happens when a file is deleted and the user sees (deleted) after the > filename. The expectation is that existing parsers will not break as those > that read the filename should be reading forward after the inode number > and stopping when it sees something that is not part of the filename. > Parsers that assume everything after / is a filename will get confused by > (hpagesize=XkB) but are already broken due to (deleted).
Looks like procps will start showing hpagesize tag as a mapping name (apologies for pasting crappy code):
static const char *mapping_name(proc_t *p, unsigned KLONG addr, unsigned KLONG len, const char *mapbuf, unsigned showpath, unsigned dev_major, unsigned dev_minor, unsigned long long inode){ const char *cp;
if(!dev_major && dev_minor==shm_minor && strstr(mapbuf,"/SYSV")){ static char shmbuf[64]; snprintf(shmbuf, sizeof shmbuf, " [ shmid=0x%Lx ]", inode); return shmbuf; }
cp = strrchr(mapbuf,'/'); if(cp){ if(showpath) return strchr(mapbuf,'/'); return cp[1] ? cp+1 : cp; }
cp = strchr(mapbuf,'/'); if(cp){ if(showpath) return cp; return strrchr(cp,'/') + 1; // it WILL succeed }
cp = " [ anon ]"; if( (p->start_stack >= addr) && (p->start_stack <= addr+len) ) cp = " [ stack ]"; return cp; }
static int one_proc(proc_t *p){
...
while(fgets(mapbuf,sizeof mapbuf,stdin)){
...
if(x_option){ const char *cp = mapping_name(p, start, diff, mapbuf, 0, dev_major, dev_minor, inode); printf( (sizeof(KLONG)==8) ? "%016"KLF"x %7lu - - - %s %s\n" : "%08lx %7lu - - - %s %s\n", start, (unsigned long)(diff>>10), flags, cp ); }
| |