/* update column width of dynamic entry */
        perf_hpp_list__for_each_sort_list(he->hpp_list, fmt) {
-               if (perf_hpp__is_dynamic_entry(fmt))
-                       fmt->sort(fmt, he, NULL);
+               if (fmt->init)
+                       fmt->init(fmt, he);
        }
 }
 
        rb_link_node(&he->rb_node, parent, p);
        rb_insert_color_cached(&he->rb_node, entries, leftmost);
 
+       /* update column width of dynamic entries */
        perf_hpp_list__for_each_sort_list(&perf_hpp_list, fmt) {
-               if (perf_hpp__is_dynamic_entry(fmt) &&
-                   perf_hpp__defined_dynamic_entry(fmt, he->hists))
-                       fmt->sort(fmt, he, NULL);  /* update column width */
+               if (fmt->init)
+                       fmt->init(fmt, he);
        }
 }
 
 
                      struct hists *hists, int line, int *span);
        int (*width)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
                     struct hists *hists);
+       void (*init)(struct perf_hpp_fmt *fmt, struct hist_entry *he);
        int (*color)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
                     struct hist_entry *he);
        int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
 
        free(hse);
 }
 
+static void hse_init(struct perf_hpp_fmt *fmt, struct hist_entry *he)
+{
+       struct hpp_sort_entry *hse;
+
+       if (!perf_hpp__is_sort_entry(fmt))
+               return;
+
+       hse = container_of(fmt, struct hpp_sort_entry, hpp);
+
+       if (hse->se->se_init)
+               hse->se->se_init(he);
+}
+
 static struct hpp_sort_entry *
 __sort_dimension__alloc_hpp(struct sort_dimension *sd, int level)
 {
        hse->hpp.sort = __sort__hpp_sort;
        hse->hpp.equal = __sort__hpp_equal;
        hse->hpp.free = hse_free;
+       hse->hpp.init = hse_init;
 
        INIT_LIST_HEAD(&hse->hpp.list);
        INIT_LIST_HEAD(&hse->hpp.sort_list);
 
        hde = container_of(fmt, struct hpp_dynamic_entry, hpp);
 
-       if (b == NULL) {
-               update_dynamic_len(hde, a);
-               return 0;
-       }
-
        field = hde->field;
        if (field->flags & TEP_FIELD_IS_DYNAMIC) {
                unsigned long long dyn;
        free(hde);
 }
 
+static void __sort__hde_init(struct perf_hpp_fmt *fmt, struct hist_entry *he)
+{
+       struct hpp_dynamic_entry *hde;
+
+       if (!perf_hpp__is_dynamic_entry(fmt))
+               return;
+
+       hde = container_of(fmt, struct hpp_dynamic_entry, hpp);
+       update_dynamic_len(hde, he);
+}
+
 static struct hpp_dynamic_entry *
 __alloc_dynamic_entry(struct evsel *evsel, struct tep_format_field *field,
                      int level)
        hde->hpp.entry  = __sort__hde_entry;
        hde->hpp.color  = NULL;
 
+       hde->hpp.init = __sort__hde_init;
        hde->hpp.cmp = __sort__hde_cmp;
        hde->hpp.collapse = __sort__hde_cmp;
        hde->hpp.sort = __sort__hde_cmp;