Upgrade to 4.4.50-rt62
[kvmfornfv.git] / kernel / tools / perf / util / intel-pt.c
index 97f963a..89927b5 100644 (file)
@@ -238,7 +238,7 @@ static int intel_pt_get_trace(struct intel_pt_buffer *b, void *data)
        }
 
        queue = &ptq->pt->queues.queue_array[ptq->queue_nr];
-
+next:
        buffer = auxtrace_buffer__next(queue, buffer);
        if (!buffer) {
                if (old_buffer)
@@ -261,9 +261,6 @@ static int intel_pt_get_trace(struct intel_pt_buffer *b, void *data)
            intel_pt_do_fix_overlap(ptq->pt, old_buffer, buffer))
                return -ENOMEM;
 
-       if (old_buffer)
-               auxtrace_buffer__drop_data(old_buffer);
-
        if (buffer->use_data) {
                b->len = buffer->use_size;
                b->buf = buffer->use_data;
@@ -273,6 +270,16 @@ static int intel_pt_get_trace(struct intel_pt_buffer *b, void *data)
        }
        b->ref_timestamp = buffer->reference;
 
+       /*
+        * If in snapshot mode and the buffer has no usable data, get next
+        * buffer and again check overlap against old_buffer.
+        */
+       if (ptq->pt->snapshot_mode && !b->len)
+               goto next;
+
+       if (old_buffer)
+               auxtrace_buffer__drop_data(old_buffer);
+
        if (!old_buffer || ptq->pt->sampling_mode || (ptq->pt->snapshot_mode &&
                                                      !buffer->consecutive)) {
                b->consecutive = false;
@@ -1127,7 +1134,7 @@ static int intel_pt_synth_transaction_sample(struct intel_pt_queue *ptq)
                pr_err("Intel Processor Trace: failed to deliver transaction event, error %d\n",
                       ret);
 
-       if (pt->synth_opts.callchain)
+       if (pt->synth_opts.last_branch)
                intel_pt_reset_last_branch_rb(ptq);
 
        return ret;