Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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:
ca22d6977b9b Merge branch 'stmmac-next'
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+27 -36
+1 -17
drivers/net/ethernet/mellanox/mlx5/core/health.c
··· 555 555 return mlx5_health_try_recover(dev); 556 556 } 557 557 558 - #define MLX5_CR_DUMP_CHUNK_SIZE 256 559 558 static int 560 559 mlx5_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter, 561 560 struct devlink_fmsg *fmsg, void *priv_ctx, ··· 563 564 struct mlx5_core_dev *dev = devlink_health_reporter_priv(reporter); 564 565 u32 crdump_size = dev->priv.health.crdump_size; 565 566 u32 *cr_data; 566 - u32 data_size; 567 - u32 offset; 568 567 int err; 569 568 570 569 if (!mlx5_core_is_pf(dev)) ··· 583 586 goto free_data; 584 587 } 585 588 586 - err = devlink_fmsg_arr_pair_nest_start(fmsg, "crdump_data"); 587 - if (err) 588 - goto free_data; 589 - for (offset = 0; offset < crdump_size; offset += data_size) { 590 - if (crdump_size - offset < MLX5_CR_DUMP_CHUNK_SIZE) 591 - data_size = crdump_size - offset; 592 - else 593 - data_size = MLX5_CR_DUMP_CHUNK_SIZE; 594 - err = devlink_fmsg_binary_put(fmsg, (char *)cr_data + offset, 595 - data_size); 596 - if (err) 597 - goto free_data; 598 - } 599 - err = devlink_fmsg_arr_pair_nest_end(fmsg); 589 + err = devlink_fmsg_binary_pair_put(fmsg, "crdump_data", cr_data, crdump_size); 600 590 601 591 free_data: 602 592 kvfree(cr_data);
+1 -7
drivers/net/netdevsim/health.c
··· 82 82 if (err) 83 83 return err; 84 84 85 - err = devlink_fmsg_arr_pair_nest_start(fmsg, "test_binary"); 86 - if (err) 87 - return err; 88 85 binary = kmalloc(binary_len, GFP_KERNEL); 89 86 if (!binary) 90 87 return -ENOMEM; 91 88 get_random_bytes(binary, binary_len); 92 - err = devlink_fmsg_binary_put(fmsg, binary, binary_len); 89 + err = devlink_fmsg_binary_pair_put(fmsg, "test_binary", binary, binary_len); 93 90 kfree(binary); 94 - if (err) 95 - return err; 96 - err = devlink_fmsg_arr_pair_nest_end(fmsg); 97 91 if (err) 98 92 return err; 99 93
+1 -3
include/net/devlink.h
··· 967 967 int devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value); 968 968 int devlink_fmsg_u64_put(struct devlink_fmsg *fmsg, u64 value); 969 969 int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value); 970 - int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value, 971 - u16 value_len); 972 970 973 971 int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name, 974 972 bool value); ··· 979 981 int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name, 980 982 const char *value); 981 983 int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name, 982 - const void *value, u16 value_len); 984 + const void *value, u32 value_len); 983 985 984 986 struct devlink_health_reporter * 985 987 devlink_health_reporter_create(struct devlink *devlink,
+15 -9
net/core/devlink.c
··· 4414 4414 } 4415 4415 EXPORT_SYMBOL_GPL(devlink_fmsg_string_put); 4416 4416 4417 - int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value, 4418 - u16 value_len) 4417 + static int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value, 4418 + u16 value_len) 4419 4419 { 4420 4420 return devlink_fmsg_put_value(fmsg, value, value_len, NLA_BINARY); 4421 4421 } 4422 - EXPORT_SYMBOL_GPL(devlink_fmsg_binary_put); 4423 4422 4424 4423 int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name, 4425 4424 bool value) ··· 4526 4527 EXPORT_SYMBOL_GPL(devlink_fmsg_string_pair_put); 4527 4528 4528 4529 int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name, 4529 - const void *value, u16 value_len) 4530 + const void *value, u32 value_len) 4530 4531 { 4532 + u32 data_size; 4533 + u32 offset; 4531 4534 int err; 4532 4535 4533 - err = devlink_fmsg_pair_nest_start(fmsg, name); 4536 + err = devlink_fmsg_arr_pair_nest_start(fmsg, name); 4534 4537 if (err) 4535 4538 return err; 4536 4539 4537 - err = devlink_fmsg_binary_put(fmsg, value, value_len); 4538 - if (err) 4539 - return err; 4540 + for (offset = 0; offset < value_len; offset += data_size) { 4541 + data_size = value_len - offset; 4542 + if (data_size > DEVLINK_FMSG_MAX_SIZE) 4543 + data_size = DEVLINK_FMSG_MAX_SIZE; 4544 + err = devlink_fmsg_binary_put(fmsg, value + offset, data_size); 4545 + if (err) 4546 + return err; 4547 + } 4540 4548 4541 - err = devlink_fmsg_pair_nest_end(fmsg); 4549 + err = devlink_fmsg_arr_pair_nest_end(fmsg); 4542 4550 if (err) 4543 4551 return err; 4544 4552
+9
tools/testing/selftests/drivers/net/netdevsim/devlink.sh
··· 431 431 432 432 check_reporter_info dummy healthy 3 3 10 true 433 433 434 + echo 8192> $DEBUGFS_DIR/health/binary_len 435 + check_fail $? "Failed set dummy reporter binary len to 8192" 436 + 437 + local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j) 438 + check_err $? "Failed show dump of dummy reporter" 439 + 440 + devlink health dump clear $DL_HANDLE reporter dummy 441 + check_err $? "Failed clear dump of dummy reporter" 442 + 434 443 log_test "dummy reporter test" 435 444 } 436 445