mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	perf probe: Replace line_list with intlist
Replace line_list (struct line_node) with intlist for reducing similar codes. Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: "David A. Long" <dave.long@linaro.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: yrl.pp-manager.tt@hitachi.com Link: http://lkml.kernel.org/r/20140206053209.29635.81043.stgit@kbuild-fedora.yrl.intra.hitachi.co.jp Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									f49540b17c
								
							
						
					
					
						commit
						5a62257a3d
					
				| @ -268,9 +268,9 @@ static int opt_set_filter(const struct option *opt __maybe_unused, | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void init_params(void) | static int init_params(void) | ||||||
| { | { | ||||||
| 	line_range__init(¶ms.line_range); | 	return line_range__init(¶ms.line_range); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cleanup_params(void) | static void cleanup_params(void) | ||||||
| @ -515,9 +515,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix) | |||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	init_params(); | 	ret = init_params(); | ||||||
|  | 	if (!ret) { | ||||||
| 		ret = __cmd_probe(argc, argv, prefix); | 		ret = __cmd_probe(argc, argv, prefix); | ||||||
| 		cleanup_params(); | 		cleanup_params(); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -561,7 +561,7 @@ static int _show_one_line(FILE *fp, int l, bool skip, bool show_num) | |||||||
| static int __show_line_range(struct line_range *lr, const char *module) | static int __show_line_range(struct line_range *lr, const char *module) | ||||||
| { | { | ||||||
| 	int l = 1; | 	int l = 1; | ||||||
| 	struct line_node *ln; | 	struct int_node *ln; | ||||||
| 	struct debuginfo *dinfo; | 	struct debuginfo *dinfo; | ||||||
| 	FILE *fp; | 	FILE *fp; | ||||||
| 	int ret; | 	int ret; | ||||||
| @ -614,8 +614,8 @@ static int __show_line_range(struct line_range *lr, const char *module) | |||||||
| 			goto end; | 			goto end; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	list_for_each_entry(ln, &lr->line_list, list) { | 	intlist__for_each(ln, lr->line_list) { | ||||||
| 		for (; ln->line > l; l++) { | 		for (; ln->i > l; l++) { | ||||||
| 			ret = show_one_line(fp, l - lr->offset); | 			ret = show_one_line(fp, l - lr->offset); | ||||||
| 			if (ret < 0) | 			if (ret < 0) | ||||||
| 				goto end; | 				goto end; | ||||||
| @ -775,24 +775,22 @@ int show_available_vars(struct perf_probe_event *pevs __maybe_unused, | |||||||
| 
 | 
 | ||||||
| void line_range__clear(struct line_range *lr) | void line_range__clear(struct line_range *lr) | ||||||
| { | { | ||||||
| 	struct line_node *ln; |  | ||||||
| 
 |  | ||||||
| 	free(lr->function); | 	free(lr->function); | ||||||
| 	free(lr->file); | 	free(lr->file); | ||||||
| 	free(lr->path); | 	free(lr->path); | ||||||
| 	free(lr->comp_dir); | 	free(lr->comp_dir); | ||||||
| 	while (!list_empty(&lr->line_list)) { | 	intlist__delete(lr->line_list); | ||||||
| 		ln = list_first_entry(&lr->line_list, struct line_node, list); |  | ||||||
| 		list_del(&ln->list); |  | ||||||
| 		free(ln); |  | ||||||
| 	} |  | ||||||
| 	memset(lr, 0, sizeof(*lr)); | 	memset(lr, 0, sizeof(*lr)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void line_range__init(struct line_range *lr) | int line_range__init(struct line_range *lr) | ||||||
| { | { | ||||||
| 	memset(lr, 0, sizeof(*lr)); | 	memset(lr, 0, sizeof(*lr)); | ||||||
| 	INIT_LIST_HEAD(&lr->line_list); | 	lr->line_list = intlist__new(NULL); | ||||||
|  | 	if (!lr->line_list) | ||||||
|  | 		return -ENOMEM; | ||||||
|  | 	else | ||||||
|  | 		return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int parse_line_num(char **ptr, int *val, const char *what) | static int parse_line_num(char **ptr, int *val, const char *what) | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
| #define _PROBE_EVENT_H | #define _PROBE_EVENT_H | ||||||
| 
 | 
 | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
|  | #include "intlist.h" | ||||||
| #include "strlist.h" | #include "strlist.h" | ||||||
| #include "strfilter.h" | #include "strfilter.h" | ||||||
| 
 | 
 | ||||||
| @ -76,13 +77,6 @@ struct perf_probe_event { | |||||||
| 	struct perf_probe_arg	*args;	/* Arguments */ | 	struct perf_probe_arg	*args;	/* Arguments */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| /* Line number container */ |  | ||||||
| struct line_node { |  | ||||||
| 	struct list_head	list; |  | ||||||
| 	int			line; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /* Line range */ | /* Line range */ | ||||||
| struct line_range { | struct line_range { | ||||||
| 	char			*file;		/* File name */ | 	char			*file;		/* File name */ | ||||||
| @ -92,7 +86,7 @@ struct line_range { | |||||||
| 	int			offset;		/* Start line offset */ | 	int			offset;		/* Start line offset */ | ||||||
| 	char			*path;		/* Real path name */ | 	char			*path;		/* Real path name */ | ||||||
| 	char			*comp_dir;	/* Compile directory */ | 	char			*comp_dir;	/* Compile directory */ | ||||||
| 	struct list_head	line_list;	/* Visible lines */ | 	struct intlist		*line_list;	/* Visible lines */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* List of variables */ | /* List of variables */ | ||||||
| @ -124,7 +118,7 @@ extern int parse_line_range_desc(const char *cmd, struct line_range *lr); | |||||||
| extern void line_range__clear(struct line_range *lr); | extern void line_range__clear(struct line_range *lr); | ||||||
| 
 | 
 | ||||||
| /* Initialize line range */ | /* Initialize line range */ | ||||||
| extern void line_range__init(struct line_range *lr); | extern int line_range__init(struct line_range *lr); | ||||||
| 
 | 
 | ||||||
| /* Internal use: Return kernel/module path */ | /* Internal use: Return kernel/module path */ | ||||||
| extern const char *kernel_get_module_path(const char *module); | extern const char *kernel_get_module_path(const char *module); | ||||||
|  | |||||||
| @ -35,6 +35,7 @@ | |||||||
| #include <linux/bitops.h> | #include <linux/bitops.h> | ||||||
| #include "event.h" | #include "event.h" | ||||||
| #include "debug.h" | #include "debug.h" | ||||||
|  | #include "intlist.h" | ||||||
| #include "util.h" | #include "util.h" | ||||||
| #include "symbol.h" | #include "symbol.h" | ||||||
| #include "probe-finder.h" | #include "probe-finder.h" | ||||||
| @ -42,65 +43,6 @@ | |||||||
| /* Kprobe tracer basic type is up to u64 */ | /* Kprobe tracer basic type is up to u64 */ | ||||||
| #define MAX_BASIC_TYPE_BITS	64 | #define MAX_BASIC_TYPE_BITS	64 | ||||||
| 
 | 
 | ||||||
| /* Line number list operations */ |  | ||||||
| 
 |  | ||||||
| /* Add a line to line number list */ |  | ||||||
| static int line_list__add_line(struct list_head *head, int line) |  | ||||||
| { |  | ||||||
| 	struct line_node *ln; |  | ||||||
| 	struct list_head *p; |  | ||||||
| 
 |  | ||||||
| 	/* Reverse search, because new line will be the last one */ |  | ||||||
| 	list_for_each_entry_reverse(ln, head, list) { |  | ||||||
| 		if (ln->line < line) { |  | ||||||
| 			p = &ln->list; |  | ||||||
| 			goto found; |  | ||||||
| 		} else if (ln->line == line)	/* Already exist */ |  | ||||||
| 			return 1; |  | ||||||
| 	} |  | ||||||
| 	/* List is empty, or the smallest entry */ |  | ||||||
| 	p = head; |  | ||||||
| found: |  | ||||||
| 	pr_debug("line list: add a line %u\n", line); |  | ||||||
| 	ln = zalloc(sizeof(struct line_node)); |  | ||||||
| 	if (ln == NULL) |  | ||||||
| 		return -ENOMEM; |  | ||||||
| 	ln->line = line; |  | ||||||
| 	INIT_LIST_HEAD(&ln->list); |  | ||||||
| 	list_add(&ln->list, p); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Check if the line in line number list */ |  | ||||||
| static int line_list__has_line(struct list_head *head, int line) |  | ||||||
| { |  | ||||||
| 	struct line_node *ln; |  | ||||||
| 
 |  | ||||||
| 	/* Reverse search, because new line will be the last one */ |  | ||||||
| 	list_for_each_entry(ln, head, list) |  | ||||||
| 		if (ln->line == line) |  | ||||||
| 			return 1; |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Init line number list */ |  | ||||||
| static void line_list__init(struct list_head *head) |  | ||||||
| { |  | ||||||
| 	INIT_LIST_HEAD(head); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Free line number list */ |  | ||||||
| static void line_list__free(struct list_head *head) |  | ||||||
| { |  | ||||||
| 	struct line_node *ln; |  | ||||||
| 	while (!list_empty(head)) { |  | ||||||
| 		ln = list_first_entry(head, struct line_node, list); |  | ||||||
| 		list_del(&ln->list); |  | ||||||
| 		free(ln); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Dwarf FL wrappers */ | /* Dwarf FL wrappers */ | ||||||
| static char *debuginfo_path;	/* Currently dummy */ | static char *debuginfo_path;	/* Currently dummy */ | ||||||
| 
 | 
 | ||||||
| @ -880,7 +822,7 @@ static int find_probe_point_by_line(struct probe_finder *pf) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Find lines which match lazy pattern */ | /* Find lines which match lazy pattern */ | ||||||
| static int find_lazy_match_lines(struct list_head *head, | static int find_lazy_match_lines(struct intlist *list, | ||||||
| 				 const char *fname, const char *pat) | 				 const char *fname, const char *pat) | ||||||
| { | { | ||||||
| 	FILE *fp; | 	FILE *fp; | ||||||
| @ -901,7 +843,7 @@ static int find_lazy_match_lines(struct list_head *head, | |||||||
| 			line[len - 1] = '\0'; | 			line[len - 1] = '\0'; | ||||||
| 
 | 
 | ||||||
| 		if (strlazymatch(line, pat)) { | 		if (strlazymatch(line, pat)) { | ||||||
| 			line_list__add_line(head, linenum); | 			intlist__add(list, linenum); | ||||||
| 			count++; | 			count++; | ||||||
| 		} | 		} | ||||||
| 		linenum++; | 		linenum++; | ||||||
| @ -924,7 +866,7 @@ static int probe_point_lazy_walker(const char *fname, int lineno, | |||||||
| 	Dwarf_Die *sc_die, die_mem; | 	Dwarf_Die *sc_die, die_mem; | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	if (!line_list__has_line(&pf->lcache, lineno) || | 	if (!intlist__has_entry(pf->lcache, lineno) || | ||||||
| 	    strtailcmp(fname, pf->fname) != 0) | 	    strtailcmp(fname, pf->fname) != 0) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| @ -952,9 +894,9 @@ static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf) | |||||||
| { | { | ||||||
| 	int ret = 0; | 	int ret = 0; | ||||||
| 
 | 
 | ||||||
| 	if (list_empty(&pf->lcache)) { | 	if (intlist__empty(pf->lcache)) { | ||||||
| 		/* Matching lazy line pattern */ | 		/* Matching lazy line pattern */ | ||||||
| 		ret = find_lazy_match_lines(&pf->lcache, pf->fname, | 		ret = find_lazy_match_lines(pf->lcache, pf->fname, | ||||||
| 					    pf->pev->point.lazy_line); | 					    pf->pev->point.lazy_line); | ||||||
| 		if (ret <= 0) | 		if (ret <= 0) | ||||||
| 			return ret; | 			return ret; | ||||||
| @ -1096,7 +1038,9 @@ static int debuginfo__find_probes(struct debuginfo *dbg, | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	off = 0; | 	off = 0; | ||||||
| 	line_list__init(&pf->lcache); | 	pf->lcache = intlist__new(NULL); | ||||||
|  | 	if (!pf->lcache) | ||||||
|  | 		return -ENOMEM; | ||||||
| 
 | 
 | ||||||
| 	/* Fastpath: lookup by function name from .debug_pubnames section */ | 	/* Fastpath: lookup by function name from .debug_pubnames section */ | ||||||
| 	if (pp->function) { | 	if (pp->function) { | ||||||
| @ -1149,7 +1093,8 @@ static int debuginfo__find_probes(struct debuginfo *dbg, | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| found: | found: | ||||||
| 	line_list__free(&pf->lcache); | 	intlist__delete(pf->lcache); | ||||||
|  | 	pf->lcache = NULL; | ||||||
| 
 | 
 | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| @ -1537,7 +1482,7 @@ static int line_range_add_line(const char *src, unsigned int lineno, | |||||||
| 		if (lr->path == NULL) | 		if (lr->path == NULL) | ||||||
| 			return -ENOMEM; | 			return -ENOMEM; | ||||||
| 	} | 	} | ||||||
| 	return line_list__add_line(&lr->line_list, lineno); | 	return intlist__add(lr->line_list, lineno); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int line_range_walk_cb(const char *fname, int lineno, | static int line_range_walk_cb(const char *fname, int lineno, | ||||||
| @ -1565,7 +1510,7 @@ static int find_line_range_by_line(Dwarf_Die *sp_die, struct line_finder *lf) | |||||||
| 
 | 
 | ||||||
| 	/* Update status */ | 	/* Update status */ | ||||||
| 	if (ret >= 0) | 	if (ret >= 0) | ||||||
| 		if (!list_empty(&lf->lr->line_list)) | 		if (!intlist__empty(lf->lr->line_list)) | ||||||
| 			ret = lf->found = 1; | 			ret = lf->found = 1; | ||||||
| 		else | 		else | ||||||
| 			ret = 0;	/* Lines are not found */ | 			ret = 0;	/* Lines are not found */ | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ | |||||||
| 
 | 
 | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| #include "util.h" | #include "util.h" | ||||||
|  | #include "intlist.h" | ||||||
| #include "probe-event.h" | #include "probe-event.h" | ||||||
| 
 | 
 | ||||||
| #define MAX_PROBE_BUFFER	1024 | #define MAX_PROBE_BUFFER	1024 | ||||||
| @ -66,7 +67,7 @@ struct probe_finder { | |||||||
| 	const char		*fname;		/* Real file name */ | 	const char		*fname;		/* Real file name */ | ||||||
| 	Dwarf_Die		cu_die;		/* Current CU */ | 	Dwarf_Die		cu_die;		/* Current CU */ | ||||||
| 	Dwarf_Die		sp_die; | 	Dwarf_Die		sp_die; | ||||||
| 	struct list_head	lcache;		/* Line cache for lazy match */ | 	struct intlist		*lcache;	/* Line cache for lazy match */ | ||||||
| 
 | 
 | ||||||
| 	/* For variable searching */ | 	/* For variable searching */ | ||||||
| #if _ELFUTILS_PREREQ(0, 142) | #if _ELFUTILS_PREREQ(0, 142) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Masami Hiramatsu
						Masami Hiramatsu