|
@@ -349,6 +349,70 @@ iaddr_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
|
|
|
return sort__iaddr_cmp(left, right);
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+tot_hitm_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
|
|
+ struct hist_entry *he)
|
|
|
+{
|
|
|
+ struct c2c_hist_entry *c2c_he;
|
|
|
+ int width = c2c_width(fmt, hpp, he->hists);
|
|
|
+ unsigned int tot_hitm;
|
|
|
+
|
|
|
+ c2c_he = container_of(he, struct c2c_hist_entry, he);
|
|
|
+ tot_hitm = c2c_he->stats.lcl_hitm + c2c_he->stats.rmt_hitm;
|
|
|
+
|
|
|
+ return scnprintf(hpp->buf, hpp->size, "%*u", width, tot_hitm);
|
|
|
+}
|
|
|
+
|
|
|
+static int64_t
|
|
|
+tot_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
|
|
|
+ struct hist_entry *left, struct hist_entry *right)
|
|
|
+{
|
|
|
+ struct c2c_hist_entry *c2c_left;
|
|
|
+ struct c2c_hist_entry *c2c_right;
|
|
|
+ unsigned int tot_hitm_left;
|
|
|
+ unsigned int tot_hitm_right;
|
|
|
+
|
|
|
+ c2c_left = container_of(left, struct c2c_hist_entry, he);
|
|
|
+ c2c_right = container_of(right, struct c2c_hist_entry, he);
|
|
|
+
|
|
|
+ tot_hitm_left = c2c_left->stats.lcl_hitm + c2c_left->stats.rmt_hitm;
|
|
|
+ tot_hitm_right = c2c_right->stats.lcl_hitm + c2c_right->stats.rmt_hitm;
|
|
|
+
|
|
|
+ return tot_hitm_left - tot_hitm_right;
|
|
|
+}
|
|
|
+
|
|
|
+#define STAT_FN_ENTRY(__f) \
|
|
|
+static int \
|
|
|
+__f ## _entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, \
|
|
|
+ struct hist_entry *he) \
|
|
|
+{ \
|
|
|
+ struct c2c_hist_entry *c2c_he; \
|
|
|
+ int width = c2c_width(fmt, hpp, he->hists); \
|
|
|
+ \
|
|
|
+ c2c_he = container_of(he, struct c2c_hist_entry, he); \
|
|
|
+ return scnprintf(hpp->buf, hpp->size, "%*u", width, \
|
|
|
+ c2c_he->stats.__f); \
|
|
|
+}
|
|
|
+
|
|
|
+#define STAT_FN_CMP(__f) \
|
|
|
+static int64_t \
|
|
|
+__f ## _cmp(struct perf_hpp_fmt *fmt __maybe_unused, \
|
|
|
+ struct hist_entry *left, struct hist_entry *right) \
|
|
|
+{ \
|
|
|
+ struct c2c_hist_entry *c2c_left, *c2c_right; \
|
|
|
+ \
|
|
|
+ c2c_left = container_of(left, struct c2c_hist_entry, he); \
|
|
|
+ c2c_right = container_of(right, struct c2c_hist_entry, he); \
|
|
|
+ return c2c_left->stats.__f - c2c_right->stats.__f; \
|
|
|
+}
|
|
|
+
|
|
|
+#define STAT_FN(__f) \
|
|
|
+ STAT_FN_ENTRY(__f) \
|
|
|
+ STAT_FN_CMP(__f)
|
|
|
+
|
|
|
+STAT_FN(rmt_hitm)
|
|
|
+STAT_FN(lcl_hitm)
|
|
|
+
|
|
|
#define HEADER_LOW(__h) \
|
|
|
{ \
|
|
|
.line[1] = { \
|
|
@@ -408,10 +472,55 @@ static struct c2c_dimension dim_iaddr = {
|
|
|
.width = 18,
|
|
|
};
|
|
|
|
|
|
+static struct c2c_dimension dim_tot_hitm = {
|
|
|
+ .header = HEADER_SPAN("----- LLC Load Hitm -----", "Total", 2),
|
|
|
+ .name = "tot_hitm",
|
|
|
+ .cmp = tot_hitm_cmp,
|
|
|
+ .entry = tot_hitm_entry,
|
|
|
+ .width = 7,
|
|
|
+};
|
|
|
+
|
|
|
+static struct c2c_dimension dim_lcl_hitm = {
|
|
|
+ .header = HEADER_SPAN_LOW("Lcl"),
|
|
|
+ .name = "lcl_hitm",
|
|
|
+ .cmp = lcl_hitm_cmp,
|
|
|
+ .entry = lcl_hitm_entry,
|
|
|
+ .width = 7,
|
|
|
+};
|
|
|
+
|
|
|
+static struct c2c_dimension dim_rmt_hitm = {
|
|
|
+ .header = HEADER_SPAN_LOW("Rmt"),
|
|
|
+ .name = "rmt_hitm",
|
|
|
+ .cmp = rmt_hitm_cmp,
|
|
|
+ .entry = rmt_hitm_entry,
|
|
|
+ .width = 7,
|
|
|
+};
|
|
|
+
|
|
|
+static struct c2c_dimension dim_cl_rmt_hitm = {
|
|
|
+ .header = HEADER_SPAN("----- HITM -----", "Rmt", 1),
|
|
|
+ .name = "cl_rmt_hitm",
|
|
|
+ .cmp = rmt_hitm_cmp,
|
|
|
+ .entry = rmt_hitm_entry,
|
|
|
+ .width = 7,
|
|
|
+};
|
|
|
+
|
|
|
+static struct c2c_dimension dim_cl_lcl_hitm = {
|
|
|
+ .header = HEADER_SPAN_LOW("Lcl"),
|
|
|
+ .name = "cl_lcl_hitm",
|
|
|
+ .cmp = lcl_hitm_cmp,
|
|
|
+ .entry = lcl_hitm_entry,
|
|
|
+ .width = 7,
|
|
|
+};
|
|
|
+
|
|
|
static struct c2c_dimension *dimensions[] = {
|
|
|
&dim_dcacheline,
|
|
|
&dim_offset,
|
|
|
&dim_iaddr,
|
|
|
+ &dim_tot_hitm,
|
|
|
+ &dim_lcl_hitm,
|
|
|
+ &dim_rmt_hitm,
|
|
|
+ &dim_cl_lcl_hitm,
|
|
|
+ &dim_cl_rmt_hitm,
|
|
|
NULL,
|
|
|
};
|
|
|
|