mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Tom Zanussi <tom.zanussi@linux.intel.com>
To: rostedt@goodmis.org
Cc: tglx@linutronix.de, mhiramat@kernel.org, namhyung@kernel.org,
	vedang.patel@intel.com, bigeasy@linutronix.de,
	joel.opensrc@gmail.com, joelaf@google.com,
	mathieu.desnoyers@efficios.com, baohong.liu@intel.com,
	rajvi.jingar@intel.com, julia@ni.com,
	linux-kernel@vger.kernel.org, linux-rt-users@vger.kernel.org,
	Tom Zanussi <tom.zanussi@linux.intel.com>
Subject: [PATCH v5 04/37] tracing: Remove code which merges duplicates
Date: Thu,  9 Nov 2017 14:33:35 -0600	[thread overview]
Message-ID: <dee565ff20ef7e685eda8aa6ea233378d82137f5.1510252666.git.tom.zanussi@linux.intel.com> (raw)
In-Reply-To: <cover.1510252666.git.tom.zanussi@linux.intel.com>
In-Reply-To: <cover.1510252666.git.tom.zanussi@linux.intel.com>

From: Vedang Patel <vedang.patel@intel.com>

We now have the logic to detect and remove duplicates in the
tracing_map hash table. The code which merges duplicates in the
histogram is redundant now. So, modify this code just to detect
duplicates. The duplication detection code is still kept to ensure
that any rare race condition which might cause duplicates does not go
unnoticed.

Signed-off-by: Vedang Patel <vedang.patel@intel.com>
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
---
 kernel/trace/trace_events_hist.c | 11 ------
 kernel/trace/tracing_map.c       | 83 +++-------------------------------------
 kernel/trace/tracing_map.h       |  7 ----
 3 files changed, 6 insertions(+), 95 deletions(-)

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 1e1558c..712260e 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -340,16 +340,6 @@ static int hist_trigger_elt_comm_alloc(struct tracing_map_elt *elt)
 	return 0;
 }
 
-static void hist_trigger_elt_comm_copy(struct tracing_map_elt *to,
-				       struct tracing_map_elt *from)
-{
-	char *comm_from = from->private_data;
-	char *comm_to = to->private_data;
-
-	if (comm_from)
-		memcpy(comm_to, comm_from, TASK_COMM_LEN + 1);
-}
-
 static void hist_trigger_elt_comm_init(struct tracing_map_elt *elt)
 {
 	char *comm = elt->private_data;
@@ -360,7 +350,6 @@ static void hist_trigger_elt_comm_init(struct tracing_map_elt *elt)
 
 static const struct tracing_map_ops hist_trigger_elt_comm_ops = {
 	.elt_alloc	= hist_trigger_elt_comm_alloc,
-	.elt_copy	= hist_trigger_elt_comm_copy,
 	.elt_free	= hist_trigger_elt_comm_free,
 	.elt_init	= hist_trigger_elt_comm_init,
 };
diff --git a/kernel/trace/tracing_map.c b/kernel/trace/tracing_map.c
index b30f343..f47a4d5 100644
--- a/kernel/trace/tracing_map.c
+++ b/kernel/trace/tracing_map.c
@@ -847,67 +847,15 @@ void tracing_map_destroy_sort_entries(struct tracing_map_sort_entry **entries,
 	return sort_entry;
 }
 
-static struct tracing_map_elt *copy_elt(struct tracing_map_elt *elt)
-{
-	struct tracing_map_elt *dup_elt;
-	unsigned int i;
-
-	dup_elt = tracing_map_elt_alloc(elt->map);
-	if (IS_ERR(dup_elt))
-		return NULL;
-
-	if (elt->map->ops && elt->map->ops->elt_copy)
-		elt->map->ops->elt_copy(dup_elt, elt);
-
-	dup_elt->private_data = elt->private_data;
-	memcpy(dup_elt->key, elt->key, elt->map->key_size);
-
-	for (i = 0; i < elt->map->n_fields; i++) {
-		atomic64_set(&dup_elt->fields[i].sum,
-			     atomic64_read(&elt->fields[i].sum));
-		dup_elt->fields[i].cmp_fn = elt->fields[i].cmp_fn;
-	}
-
-	return dup_elt;
-}
-
-static int merge_dup(struct tracing_map_sort_entry **sort_entries,
-		     unsigned int target, unsigned int dup)
-{
-	struct tracing_map_elt *target_elt, *elt;
-	bool first_dup = (target - dup) == 1;
-	int i;
-
-	if (first_dup) {
-		elt = sort_entries[target]->elt;
-		target_elt = copy_elt(elt);
-		if (!target_elt)
-			return -ENOMEM;
-		sort_entries[target]->elt = target_elt;
-		sort_entries[target]->elt_copied = true;
-	} else
-		target_elt = sort_entries[target]->elt;
-
-	elt = sort_entries[dup]->elt;
-
-	for (i = 0; i < elt->map->n_fields; i++)
-		atomic64_add(atomic64_read(&elt->fields[i].sum),
-			     &target_elt->fields[i].sum);
-
-	sort_entries[dup]->dup = true;
-
-	return 0;
-}
-
-static int merge_dups(struct tracing_map_sort_entry **sort_entries,
+static void detect_dups(struct tracing_map_sort_entry **sort_entries,
 		      int n_entries, unsigned int key_size)
 {
 	unsigned int dups = 0, total_dups = 0;
-	int err, i, j;
+	int i;
 	void *key;
 
 	if (n_entries < 2)
-		return total_dups;
+		return;
 
 	sort(sort_entries, n_entries, sizeof(struct tracing_map_sort_entry *),
 	     (int (*)(const void *, const void *))cmp_entries_dup, NULL);
@@ -916,30 +864,14 @@ static int merge_dups(struct tracing_map_sort_entry **sort_entries,
 	for (i = 1; i < n_entries; i++) {
 		if (!memcmp(sort_entries[i]->key, key, key_size)) {
 			dups++; total_dups++;
-			err = merge_dup(sort_entries, i - dups, i);
-			if (err)
-				return err;
 			continue;
 		}
 		key = sort_entries[i]->key;
 		dups = 0;
 	}
 
-	if (!total_dups)
-		return total_dups;
-
-	for (i = 0, j = 0; i < n_entries; i++) {
-		if (!sort_entries[i]->dup) {
-			sort_entries[j] = sort_entries[i];
-			if (j++ != i)
-				sort_entries[i] = NULL;
-		} else {
-			destroy_sort_entry(sort_entries[i]);
-			sort_entries[i] = NULL;
-		}
-	}
-
-	return total_dups;
+	WARN_ONCE(total_dups > 0,
+		  "Duplicates detected: %d\n", total_dups);
 }
 
 static bool is_key(struct tracing_map *map, unsigned int field_idx)
@@ -1065,10 +997,7 @@ int tracing_map_sort_entries(struct tracing_map *map,
 		return 1;
 	}
 
-	ret = merge_dups(entries, n_entries, map->key_size);
-	if (ret < 0)
-		goto free;
-	n_entries -= ret;
+	detect_dups(entries, n_entries, map->key_size);
 
 	if (is_key(map, sort_keys[0].field_idx))
 		cmp_entries_fn = cmp_entries_key;
diff --git a/kernel/trace/tracing_map.h b/kernel/trace/tracing_map.h
index f097511..98ef6d6 100644
--- a/kernel/trace/tracing_map.h
+++ b/kernel/trace/tracing_map.h
@@ -214,11 +214,6 @@ struct tracing_map {
  *	Element allocation occurs before tracing begins, when the
  *	tracing_map_init() call is made by client code.
  *
- * @elt_copy: At certain points in the lifetime of an element, it may
- *	need to be copied.  The copy should include a copy of the
- *	client-allocated data, which can be copied into the 'to'
- *	element from the 'from' element.
- *
  * @elt_free: When a tracing_map_elt is freed, this function is called
  *	and allows client-allocated per-element data to be freed.
  *
@@ -232,8 +227,6 @@ struct tracing_map {
  */
 struct tracing_map_ops {
 	int			(*elt_alloc)(struct tracing_map_elt *elt);
-	void			(*elt_copy)(struct tracing_map_elt *to,
-					    struct tracing_map_elt *from);
 	void			(*elt_free)(struct tracing_map_elt *elt);
 	void			(*elt_clear)(struct tracing_map_elt *elt);
 	void			(*elt_init)(struct tracing_map_elt *elt);
-- 
1.9.3

  parent reply	other threads:[~2017-11-09 20:44 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-09 20:33 [PATCH v5 00/37] tracing: Inter-event (e.g. latency) support Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 01/37] tracing: Move hist trigger Documentation to histogram.txt Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 02/37] tracing: Add Documentation for log2 modifier Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 03/37] tracing: Add support to detect and avoid duplicates Tom Zanussi
2017-11-09 20:33 ` Tom Zanussi [this message]
2017-11-09 20:33 ` [PATCH v5 05/37] ring-buffer: Add interface for setting absolute time stamps Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 06/37] ring-buffer: Redefine the unimplemented RINGBUF_TYPE_TIME_STAMP Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 07/37] tracing: Add timestamp_mode trace file Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 08/37] tracing: Give event triggers access to ring_buffer_event Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 09/37] tracing: Add ring buffer event param to hist field functions Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 10/37] tracing: Break out hist trigger assignment parsing Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 11/37] tracing: Add hist trigger timestamp support Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 12/37] tracing: Add per-element variable support to tracing_map Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 13/37] tracing: Add hist_data member to hist_field Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 14/37] tracing: Add usecs modifier for hist trigger timestamps Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 15/37] tracing: Add variable support to hist triggers Tom Zanussi
2017-11-10  7:28   ` Namhyung Kim
2017-11-10 13:24     ` Steven Rostedt
2017-11-10 16:26     ` Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 16/37] tracing: Account for variables in named trigger compatibility Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 17/37] tracing: Move get_hist_field_flags() Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 18/37] tracing: Add simple expression support to hist triggers Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 19/37] tracing: Generalize per-element hist trigger data Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 20/37] tracing: Pass tracing_map_elt to hist_field accessor functions Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 21/37] tracing: Add hist_field 'type' field Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 22/37] tracing: Add variable reference handling to hist triggers Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 23/37] tracing: Add hist trigger action hook Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 24/37] tracing: Add support for 'synthetic' events Tom Zanussi
2017-11-14  1:21   ` Namhyung Kim
2017-11-14 19:24     ` Tom Zanussi
2017-11-14 10:06   ` Namhyung Kim
2017-11-14 19:34     ` Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 25/37] tracing: Add support for 'field variables' Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 26/37] tracing: Add 'onmatch' hist trigger action support Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 27/37] tracing: Add 'onmax' " Tom Zanussi
2017-11-09 20:33 ` [PATCH v5 28/37] tracing: Allow whitespace to surround hist trigger filter Tom Zanussi
2017-11-09 20:34 ` [PATCH v5 29/37] tracing: Add cpu field for hist triggers Tom Zanussi
2017-11-09 20:34 ` [PATCH v5 30/37] tracing: Add hist trigger support for variable reference aliases Tom Zanussi
2017-11-09 20:34 ` [PATCH v5 31/37] tracing: Add 'last error' error facility for hist triggers Tom Zanussi
2017-11-09 20:34 ` [PATCH v5 32/37] tracing: Add inter-event hist trigger Documentation Tom Zanussi
2017-11-09 20:34 ` [PATCH v5 33/37] tracing: Make tracing_set_clock() non-static Tom Zanussi
2017-11-09 20:34 ` [PATCH v5 34/37] tracing: Add a clock attribute for hist triggers Tom Zanussi
2017-11-09 20:34 ` [PATCH v5 35/37] tracing: Increase trace_recursive_lock() limit for synthetic events Tom Zanussi
2017-11-09 20:34 ` [PATCH v5 36/37] tracing: Add inter-event blurb to HIST_TRIGGERS config option Tom Zanussi
2017-11-09 20:34 ` [PATCH v5 37/37] selftests: ftrace: Add inter-event hist triggers testcases Tom Zanussi

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=dee565ff20ef7e685eda8aa6ea233378d82137f5.1510252666.git.tom.zanussi@linux.intel.com \
    --to=tom.zanussi@linux.intel.com \
    --cc=baohong.liu@intel.com \
    --cc=bigeasy@linutronix.de \
    --cc=joel.opensrc@gmail.com \
    --cc=joelaf@google.com \
    --cc=julia@ni.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rt-users@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mhiramat@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=rajvi.jingar@intel.com \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=vedang.patel@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®