All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Adrian Hunter <adrian.hunter@intel.com>
Cc: Wang Nan <wangnan0@huawei.com>,
	namhyung@kernel.org, lizefan@huawei.com, pi3orama@163.com,
	linux-kernel@vger.kernel.org, jolsa@kernel.org,
	masami.hiramatsu.pt@hitachi.com
Subject: Re: [PATCH] perf symbols/KCORE: Rebuild rbtree when adjusting symbols for kcore
Date: Mon, 9 Nov 2015 11:56:51 -0300	[thread overview]
Message-ID: <20151109145651.GA4715@kernel.org> (raw)
In-Reply-To: <564058A5.6020504@intel.com>

Em Mon, Nov 09, 2015 at 10:26:13AM +0200, Adrian Hunter escreveu:
> On 06/11/15 20:51, Arnaldo Carvalho de Melo wrote:
> > Em Fri, Nov 06, 2015 at 03:59:29PM +0200, Adrian Hunter escreveu:
> >> The problem is when the order in memory (in kallsyms) is different
> >> to the order on the dso (kcore).

> > What order? Can you ellaborate a bit more?
 
> Normally symbols are read from the DSO and adjusted, if need be, so that the
> symbol start matches the file offset in the DSO file (we want the file
> offset because that is what we know from MMAP events). That is done by
> dso__load_sym() which inserts the symbols *after* adjusting them.
 
> In the case of kcore, the symbols have been read from kallsyms and the
> symbol start is the memory address. The symbols have to be adjusted to match
> the kcore file offsets. dso__split_kallsyms_for_kcore() does that, but now

So you're saying that some symbols get adjusted, by say X bytes, while
some other symbols are adjusted by a different, Y value, or are _all_
the symbols adjusted by the same value, i.e. one that could be adjusted
in 'struct map' instead?

> the adjustment is being done *after* the symbols have been inserted. It
> appears dso__split_kallsyms_for_kcore() was assuming that changing the
> symbol start would not change the order in the rbtree - which is, of course,
> not guaranteed.

Sure, the minimal fix should be not to change the key (sym->start/end)
after you add it to an rbtree that uses that key.
 
> >                                            I thought more about keeping
> > whatever address is in the symtab from where we read the symbols, and
> > then create one map per kernel module all pointing to the same DSO, that
> > would be the one loaded from kallsyms.
> > 
> > Any adjustments would be fone in the map, not the DSO.
> > 
> > I.e. we wouldn't be splitting anything, just creating struct map
> > instances pointing to the same DSO.
> > 
> > - Arnaldo
> > 
> >> I think to make it more general it needs to insert to a new tree.
> >> e.g.
> > 
> > 
> >> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> >> index b4cc7662677e..09343a880c0b 100644
> >> --- a/tools/perf/util/symbol.c
> >> +++ b/tools/perf/util/symbol.c
> >> @@ -654,19 +654,24 @@ static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
> >>  	struct map_groups *kmaps = map__kmaps(map);
> >>  	struct map *curr_map;
> >>  	struct symbol *pos;
> >> -	int count = 0, moved = 0;
> >> +	int count = 0;
> >> +	struct rb_root old_root = dso->symbols[map->type];
> >>  	struct rb_root *root = &dso->symbols[map->type];
> >>  	struct rb_node *next = rb_first(root);
> >>  
> >>  	if (!kmaps)
> >>  		return -1;
> >>  
> >> +	*root = RB_ROOT;
> >> +
> >>  	while (next) {
> >>  		char *module;
> >>  
> >>  		pos = rb_entry(next, struct symbol, rb_node);
> >>  		next = rb_next(&pos->rb_node);
> >>  
> >> +		rb_erase_init(&pos->rb_node, &old_root);
> >> +
> >>  		module = strchr(pos->name, '\t');
> >>  		if (module)
> >>  			*module = '\0';
> >> @@ -674,28 +679,21 @@ static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
> >>  		curr_map = map_groups__find(kmaps, map->type, pos->start);
> >>  
> >>  		if (!curr_map || (filter && filter(curr_map, pos))) {
> >> -			rb_erase_init(&pos->rb_node, root);
> >>  			symbol__delete(pos);
> >> -		} else {
> >> -			pos->start -= curr_map->start - curr_map->pgoff;
> >> -			if (pos->end)
> >> -				pos->end -= curr_map->start - curr_map->pgoff;
> >> -			if (curr_map->dso != map->dso) {
> >> -				rb_erase_init(&pos->rb_node, root);
> >> -				symbols__insert(
> >> -					&curr_map->dso->symbols[curr_map->type],
> >> -					pos);
> >> -				++moved;
> >> -			} else {
> >> -				++count;
> >> -			}
> >> +			continue;
> >>  		}
> >> +
> >> +		pos->start -= curr_map->start - curr_map->pgoff;
> >> +		if (pos->end)
> >> +			pos->end -= curr_map->start - curr_map->pgoff;
> >> +		symbols__insert(&curr_map->dso->symbols[curr_map->type], pos);
> >> +		++count;
> >>  	}
> >>  
> >>  	/* Symbols have been adjusted */
> >>  	dso->adjust_symbols = 1;
> >>  
> >> -	return count + moved;
> >> +	return count;
> >>  }
> >>  
> >>  /*
> > 

  reply	other threads:[~2015-11-09 14:56 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-06  9:46 [PATCH] perf tools: Rebuild rbtree when adjusting symbols for kcore Wang Nan
2015-11-06 13:19 ` [PATCH] perf symbols/KCORE: " Arnaldo Carvalho de Melo
2015-11-06 13:34   ` Wangnan (F)
2015-11-06 14:03     ` Arnaldo Carvalho de Melo
2015-11-06 14:33       ` pi3orama
2015-11-06 13:59   ` Adrian Hunter
2015-11-06 14:31     ` pi3orama
2015-11-06 18:51     ` Arnaldo Carvalho de Melo
2015-11-09  8:26       ` Adrian Hunter
2015-11-09 14:56         ` Arnaldo Carvalho de Melo [this message]
2015-11-10 13:41           ` Adrian Hunter
2015-11-11  7:02     ` Wangnan (F)
2015-11-11 20:44       ` Arnaldo Carvalho de Melo
2015-11-12  6:42         ` Adrian Hunter
2015-11-16 10:58     ` [tip:perf/urgent] perf symbols: " tip-bot for Adrian Hunter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151109145651.GA4715@kernel.org \
    --to=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=namhyung@kernel.org \
    --cc=pi3orama@163.com \
    --cc=wangnan0@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.