From: Maynard J. <may...@us...> - 2013-01-03 18:25:44
|
I found another problem where the default unit mask was not being used when the user did not specify a unit mask. I also found a minor issue where the wrong message was being displayed at times. *Suravee*, could you please review this patch? Thanks. -Maynard ------------------------------------------------------------------ Fix default unit mask when it's a bitmask, and fix error message for non-unique numerical unit mask This patch fixes two problems: 1) When no unit mask is specified for an event, operf and opcontrol should use the default unit mask. If the event uses a bitmask of unit mask values, the default unit mask may be a combination of individual unit mask values. In such cases, the default unit mask was not being selected, and the resulting unit mask used for profiling was '0'. For some events, '0' is not even a valid unit mask value, so the resulting profile would usually end up with zero samples. For other events, '0' may be a valid unit mask value, so the profile would (may) collect samples, but the profile data would be incorrect (unbeknownst to the user), since it was for the wrong unit mask. Example: On i386/core_2, the event specification of LOAD_BLOCK:2000000 results in a unit mask value of '0' being selected. This problem is not new; it was introduced in OProfile 0.9.7 when unit mask naming was introduced. 2) In the same area of code as bug #1, I found a bug that I had introduced when making some fixes for build warnings when using gcc 4.6.1 or newer. This bug caused the wrong message to be displayed if a user specified a unit mask value for an event where that value was duplicated and, thus, should be specified by name. The wrong message being displayed was: Named unit masks not allowed for events without 'extra:' values. Please specify the numerical value for the unit mask. See 'opcontrol' man page for more info. The correct message (as fixed by this patch) is: Non unique numerical unit mask. Please specify the unit mask using the first word of the description Additionally, this patch makes a couple formatting changes in the area where these bugs were found. Signed-off-by: Maynard Johnson <may...@us...> --- libop/op_events.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libop/op_events.c b/libop/op_events.c index 6b02fcc..3dcd987 100644 --- a/libop/op_events.c +++ b/libop/op_events.c @@ -1268,20 +1268,20 @@ static void do_resolve_unit_mask(struct op_event *e, struct parsed_event *pe, for (;;) { if (pe->unit_mask_name == NULL) { int had_unit_mask = pe->unit_mask_valid; - found = 0; - for (i = 0; i < e->unit->num; i++) { - if (!pe->unit_mask_valid && - e->unit->um[i].value == e->unit->default_mask) { - pe->unit_mask_valid = 1; - pe->unit_mask = e->unit->default_mask; - break; + if (pe->unit_mask_valid) { + for (i = 0; i < e->unit->num; i++) { + if (e->unit->um[i].value == (unsigned int)pe->unit_mask) + found++; } + }else { + pe->unit_mask_valid = 1; + pe->unit_mask = e->unit->default_mask; } if (found > 1 && had_unit_mask) { fprintf(stderr, - "Non unique numerical unit mask.\n" - "Please specify the unit mask using the first word of the description\n"); + "Non unique numerical unit mask.\n" + "Please specify the unit mask using the first word of the description\n"); exit(EXIT_FAILURE); } extra_check(e, pe->unit_mask); -- 1.7.1 |