On Thu, Mar 11, 2021 at 03:07:25PM +0800, Jin Yao wrote:

SNIP

> +                                             config_terms, pmu);
> +             if (ret)
> +                     return ret;
> +     }
> +
> +     return 0;
> +}
> +
>  int parse_events_add_cache(struct list_head *list, int *idx,
>                          char *type, char *op_result1, char *op_result2,
>                          struct parse_events_error *err,
> @@ -474,7 +516,8 @@ int parse_events_add_cache(struct list_head *list, int 
> *idx,
>       char name[MAX_NAME_LEN], *config_name;
>       int cache_type = -1, cache_op = -1, cache_result = -1;
>       char *op_result[2] = { op_result1, op_result2 };
> -     int i, n;
> +     int i, n, ret;
> +     bool hybrid;
>  
>       /*
>        * No fallback - if we cannot get a clear cache type
> @@ -534,6 +577,15 @@ int parse_events_add_cache(struct list_head *list, int 
> *idx,
>               if (get_config_terms(head_config, &config_terms))
>                       return -ENOMEM;
>       }
> +
> +     if (!perf_pmu__hybrid_exist())
> +             perf_pmu__scan(NULL);

actualy how about construct like:

        perf_pmu_is_hybrid()
                return hybrid_add_event_cache(...)

        return add_event(...)


with:
        perf_pmu_is_hybrid()
        {
                static bool initialized;

                if (!initialized) {
                        initialized = true;
                        perf_pmu__scan(NULL)
                }

                return ...
        }

jirka

> +
> +     ret = add_hybrid_cache(list, idx, &attr, config_name ? : name,
> +                            &config_terms, &hybrid);
> +     if (hybrid)
> +             return ret;
> +
>       return add_event(list, idx, &attr, config_name ? : name, &config_terms);
>  }
>  
> -- 
> 2.17.1
> 

Reply via email to