perf tools: Use sscanf for parsing /proc/pid/maps
When reading those files to synthesize MMAP events. It makes the code shorter and cleaner. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1352643651-13891-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								0020ce2386
							
						
					
				
			
			
				commit
				
					
						6064803313
					
				
			
		
					 1 changed files with 28 additions and 40 deletions
				
			
		| 
						 | 
					@ -193,55 +193,43 @@ static int perf_event__synthesize_mmap_events(struct perf_tool *tool,
 | 
				
			||||||
	event->header.misc = PERF_RECORD_MISC_USER;
 | 
						event->header.misc = PERF_RECORD_MISC_USER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (1) {
 | 
						while (1) {
 | 
				
			||||||
		char bf[BUFSIZ], *pbf = bf;
 | 
							char bf[BUFSIZ];
 | 
				
			||||||
		int n;
 | 
							char prot[5];
 | 
				
			||||||
 | 
							char execname[PATH_MAX];
 | 
				
			||||||
 | 
							char anonstr[] = "//anon";
 | 
				
			||||||
		size_t size;
 | 
							size_t size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (fgets(bf, sizeof(bf), fp) == NULL)
 | 
							if (fgets(bf, sizeof(bf), fp) == NULL)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* ensure null termination since stack will be reused. */
 | 
				
			||||||
 | 
							strcpy(execname, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* 00400000-0040c000 r-xp 00000000 fd:01 41038  /bin/cat */
 | 
							/* 00400000-0040c000 r-xp 00000000 fd:01 41038  /bin/cat */
 | 
				
			||||||
		n = hex2u64(pbf, &event->mmap.start);
 | 
							sscanf(bf, "%"PRIx64"-%"PRIx64" %s %"PRIx64" %*x:%*x %*u %s\n",
 | 
				
			||||||
		if (n < 0)
 | 
							       &event->mmap.start, &event->mmap.len, prot,
 | 
				
			||||||
 | 
							       &event->mmap.pgoff, execname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (prot[2] != 'x')
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		pbf += n + 1;
 | 
					 | 
				
			||||||
		n = hex2u64(pbf, &event->mmap.len);
 | 
					 | 
				
			||||||
		if (n < 0)
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		pbf += n + 3;
 | 
					 | 
				
			||||||
		if (*pbf == 'x') { /* vm_exec */
 | 
					 | 
				
			||||||
			char anonstr[] = "//anon\n";
 | 
					 | 
				
			||||||
			char *execname = strchr(bf, '/');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* Catch VDSO */
 | 
							if (!strcmp(execname, ""))
 | 
				
			||||||
			if (execname == NULL)
 | 
								strcpy(execname, anonstr);
 | 
				
			||||||
				execname = strstr(bf, "[vdso]");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* Catch anonymous mmaps */
 | 
							size = strlen(execname) + 1;
 | 
				
			||||||
			if ((execname == NULL) && !strstr(bf, "["))
 | 
							memcpy(event->mmap.filename, execname, size);
 | 
				
			||||||
				execname = anonstr;
 | 
							size = PERF_ALIGN(size, sizeof(u64));
 | 
				
			||||||
 | 
							event->mmap.len -= event->mmap.start;
 | 
				
			||||||
 | 
							event->mmap.header.size = (sizeof(event->mmap) -
 | 
				
			||||||
 | 
										   (sizeof(event->mmap.filename) - size));
 | 
				
			||||||
 | 
							memset(event->mmap.filename + size, 0, machine->id_hdr_size);
 | 
				
			||||||
 | 
							event->mmap.header.size += machine->id_hdr_size;
 | 
				
			||||||
 | 
							event->mmap.pid = tgid;
 | 
				
			||||||
 | 
							event->mmap.tid = pid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (execname == NULL)
 | 
							if (process(tool, event, &synth_sample, machine) != 0) {
 | 
				
			||||||
				continue;
 | 
								rc = -1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
			pbf += 3;
 | 
					 | 
				
			||||||
			n = hex2u64(pbf, &event->mmap.pgoff);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			size = strlen(execname);
 | 
					 | 
				
			||||||
			execname[size - 1] = '\0'; /* Remove \n */
 | 
					 | 
				
			||||||
			memcpy(event->mmap.filename, execname, size);
 | 
					 | 
				
			||||||
			size = PERF_ALIGN(size, sizeof(u64));
 | 
					 | 
				
			||||||
			event->mmap.len -= event->mmap.start;
 | 
					 | 
				
			||||||
			event->mmap.header.size = (sizeof(event->mmap) -
 | 
					 | 
				
			||||||
					        (sizeof(event->mmap.filename) - size));
 | 
					 | 
				
			||||||
			memset(event->mmap.filename + size, 0, machine->id_hdr_size);
 | 
					 | 
				
			||||||
			event->mmap.header.size += machine->id_hdr_size;
 | 
					 | 
				
			||||||
			event->mmap.pid = tgid;
 | 
					 | 
				
			||||||
			event->mmap.tid = pid;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (process(tool, event, &synth_sample, machine) != 0) {
 | 
					 | 
				
			||||||
				rc = -1;
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue