Skip to contentSkip to conversation

perf: fix missing event name init for default event

PATCH In review Stephane Eranian 2 participants 3 messages Jun 6, 2011 – Jun 7, 2011 perf events

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 perf: fix missing event name init for default event

When no event is given to perf record, perf top, a default event is initialized (cycles). However, perf_evlist__add_default() was not setting the symbolic name for the event. Perf top worked simply because it was reconstructing the name from the event code. But it should not have to do this. This patch initializes the evsel->name field properly.

---

tools/perf/util/evlist.c +7 -0
index b021ea9..1584af6 100644
@@ -87,6 +87,13 @@ int perf_evlist__add_default(struct perf_evlist *evlist)
 	if (evsel == NULL)
 		return -ENOMEM;
 
+	/* use strdup() because free(evsel) assumes name is allocated */
+	evsel->name = strdup("cycles");
+	if (!evsel->name) {
+		free(evsel);
+		return -ENOMEM;
+	}
+
 	perf_evlist__add(evlist, evsel);
 	return 0;
 }
#1 lore raw
Quoted 4 lines · Stephane Eranian
tools/perf/util/evlist.c +0 -0
@@ -87,6 +87,13 @@ int perf_evlist__add_default(struct perf_evlist *evlist)
 	if (evsel == NULL)
 		return -ENOMEM;
 

tools/perf/util/evlist.c int perf_evlist__add_default(struct perf_evlist *evlist) · line 99

Quoted 10 lines
tools/perf/util/evlist.c +7 -0
+	/* use strdup() because free(evsel) assumes name is allocated */
+	evsel->name = strdup("cycles");
+	if (!evsel->name) {
+		free(evsel);
+		return -ENOMEM;
+	}
+
 	perf_evlist__add(evlist, evsel);
 	return 0;
 }

Hm, nice fix, but this function should really follow the standard exception tear-down sequence pattern we use in the kernel:

if (evsel == NULL)

		goto err;

	...

	if (!evsel->name)
		goto err_free;

	...

	return 0;

err_free:

	free(evsel);
err:
	return -ENOMEM;

Thanks,

Ingo

#2 lore raw
Quoted 7 lines · Ingo Molnar
Quoted 4 lines · Stephane Eranian
tools/perf/util/evlist.c +0 -0
@@ -87,6 +87,13 @@ int perf_evlist__add_default(struct perf_evlist *evlist)
       if (evsel == NULL)
               return -ENOMEM;
 
Quoted 14 lines

tools/perf/util/evlist.c int perf_evlist__add_default(struct perf_evlist *evlist) · line 99

Quoted 10 lines
tools/perf/util/evlist.c +7 -0
+     /* use strdup() because free(evsel) assumes name is allocated */
+     evsel->name = strdup("cycles");
+     if (!evsel->name) {
+             free(evsel);
+             return -ENOMEM;
+     }
+
       perf_evlist__add(evlist, evsel);
       return 0;
  }

Hm, nice fix, but this function should really follow the standard exception tear-down sequence pattern we use in the kernel:

Fine, I can respin that patch.

Quoted 21 lines

       if (evsel == NULL)
               goto err;

       ...

       if (!evsel->name)
               goto err_free;

       ...

       return 0;

err_free:
       free(evsel);
err:
       return -ENOMEM;

Thanks,

       Ingo