Commit 084346be authored by David S. Miller's avatar David S. Miller

Merge branch 'Update-devlink-binary-output'

Aya Levin says:

====================
Update devlink binary output

This series changes the devlink binary interface:
-The first patch forces binary values to be enclosed in an array. In
 addition, devlink_fmsg_binary_pair_put breaks the binary value into
 chunks to comply with devlink's restriction for value length.
-The second patch removes redundant code and uses the fixed devlink
 interface (devlink_fmsg_binary_pair_put).
-The third patch make self test to use the updated devlink
 interface.
-The fourth, adds a verification of dumping a very large binary
 content. This test verifies breaking the data into chunks in a valid
 JSON output.

Series was generated against net-next commit:
ca22d697 Merge branch 'stmmac-next'
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 6c086702 ff18176a
...@@ -555,7 +555,6 @@ mlx5_fw_fatal_reporter_recover(struct devlink_health_reporter *reporter, ...@@ -555,7 +555,6 @@ mlx5_fw_fatal_reporter_recover(struct devlink_health_reporter *reporter,
return mlx5_health_try_recover(dev); return mlx5_health_try_recover(dev);
} }
#define MLX5_CR_DUMP_CHUNK_SIZE 256
static int static int
mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter, mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter,
struct devlink_fmsg *fmsg, void *priv_ctx, struct devlink_fmsg *fmsg, void *priv_ctx,
...@@ -564,8 +563,6 @@ mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter, ...@@ -564,8 +563,6 @@ mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter,
struct mlx5_core_dev *dev = devlink_health_reporter_priv(reporter); struct mlx5_core_dev *dev = devlink_health_reporter_priv(reporter);
u32 crdump_size = dev->priv.health.crdump_size; u32 crdump_size = dev->priv.health.crdump_size;
u32 *cr_data; u32 *cr_data;
u32 data_size;
u32 offset;
int err; int err;
if (!mlx5_core_is_pf(dev)) if (!mlx5_core_is_pf(dev))
...@@ -586,20 +583,7 @@ mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter, ...@@ -586,20 +583,7 @@ mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter,
goto free_data; goto free_data;
} }
err = devlink_fmsg_arr_pair_nest_start(fmsg, "crdump_data"); err = devlink_fmsg_binary_pair_put(fmsg, "crdump_data", cr_data, crdump_size);
if (err)
goto free_data;
for (offset = 0; offset < crdump_size; offset += data_size) {
if (crdump_size - offset < MLX5_CR_DUMP_CHUNK_SIZE)
data_size = crdump_size - offset;
else
data_size = MLX5_CR_DUMP_CHUNK_SIZE;
err = devlink_fmsg_binary_put(fmsg, (char *)cr_data + offset,
data_size);
if (err)
goto free_data;
}
err = devlink_fmsg_arr_pair_nest_end(fmsg);
free_data: free_data:
kvfree(cr_data); kvfree(cr_data);
......
...@@ -82,18 +82,12 @@ static int nsim_dev_dummy_fmsg_put(struct devlink_fmsg *fmsg, u32 binary_len) ...@@ -82,18 +82,12 @@ static int nsim_dev_dummy_fmsg_put(struct devlink_fmsg *fmsg, u32 binary_len)
if (err) if (err)
return err; return err;
err = devlink_fmsg_arr_pair_nest_start(fmsg, "test_binary");
if (err)
return err;
binary = kmalloc(binary_len, GFP_KERNEL); binary = kmalloc(binary_len, GFP_KERNEL);
if (!binary) if (!binary)
return -ENOMEM; return -ENOMEM;
get_random_bytes(binary, binary_len); get_random_bytes(binary, binary_len);
err = devlink_fmsg_binary_put(fmsg, binary, binary_len); err = devlink_fmsg_binary_pair_put(fmsg, "test_binary", binary, binary_len);
kfree(binary); kfree(binary);
if (err)
return err;
err = devlink_fmsg_arr_pair_nest_end(fmsg);
if (err) if (err)
return err; return err;
......
...@@ -967,8 +967,6 @@ int devlink_fmsg_u8_put(struct devlink_fmsg *fmsg, u8 value); ...@@ -967,8 +967,6 @@ int devlink_fmsg_u8_put(struct devlink_fmsg *fmsg, u8 value);
int devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value); int devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value);
int devlink_fmsg_u64_put(struct devlink_fmsg *fmsg, u64 value); int devlink_fmsg_u64_put(struct devlink_fmsg *fmsg, u64 value);
int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value); int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value);
int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value,
u16 value_len);
int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name, int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name,
bool value); bool value);
...@@ -981,7 +979,7 @@ int devlink_fmsg_u64_pair_put(struct devlink_fmsg *fmsg, const char *name, ...@@ -981,7 +979,7 @@ int devlink_fmsg_u64_pair_put(struct devlink_fmsg *fmsg, const char *name,
int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name, int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name,
const char *value); const char *value);
int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name, int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name,
const void *value, u16 value_len); const void *value, u32 value_len);
struct devlink_health_reporter * struct devlink_health_reporter *
devlink_health_reporter_create(struct devlink *devlink, devlink_health_reporter_create(struct devlink *devlink,
......
...@@ -4414,12 +4414,11 @@ int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value) ...@@ -4414,12 +4414,11 @@ int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value)
} }
EXPORT_SYMBOL_GPL(devlink_fmsg_string_put); EXPORT_SYMBOL_GPL(devlink_fmsg_string_put);
int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value, static int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value,
u16 value_len) u16 value_len)
{ {
return devlink_fmsg_put_value(fmsg, value, value_len, NLA_BINARY); return devlink_fmsg_put_value(fmsg, value, value_len, NLA_BINARY);
} }
EXPORT_SYMBOL_GPL(devlink_fmsg_binary_put);
int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name, int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name,
bool value) bool value)
...@@ -4527,19 +4526,26 @@ int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name, ...@@ -4527,19 +4526,26 @@ int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name,
EXPORT_SYMBOL_GPL(devlink_fmsg_string_pair_put); EXPORT_SYMBOL_GPL(devlink_fmsg_string_pair_put);
int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name, int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name,
const void *value, u16 value_len) const void *value, u32 value_len)
{ {
u32 data_size;
u32 offset;
int err; int err;
err = devlink_fmsg_pair_nest_start(fmsg, name); err = devlink_fmsg_arr_pair_nest_start(fmsg, name);
if (err) if (err)
return err; return err;
err = devlink_fmsg_binary_put(fmsg, value, value_len); for (offset = 0; offset < value_len; offset += data_size) {
if (err) data_size = value_len - offset;
return err; if (data_size > DEVLINK_FMSG_MAX_SIZE)
data_size = DEVLINK_FMSG_MAX_SIZE;
err = devlink_fmsg_binary_put(fmsg, value + offset, data_size);
if (err)
return err;
}
err = devlink_fmsg_pair_nest_end(fmsg); err = devlink_fmsg_arr_pair_nest_end(fmsg);
if (err) if (err)
return err; return err;
......
...@@ -431,6 +431,15 @@ dummy_reporter_test() ...@@ -431,6 +431,15 @@ dummy_reporter_test()
check_reporter_info dummy healthy 3 3 10 true check_reporter_info dummy healthy 3 3 10 true
echo 8192> $DEBUGFS_DIR/health/binary_len
check_fail $? "Failed set dummy reporter binary len to 8192"
local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j)
check_err $? "Failed show dump of dummy reporter"
devlink health dump clear $DL_HANDLE reporter dummy
check_err $? "Failed clear dump of dummy reporter"
log_test "dummy reporter test" log_test "dummy reporter test"
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment