Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[sfrench/cifs-2.6.git] / tools / perf / util / evsel.c
index 29d7b97f66fbc5ae8efe67d3880263711d0a4d1a..6d187059a37360ae669220c913c535b1278d6514 100644 (file)
@@ -232,6 +232,7 @@ void perf_evsel__init(struct perf_evsel *evsel,
        evsel->leader      = evsel;
        evsel->unit        = "";
        evsel->scale       = 1.0;
+       evsel->max_events  = ULONG_MAX;
        evsel->evlist      = NULL;
        evsel->bpf_fd      = -1;
        INIT_LIST_HEAD(&evsel->node);
@@ -793,6 +794,9 @@ static void apply_config_terms(struct perf_evsel *evsel,
                case PERF_EVSEL__CONFIG_TERM_MAX_STACK:
                        max_stack = term->val.max_stack;
                        break;
+               case PERF_EVSEL__CONFIG_TERM_MAX_EVENTS:
+                       evsel->max_events = term->val.max_events;
+                       break;
                case PERF_EVSEL__CONFIG_TERM_INHERIT:
                        /*
                         * attr->inherit should has already been set by
@@ -1203,16 +1207,27 @@ int perf_evsel__append_addr_filter(struct perf_evsel *evsel, const char *filter)
 
 int perf_evsel__enable(struct perf_evsel *evsel)
 {
-       return perf_evsel__run_ioctl(evsel,
-                                    PERF_EVENT_IOC_ENABLE,
-                                    0);
+       int err = perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, 0);
+
+       if (!err)
+               evsel->disabled = false;
+
+       return err;
 }
 
 int perf_evsel__disable(struct perf_evsel *evsel)
 {
-       return perf_evsel__run_ioctl(evsel,
-                                    PERF_EVENT_IOC_DISABLE,
-                                    0);
+       int err = perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, 0);
+       /*
+        * We mark it disabled here so that tools that disable a event can
+        * ignore events after they disable it. I.e. the ring buffer may have
+        * already a few more events queued up before the kernel got the stop
+        * request.
+        */
+       if (!err)
+               evsel->disabled = true;
+
+       return err;
 }
 
 int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads)