If set, Intel PT decoder will set the mispred flag on all
                branches.
 
+       intel-pt.max-loops::
+               If set and non-zero, the maximum number of unconditional
+               branches decoded without consuming any trace packets. If
+               the maximum is exceeded there will be a "Never-ending loop"
+               error. The default is 100000.
+
 auxtrace.*::
 
        auxtrace.dumpdir::
 
 
 #define INTEL_PT_RETURN 1
 
-/* Maximum number of loops with no packets consumed i.e. stuck in a loop */
-#define INTEL_PT_MAX_LOOPS 10000
+/*
+ * Default maximum number of loops with no packets consumed i.e. stuck in a
+ * loop.
+ */
+#define INTEL_PT_MAX_LOOPS 100000
 
 struct intel_pt_blk {
        struct intel_pt_blk *prev;
        uint64_t timestamp_insn_cnt;
        uint64_t sample_insn_cnt;
        uint64_t stuck_ip;
+       int max_loops;
        int no_progress;
        int stuck_ip_prd;
        int stuck_ip_cnt;
        decoder->vm_tm_corr_dry_run = params->vm_tm_corr_dry_run;
        decoder->first_timestamp    = params->first_timestamp;
        decoder->last_reliable_timestamp = params->first_timestamp;
+       decoder->max_loops          = params->max_loops ? params->max_loops : INTEL_PT_MAX_LOOPS;
 
        decoder->flags              = params->flags;
 
        [INTEL_PT_ERR_OVR]    = "Overflow packet",
        [INTEL_PT_ERR_LOST]   = "Lost trace data",
        [INTEL_PT_ERR_UNK]    = "Unknown error!",
-       [INTEL_PT_ERR_NELOOP] = "Never-ending loop",
+       [INTEL_PT_ERR_NELOOP] = "Never-ending loop (refer perf config intel-pt.max-loops)",
 };
 
 int intel_pt__strerror(int code, char *buf, size_t buflen)
                                decoder->stuck_ip = decoder->state.to_ip;
                                decoder->stuck_ip_prd = 1;
                                decoder->stuck_ip_cnt = 1;
-                       } else if (cnt > INTEL_PT_MAX_LOOPS ||
+                       } else if (cnt > decoder->max_loops ||
                                   decoder->state.to_ip == decoder->stuck_ip) {
                                intel_pt_log_at("ERROR: Never-ending loop",
                                                decoder->state.to_ip);
 
        u64 noretcomp_bit;
        unsigned max_non_turbo_ratio;
        unsigned cbr2khz;
+       int max_loops;
 
        unsigned long num_events;
 
        params.vm_time_correlation = pt->synth_opts.vm_time_correlation;
        params.vm_tm_corr_dry_run = pt->synth_opts.vm_tm_corr_dry_run;
        params.first_timestamp = pt->first_timestamp;
+       params.max_loops = pt->max_loops;
 
        if (pt->filts.cnt > 0)
                params.pgd_ip = intel_pt_pgd_ip;
        if (!strcmp(var, "intel-pt.mispred-all"))
                pt->mispred_all = perf_config_bool(var, value);
 
+       if (!strcmp(var, "intel-pt.max-loops"))
+               perf_config_int(&pt->max_loops, var, value);
+
        return 0;
 }