2021-09-02 20:58:58

by Tom Zanussi

[permalink] [raw]
Subject: [PATCH] tracing: Dynamically allocate the per-elt hist_elt_data array

Setting the hist_elt_data.field_var_str[] array unconditionally to a
size of SYNTH_FIELD_MAX elements wastes space unnecessarily. The
actual number of elements needed can be calculated at run-time
instead.

In most cases, this will save a lot of space since it's a per-elt
array which isn't normally close to being full. It also allows us to
increase SYNTH_FIELD_MAX without worrying about even more wastage when
we do that.

Signed-off-by: Tom Zanussi <[email protected]>
---
kernel/trace/trace_events_hist.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 9d91b1c06957..a6061a69aa84 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -508,7 +508,8 @@ struct track_data {
struct hist_elt_data {
char *comm;
u64 *var_ref_vals;
- char *field_var_str[SYNTH_FIELDS_MAX];
+ char **field_var_str;
+ int n_field_var_str;
};

struct snapshot_context {
@@ -1401,9 +1402,11 @@ static void hist_elt_data_free(struct hist_elt_data *elt_data)
{
unsigned int i;

- for (i = 0; i < SYNTH_FIELDS_MAX; i++)
+ for (i = 0; i < elt_data->n_field_var_str; i++)
kfree(elt_data->field_var_str[i]);

+ kfree(elt_data->field_var_str);
+
kfree(elt_data->comm);
kfree(elt_data);
}
@@ -1451,6 +1454,13 @@ static int hist_trigger_elt_data_alloc(struct tracing_map_elt *elt)

size = STR_VAR_LEN_MAX;

+ elt_data->field_var_str = kcalloc(n_str, sizeof(char *), GFP_KERNEL);
+ if (!elt_data->field_var_str) {
+ hist_elt_data_free(elt_data);
+ return -EINVAL;
+ }
+ elt_data->n_field_var_str = n_str;
+
for (i = 0; i < n_str; i++) {
elt_data->field_var_str[i] = kzalloc(size, GFP_KERNEL);
if (!elt_data->field_var_str[i]) {
--
2.17.1



2021-09-03 13:54:25

by Artem Bityutskiy

[permalink] [raw]
Subject: Re: [PATCH] tracing: Dynamically allocate the per-elt hist_elt_data array

On Thu, 2021-09-02 at 15:57 -0500, Tom Zanussi wrote:
> Setting the hist_elt_data.field_var_str[] array unconditionally to a
> size of SYNTH_FIELD_MAX elements wastes space unnecessarily. The
> actual number of elements needed can be calculated at run-time
> instead.
>
> In most cases, this will save a lot of space since it's a per-elt
> array which isn't normally close to being full. It also allows us to
> increase SYNTH_FIELD_MAX without worrying about even more wastage when
> we do that.
>
> Signed-off-by: Tom Zanussi <[email protected]>

Many thanks Tom! I've tested this one.

Tested-by: Artem Bityutskiy <[email protected]>