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

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
Loading
Loading
Loading
Loading
+1 −17
Original line number Diff line number Diff line
@@ -555,7 +555,6 @@ mlx5_fw_fatal_reporter_recover(struct devlink_health_reporter *reporter,
	return mlx5_health_try_recover(dev);
}

#define MLX5_CR_DUMP_CHUNK_SIZE 256
static int
mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter,
			    struct devlink_fmsg *fmsg, void *priv_ctx,
@@ -564,8 +563,6 @@ mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter,
	struct mlx5_core_dev *dev = devlink_health_reporter_priv(reporter);
	u32 crdump_size = dev->priv.health.crdump_size;
	u32 *cr_data;
	u32 data_size;
	u32 offset;
	int err;

	if (!mlx5_core_is_pf(dev))
@@ -586,20 +583,7 @@ mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter,
			goto free_data;
	}

	err = devlink_fmsg_arr_pair_nest_start(fmsg, "crdump_data");
	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);
	err = devlink_fmsg_binary_pair_put(fmsg, "crdump_data", cr_data, crdump_size);

free_data:
	kvfree(cr_data);
+1 −7
Original line number Diff line number Diff line
@@ -82,18 +82,12 @@ static int nsim_dev_dummy_fmsg_put(struct devlink_fmsg *fmsg, u32 binary_len)
	if (err)
		return err;

	err = devlink_fmsg_arr_pair_nest_start(fmsg, "test_binary");
	if (err)
		return err;
	binary = kmalloc(binary_len, GFP_KERNEL);
	if (!binary)
		return -ENOMEM;
	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);
	if (err)
		return err;
	err = devlink_fmsg_arr_pair_nest_end(fmsg);
	if (err)
		return err;

+1 −3
Original line number Diff line number Diff line
@@ -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_u64_put(struct devlink_fmsg *fmsg, u64 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,
			       bool value);
@@ -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,
				 const char *value);
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 *
devlink_health_reporter_create(struct devlink *devlink,
+15 −9
Original line number Diff line number Diff line
@@ -4414,12 +4414,11 @@ int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value)
}
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)
{
	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,
			       bool value)
@@ -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);

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;

	err = devlink_fmsg_pair_nest_start(fmsg, name);
	err = devlink_fmsg_arr_pair_nest_start(fmsg, name);
	if (err)
		return err;

	err = devlink_fmsg_binary_put(fmsg, value, value_len);
	for (offset = 0; offset < value_len; offset += data_size) {
		data_size = value_len - offset;
		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)
		return err;

+9 −0
Original line number Diff line number Diff line
@@ -431,6 +431,15 @@ dummy_reporter_test()

	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"
}