perf intel-pt/bts: Tidy instruction buffer size usage
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 7 Oct 2016 13:42:25 +0000 (16:42 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 24 Oct 2016 13:31:32 +0000 (10:31 -0300)
Tidy instruction buffer size usage in preparation for copying the
instruction bytes onto samples.

The instruction buffer is presently used for debugging, so rename its
size macro from INTEL_PT_INSN_DBG_BUF_SZ to INTEL_PT_INSN_BUF_SZ, and
use it everywhere.

Note that the maximum instruction size is 15 which is a less efficient size
to copy than 16, which is why a separate buffer size is used.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Link: http://lkml.kernel.org/r/1475847747-30994-2-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/intel-bts.c
tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.c
tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.h
tools/perf/util/intel-pt-decoder/intel-pt-log.c
tools/perf/util/intel-pt.c

index f545ec1e758a722d1d462e9defd6ff1ba186145f..8bc7fec817d7b71bdba215765de0b92188afeb88 100644 (file)
@@ -319,15 +319,12 @@ static int intel_bts_get_next_insn(struct intel_bts_queue *btsq, u64 ip)
        struct machine *machine = btsq->bts->machine;
        struct thread *thread;
        struct addr_location al;
-       unsigned char buf[1024];
-       size_t bufsz;
+       unsigned char buf[INTEL_PT_INSN_BUF_SZ];
        ssize_t len;
        int x86_64;
        uint8_t cpumode;
        int err = -1;
 
-       bufsz = intel_pt_insn_max_size();
-
        if (machine__kernel_ip(machine, ip))
                cpumode = PERF_RECORD_MISC_KERNEL;
        else
@@ -341,7 +338,8 @@ static int intel_bts_get_next_insn(struct intel_bts_queue *btsq, u64 ip)
        if (!al.map || !al.map->dso)
                goto out_put;
 
-       len = dso__data_read_addr(al.map->dso, al.map, machine, ip, buf, bufsz);
+       len = dso__data_read_addr(al.map->dso, al.map, machine, ip, buf,
+                                 INTEL_PT_INSN_BUF_SZ);
        if (len <= 0)
                goto out_put;
 
index d23138c06665a85d080c4ac668b828b3eb777724..5f95cd44207596b6761b1c5a0c30f245edac937d 100644 (file)
 
 #include "intel-pt-insn-decoder.h"
 
+#if INTEL_PT_INSN_BUF_SZ < MAX_INSN_SIZE
+#error Instruction buffer size too small
+#endif
+
 /* Based on branch_type() from perf_event_intel_lbr.c */
 static void intel_pt_insn_decoder(struct insn *insn,
                                  struct intel_pt_insn *intel_pt_insn)
@@ -166,10 +170,10 @@ int intel_pt_get_insn(const unsigned char *buf, size_t len, int x86_64,
        if (!insn_complete(&insn) || insn.length > len)
                return -1;
        intel_pt_insn_decoder(&insn, intel_pt_insn);
-       if (insn.length < INTEL_PT_INSN_DBG_BUF_SZ)
+       if (insn.length < INTEL_PT_INSN_BUF_SZ)
                memcpy(intel_pt_insn->buf, buf, insn.length);
        else
-               memcpy(intel_pt_insn->buf, buf, INTEL_PT_INSN_DBG_BUF_SZ);
+               memcpy(intel_pt_insn->buf, buf, INTEL_PT_INSN_BUF_SZ);
        return 0;
 }
 
@@ -211,11 +215,6 @@ int intel_pt_insn_desc(const struct intel_pt_insn *intel_pt_insn, char *buf,
        return 0;
 }
 
-size_t intel_pt_insn_max_size(void)
-{
-       return MAX_INSN_SIZE;
-}
-
 int intel_pt_insn_type(enum intel_pt_insn_op op)
 {
        switch (op) {
index b0adbf37323e422bf8cb5c5ae6886f521d0ee662..37ec5627ae9b04e4720dc394d02958ff16253f9a 100644 (file)
@@ -20,7 +20,7 @@
 #include <stdint.h>
 
 #define INTEL_PT_INSN_DESC_MAX         32
-#define INTEL_PT_INSN_DBG_BUF_SZ       16
+#define INTEL_PT_INSN_BUF_SZ           16
 
 enum intel_pt_insn_op {
        INTEL_PT_OP_OTHER,
@@ -47,7 +47,7 @@ struct intel_pt_insn {
        enum intel_pt_insn_branch       branch;
        int                             length;
        int32_t                         rel;
-       unsigned char                   buf[INTEL_PT_INSN_DBG_BUF_SZ];
+       unsigned char                   buf[INTEL_PT_INSN_BUF_SZ];
 };
 
 int intel_pt_get_insn(const unsigned char *buf, size_t len, int x86_64,
@@ -58,8 +58,6 @@ const char *intel_pt_insn_name(enum intel_pt_insn_op op);
 int intel_pt_insn_desc(const struct intel_pt_insn *intel_pt_insn, char *buf,
                       size_t buf_len);
 
-size_t intel_pt_insn_max_size(void);
-
 int intel_pt_insn_type(enum intel_pt_insn_op op);
 
 #endif
index 319bef33a64b2104ab7b17436e6c222f4d656d01..e02bc7b166a0e48f1cf537606a71ab43875c6de8 100644 (file)
@@ -119,8 +119,8 @@ void __intel_pt_log_insn(struct intel_pt_insn *intel_pt_insn, uint64_t ip)
        if (intel_pt_log_open())
                return;
 
-       if (len > INTEL_PT_INSN_DBG_BUF_SZ)
-               len = INTEL_PT_INSN_DBG_BUF_SZ;
+       if (len > INTEL_PT_INSN_BUF_SZ)
+               len = INTEL_PT_INSN_BUF_SZ;
        intel_pt_print_data(intel_pt_insn->buf, len, ip, 8);
        if (intel_pt_insn_desc(intel_pt_insn, desc, INTEL_PT_INSN_DESC_MAX) > 0)
                fprintf(f, "%s\n", desc);
index dc041d4368c812d6e932e31e4f56d3a24620ee6c..815a14d8904b7c2e6e9e99a486a1dcb32c2cac8c 100644 (file)
@@ -428,8 +428,7 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
        struct machine *machine = ptq->pt->machine;
        struct thread *thread;
        struct addr_location al;
-       unsigned char buf[1024];
-       size_t bufsz;
+       unsigned char buf[INTEL_PT_INSN_BUF_SZ];
        ssize_t len;
        int x86_64;
        u8 cpumode;
@@ -440,8 +439,6 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
        if (to_ip && *ip == to_ip)
                goto out_no_cache;
 
-       bufsz = intel_pt_insn_max_size();
-
        if (*ip >= ptq->pt->kernel_start)
                cpumode = PERF_RECORD_MISC_KERNEL;
        else
@@ -493,7 +490,8 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
 
                while (1) {
                        len = dso__data_read_offset(al.map->dso, machine,
-                                                   offset, buf, bufsz);
+                                                   offset, buf,
+                                                   INTEL_PT_INSN_BUF_SZ);
                        if (len <= 0)
                                return -EINVAL;