From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754451AbdFWFsf (ORCPT ); Fri, 23 Jun 2017 01:48:35 -0400 Received: from LGEAMRELO11.lge.com ([156.147.23.51]:54098 "EHLO lgeamrelo11.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754319AbdFWFsd (ORCPT ); Fri, 23 Jun 2017 01:48:33 -0400 X-Original-SENDERIP: 156.147.1.127 X-Original-MAILFROM: namhyung@kernel.org X-Original-SENDERIP: 10.177.227.17 X-Original-MAILFROM: namhyung@kernel.org From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , kernel-team@lge.com, Masami Hiramatsu , Andi Kleen , Adrian Hunter , Wang Nan Subject: [PATCH/RFC 6/9] perf symbols: Use already loaded module dso when loading kcore Date: Fri, 23 Jun 2017 14:48:24 +0900 Message-Id: <20170623054827.3828-7-namhyung@kernel.org> X-Mailer: git-send-email 2.13.1 In-Reply-To: <20170623054827.3828-1-namhyung@kernel.org> References: <20170623054827.3828-1-namhyung@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Even every module has loaded onto same addresses, some modules can be changed and reloaded. In that case it needs to access to the old module in the build-id cache. Cc: Adrian Hunter Cc: Wang Nan Signed-off-by: Namhyung Kim --- tools/perf/util/symbol.c | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index ce79a51f25bf..fe46eb782297 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1155,6 +1155,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map, int err, fd; char kcore_filename[PATH_MAX]; struct symbol *sym; + struct map_groups old_mg; if (!kmaps) return -EINVAL; @@ -1196,15 +1197,8 @@ static int dso__load_kcore(struct dso *dso, struct map *map, goto out_err; } - /* Remove old maps */ - old_map = map_groups__first(kmaps, map->type); - while (old_map) { - struct map *next = map_groups__next(old_map); - - if (old_map != map) - map_groups__remove(kmaps, old_map); - old_map = next; - } + old_mg = *kmaps; + kmaps->maps[map->type].entries = RB_ROOT; /* Find the kernel map using the first symbol */ sym = dso__first_symbol(dso, map->type); @@ -1223,24 +1217,31 @@ static int dso__load_kcore(struct dso *dso, struct map *map, while (!list_empty(&md.maps)) { new_map = list_entry(md.maps.next, struct map, node); list_del_init(&new_map->node); - if (new_map == replacement_map) { - map->start = new_map->start; - map->end = new_map->end; - map->pgoff = new_map->pgoff; - map->map_ip = new_map->map_ip; - map->unmap_ip = new_map->unmap_ip; - /* Ensure maps are correctly ordered */ - map__get(map); - map_groups__remove(kmaps, map); - map_groups__insert(kmaps, map); - map__put(map); - } else { - map_groups__insert(kmaps, new_map); + + map_groups__insert(kmaps, new_map); + + if (new_map != replacement_map) { + old_map = map_groups__find(&old_mg, new_map->type, new_map->start); + if (old_map && dso__loaded(old_map->dso, old_map->type)) { + new_map->pgoff = old_map->pgoff; + + dso__put(new_map->dso); + new_map->dso = dso__get(old_map->dso); + } } map__put(new_map); } + /* Remove old maps */ + old_map = map_groups__first(&old_mg, map->type); + while (old_map) { + struct map *next = map_groups__next(old_map); + + map_groups__remove(&old_mg, old_map); + old_map = next; + } + /* * Set the data type and long name so that kcore can be read via * dso__data_read_addr(). -- 2.13.1