Received: by 10.223.164.202 with SMTP id h10csp1038693wrb; Sun, 26 Nov 2017 18:35:16 -0800 (PST) X-Google-Smtp-Source: AGs4zMYSiWAItOZRLTg/RqosVf+WRuAffbKp1x9eCaIVPz+/+xNtqEb3Xyanv46GwUDP/1/1rrJF X-Received: by 10.98.95.68 with SMTP id t65mr7692013pfb.45.1511750116589; Sun, 26 Nov 2017 18:35:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511750116; cv=none; d=google.com; s=arc-20160816; b=lzs2Bx6t5i1Vh6LDy6N36IX4gSGM4PnluWv0f16lPqsXNBPWzq+ulRRhoRR8olVZfQ DMX0ph3+Wd2ydeeyVw8qpC1PUdayT5MA9hzl6VLDK99opUrOP/Za9To9OU6V4z6iAxbh 79yw47UNBWuw3Dpa5N8NMxABZ15OGcGwqGtzRAy4+9T7Q8lQ3y+j0SwRsQ9m5SfZVaiV odJCvVzTGqauauEWj+QwNz3MV7FNPOH36Dq+Isk7y8haHUWxyjld4Svzeu4XHrytEvC6 0OWmmDkYoJr4/TPTUnsXmiE1C55nYrmhc7f+tQu8GcBG3O2I3itbvAruflyYYlxTX9G4 X5dg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=0KL+0jR64YQfraDmH3U743+zUeQWd82o+T7Puj86jHM=; b=T38WGbnLIekuqQSw8JTHrc0nRTGebY/OFKCxSn5dYGi1UjuPsmkDbVoHhPRGJHdDu6 0BIG+8J+Ec+NzzsnukMg2oGldPUMTE0zzJYX+dRQHK5/GEUxPCh2u2fKKrhws5Ksg2BC GH1JNU0C7UJy1gQuH/cWo3j+KQgx2Q450ESpj15rfJWGQLjUxGOQ56pDyGl+8+LEdL9H qg1Vqbjho++hGpFT52EjHZ2LmjovSDK57vBsRQ1ORdEYpUppjxCSs/w/ci3FxgTffd97 YH5TzoOwgC96iTxcAeIins1bgMYY1ekE/cinlW35XOdOir5iC2qQyt3vTLKWDEtUR5dx NZBw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v13si20703765plk.576.2017.11.26.18.35.05; Sun, 26 Nov 2017 18:35:16 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751449AbdK0CeT (ORCPT + 77 others); Sun, 26 Nov 2017 21:34:19 -0500 Received: from smtp2.provo.novell.com ([137.65.250.81]:43887 "EHLO smtp2.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751277AbdK0CeQ (ORCPT ); Sun, 26 Nov 2017 21:34:16 -0500 Received: from localhost.localdomain (prv-ext-foundry1int.gns.novell.com [137.65.251.240]) by smtp2.provo.novell.com with ESMTP (TLS encrypted); Sun, 26 Nov 2017 19:34:08 -0700 From: Davidlohr Bueso To: acme@kernel.org Cc: jolsa@redhat.com, ak@linux.intel.com, mingo@redhat.com, dave@stgolabs.net, linux-kernel@vger.kernel.org, Davidlohr Bueso Subject: [PATCH 3/7] perf callchain: Use cached rbtrees Date: Sun, 26 Nov 2017 18:30:42 -0800 Message-Id: <20171127023046.19139-4-dave@stgolabs.net> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171127023046.19139-1-dave@stgolabs.net> References: <20171127023046.19139-1-dave@stgolabs.net> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org At the cost of an extra pointer, we can avoid the O(logN) cost of finding the first element in the tree (smallest node), which is something required for nearly every srcline callchain node deletion (srcline__tree_delete()). Signed-off-by: Davidlohr Bueso --- tools/perf/util/dso.c | 2 +- tools/perf/util/dso.h | 2 +- tools/perf/util/srcline.c | 21 ++++++++++++--------- tools/perf/util/srcline.h | 6 +++--- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index d5b6f7f5baff..7b1f56a6d3fd 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -1204,7 +1204,7 @@ struct dso *dso__new(const char *name) dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; dso->data.cache = RB_ROOT; dso->inlined_nodes = RB_ROOT; - dso->srclines = RB_ROOT; + dso->srclines = RB_ROOT_CACHED; dso->data.fd = -1; dso->data.status = DSO_DATA_STATUS_UNKNOWN; dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND; diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index c229dbe0277a..620b38d763d9 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -143,7 +143,7 @@ struct dso { struct rb_root symbols[MAP__NR_TYPES]; struct rb_root symbol_names[MAP__NR_TYPES]; struct rb_root inlined_nodes; - struct rb_root srclines; + struct rb_root_cached srclines; struct { u64 addr; struct symbol *symbol; diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index d19f05c56de6..e34b23e450a0 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -561,11 +561,12 @@ struct srcline_node { struct rb_node rb_node; }; -void srcline__tree_insert(struct rb_root *tree, u64 addr, char *srcline) +void srcline__tree_insert(struct rb_root_cached *tree, u64 addr, char *srcline) { - struct rb_node **p = &tree->rb_node; + struct rb_node **p = &tree->rb_root.rb_node; struct rb_node *parent = NULL; struct srcline_node *i, *node; + bool leftmost = true; node = zalloc(sizeof(struct srcline_node)); if (!node) { @@ -581,16 +582,18 @@ void srcline__tree_insert(struct rb_root *tree, u64 addr, char *srcline) i = rb_entry(parent, struct srcline_node, rb_node); if (addr < i->addr) p = &(*p)->rb_left; - else + else { p = &(*p)->rb_right; + leftmost = false; + } } rb_link_node(&node->rb_node, parent, p); - rb_insert_color(&node->rb_node, tree); + rb_insert_color_cached(&node->rb_node, tree, leftmost); } -char *srcline__tree_find(struct rb_root *tree, u64 addr) +char *srcline__tree_find(struct rb_root_cached *tree, u64 addr) { - struct rb_node *n = tree->rb_node; + struct rb_node *n = tree->rb_root.rb_node; while (n) { struct srcline_node *i = rb_entry(n, struct srcline_node, @@ -607,15 +610,15 @@ char *srcline__tree_find(struct rb_root *tree, u64 addr) return NULL; } -void srcline__tree_delete(struct rb_root *tree) +void srcline__tree_delete(struct rb_root_cached *tree) { struct srcline_node *pos; - struct rb_node *next = rb_first(tree); + struct rb_node *next = rb_first_cached(tree); while (next) { pos = rb_entry(next, struct srcline_node, rb_node); next = rb_next(&pos->rb_node); - rb_erase(&pos->rb_node, tree); + rb_erase_cached(&pos->rb_node, tree); free_srcline(pos->srcline); zfree(&pos); } diff --git a/tools/perf/util/srcline.h b/tools/perf/util/srcline.h index 847b7086182c..58e75a06f699 100644 --- a/tools/perf/util/srcline.h +++ b/tools/perf/util/srcline.h @@ -17,11 +17,11 @@ char *__get_srcline(struct dso *dso, u64 addr, struct symbol *sym, void free_srcline(char *srcline); /* insert the srcline into the DSO, which will take ownership */ -void srcline__tree_insert(struct rb_root *tree, u64 addr, char *srcline); +void srcline__tree_insert(struct rb_root_cached *tree, u64 addr, char *srcline); /* find previously inserted srcline */ -char *srcline__tree_find(struct rb_root *tree, u64 addr); +char *srcline__tree_find(struct rb_root_cached *tree, u64 addr); /* delete all srclines within the tree */ -void srcline__tree_delete(struct rb_root *tree); +void srcline__tree_delete(struct rb_root_cached *tree); #define SRCLINE_UNKNOWN ((char *) "??:0") -- 2.13.6 From 1585213574925396493@xxx Mon Nov 27 10:11:12 +0000 2017 X-GM-THRID: 1585213574925396493 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread