perf trace: Allow syscall arg formatters to mask args
The futex syscall ignores some arguments according to the 'operation' arg, so allow arg formatters to mask those. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-abqrg3oldgfsdnltfrvso9f7@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								7bfb7e6bdd
							
						
					
				
			
			
				commit
				
					
						6e7eeb5110
					
				
			
		
					 1 changed files with 22 additions and 11 deletions
				
			
		|  | @ -15,14 +15,16 @@ | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <sys/mman.h> | #include <sys/mman.h> | ||||||
| 
 | 
 | ||||||
| static size_t syscall_arg__scnprintf_hex(char *bf, size_t size, unsigned long arg) | static size_t syscall_arg__scnprintf_hex(char *bf, size_t size, | ||||||
|  | 					 unsigned long arg, u8 *arg_mask __maybe_unused) | ||||||
| { | { | ||||||
| 	return scnprintf(bf, size, "%#lx", arg); | 	return scnprintf(bf, size, "%#lx", arg); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #define SCA_HEX syscall_arg__scnprintf_hex | #define SCA_HEX syscall_arg__scnprintf_hex | ||||||
| 
 | 
 | ||||||
| static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, unsigned long arg) | static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, | ||||||
|  | 					       unsigned long arg, u8 *arg_mask __maybe_unused) | ||||||
| { | { | ||||||
| 	int printed = 0, prot = arg; | 	int printed = 0, prot = arg; | ||||||
| 
 | 
 | ||||||
|  | @ -52,7 +54,8 @@ static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, unsigned l | ||||||
| 
 | 
 | ||||||
| #define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot | #define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot | ||||||
| 
 | 
 | ||||||
| static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, unsigned long arg) | static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, | ||||||
|  | 						unsigned long arg, u8 *arg_mask __maybe_unused) | ||||||
| { | { | ||||||
| 	int printed = 0, flags = arg; | 	int printed = 0, flags = arg; | ||||||
| 
 | 
 | ||||||
|  | @ -92,7 +95,8 @@ static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, unsigned | ||||||
| 
 | 
 | ||||||
| #define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags | #define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags | ||||||
| 
 | 
 | ||||||
| static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, unsigned long arg) | static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, | ||||||
|  | 						      unsigned long arg, u8 *arg_mask __maybe_unused) | ||||||
| { | { | ||||||
| 	int behavior = arg; | 	int behavior = arg; | ||||||
| 
 | 
 | ||||||
|  | @ -136,7 +140,7 @@ static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, uns | ||||||
| static struct syscall_fmt { | static struct syscall_fmt { | ||||||
| 	const char *name; | 	const char *name; | ||||||
| 	const char *alias; | 	const char *alias; | ||||||
| 	size_t	   (*arg_scnprintf[6])(char *bf, size_t size, unsigned long arg); | 	size_t	   (*arg_scnprintf[6])(char *bf, size_t size, unsigned long arg, u8 *arg_mask); | ||||||
| 	bool	   errmsg; | 	bool	   errmsg; | ||||||
| 	bool	   timeout; | 	bool	   timeout; | ||||||
| 	bool	   hexret; | 	bool	   hexret; | ||||||
|  | @ -198,7 +202,8 @@ struct syscall { | ||||||
| 	const char	    *name; | 	const char	    *name; | ||||||
| 	bool		    filtered; | 	bool		    filtered; | ||||||
| 	struct syscall_fmt  *fmt; | 	struct syscall_fmt  *fmt; | ||||||
| 	size_t		    (**arg_scnprintf)(char *bf, size_t size, unsigned long arg); | 	size_t		    (**arg_scnprintf)(char *bf, size_t size, | ||||||
|  | 					      unsigned long arg, u8 *args_mask); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static size_t fprintf_duration(unsigned long t, FILE *fp) | static size_t fprintf_duration(unsigned long t, FILE *fp) | ||||||
|  | @ -443,17 +448,23 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size, | ||||||
| 
 | 
 | ||||||
| 	if (sc->tp_format != NULL) { | 	if (sc->tp_format != NULL) { | ||||||
| 		struct format_field *field; | 		struct format_field *field; | ||||||
|  | 		u8 mask = 0, bit = 1; | ||||||
|  | 
 | ||||||
|  | 		for (field = sc->tp_format->format.fields->next; field; | ||||||
|  | 		     field = field->next, ++i, bit <<= 1) { | ||||||
|  | 			if (mask & bit) | ||||||
|  | 				continue; | ||||||
| 
 | 
 | ||||||
| 		for (field = sc->tp_format->format.fields->next; field; field = field->next) { |  | ||||||
| 			printed += scnprintf(bf + printed, size - printed, | 			printed += scnprintf(bf + printed, size - printed, | ||||||
| 					     "%s%s: ", printed ? ", " : "", field->name); | 					     "%s%s: ", printed ? ", " : "", field->name); | ||||||
| 
 | 
 | ||||||
| 			if (sc->arg_scnprintf && sc->arg_scnprintf[i]) | 			if (sc->arg_scnprintf && sc->arg_scnprintf[i]) { | ||||||
| 				printed += sc->arg_scnprintf[i](bf + printed, size - printed, args[i]); | 				printed += sc->arg_scnprintf[i](bf + printed, size - printed, | ||||||
| 			else | 								args[i], &mask); | ||||||
|  | 			} else { | ||||||
| 				printed += scnprintf(bf + printed, size - printed, | 				printed += scnprintf(bf + printed, size - printed, | ||||||
| 						     "%ld", args[i]); | 						     "%ld", args[i]); | ||||||
|                        ++i; | 			} | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		while (i < 6) { | 		while (i < 6) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Arnaldo Carvalho de Melo
				Arnaldo Carvalho de Melo