devlink_lib.sh 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. ##############################################################################
  4. # Source library
  5. relative_path="${BASH_SOURCE%/*}"
  6. if [[ "$relative_path" == "${BASH_SOURCE}" ]]; then
  7. relative_path="."
  8. fi
  9. source "$relative_path/lib.sh"
  10. ##############################################################################
  11. # Defines
  12. DEVLINK_DEV=$(devlink port show | grep "${NETIFS[p1]}" | \
  13. grep -v "${NETIFS[p1]}[0-9]" | cut -d" " -f1 | \
  14. rev | cut -d"/" -f2- | rev)
  15. if [ -z "$DEVLINK_DEV" ]; then
  16. echo "SKIP: ${NETIFS[p1]} has no devlink device registered for it"
  17. exit 1
  18. fi
  19. if [[ "$(echo $DEVLINK_DEV | grep -c pci)" -eq 0 ]]; then
  20. echo "SKIP: devlink device's bus is not PCI"
  21. exit 1
  22. fi
  23. DEVLINK_VIDDID=$(lspci -s $(echo $DEVLINK_DEV | cut -d"/" -f2) \
  24. -n | cut -d" " -f3)
  25. ##############################################################################
  26. # Sanity checks
  27. devlink -j resource show "$DEVLINK_DEV" &> /dev/null
  28. if [ $? -ne 0 ]; then
  29. echo "SKIP: iproute2 too old, missing devlink resource support"
  30. exit 1
  31. fi
  32. ##############################################################################
  33. # Devlink helpers
  34. devlink_resource_names_to_path()
  35. {
  36. local resource
  37. local path=""
  38. for resource in "${@}"; do
  39. if [ "$path" == "" ]; then
  40. path="$resource"
  41. else
  42. path="${path}/$resource"
  43. fi
  44. done
  45. echo "$path"
  46. }
  47. devlink_resource_get()
  48. {
  49. local name=$1
  50. local resource_name=.[][\"$DEVLINK_DEV\"]
  51. resource_name="$resource_name | .[] | select (.name == \"$name\")"
  52. shift
  53. for resource in "${@}"; do
  54. resource_name="${resource_name} | .[\"resources\"][] | \
  55. select (.name == \"$resource\")"
  56. done
  57. devlink -j resource show "$DEVLINK_DEV" | jq "$resource_name"
  58. }
  59. devlink_resource_size_get()
  60. {
  61. local size=$(devlink_resource_get "$@" | jq '.["size_new"]')
  62. if [ "$size" == "null" ]; then
  63. devlink_resource_get "$@" | jq '.["size"]'
  64. else
  65. echo "$size"
  66. fi
  67. }
  68. devlink_resource_size_set()
  69. {
  70. local new_size=$1
  71. local path
  72. shift
  73. path=$(devlink_resource_names_to_path "$@")
  74. devlink resource set "$DEVLINK_DEV" path "$path" size "$new_size"
  75. check_err $? "Failed setting path $path to size $size"
  76. }
  77. devlink_reload()
  78. {
  79. local still_pending
  80. devlink dev reload "$DEVLINK_DEV" &> /dev/null
  81. check_err $? "Failed reload"
  82. still_pending=$(devlink resource show "$DEVLINK_DEV" | \
  83. grep -c "size_new")
  84. check_err $still_pending "Failed reload - There are still unset sizes"
  85. }