1bc7cbb1eSPetr Machata#!/bin/bash 2bc7cbb1eSPetr Machata# SPDX-License-Identifier: GPL-2.0 3bc7cbb1eSPetr Machata 4bc7cbb1eSPetr Machata############################################################################## 5bc7cbb1eSPetr Machata# Defines 6bc7cbb1eSPetr Machata 7*bc030d9cSIdo Schimmelif [[ ! -v DEVLINK_DEV ]]; then 88e46aee6SPetr Machata DEVLINK_DEV=$(devlink port show "${NETIFS[p1]}" -j \ 98e46aee6SPetr Machata | jq -r '.port | keys[]' | cut -d/ -f-2) 10bc7cbb1eSPetr Machata if [ -z "$DEVLINK_DEV" ]; then 11bc7cbb1eSPetr Machata echo "SKIP: ${NETIFS[p1]} has no devlink device registered for it" 12bc7cbb1eSPetr Machata exit 1 13bc7cbb1eSPetr Machata fi 14bc7cbb1eSPetr Machata if [[ "$(echo $DEVLINK_DEV | grep -c pci)" -eq 0 ]]; then 15bc7cbb1eSPetr Machata echo "SKIP: devlink device's bus is not PCI" 16bc7cbb1eSPetr Machata exit 1 17bc7cbb1eSPetr Machata fi 18bc7cbb1eSPetr Machata 19bc7cbb1eSPetr Machata DEVLINK_VIDDID=$(lspci -s $(echo $DEVLINK_DEV | cut -d"/" -f2) \ 20bc7cbb1eSPetr Machata -n | cut -d" " -f3) 21*bc030d9cSIdo Schimmelfi 22bc7cbb1eSPetr Machata 23bc7cbb1eSPetr Machata############################################################################## 24bc7cbb1eSPetr Machata# Sanity checks 25bc7cbb1eSPetr Machata 266f64bcb6SJiri Pirkodevlink help 2>&1 | grep resource &> /dev/null 27bc7cbb1eSPetr Machataif [ $? -ne 0 ]; then 28bc7cbb1eSPetr Machata echo "SKIP: iproute2 too old, missing devlink resource support" 29bc7cbb1eSPetr Machata exit 1 30bc7cbb1eSPetr Machatafi 31bc7cbb1eSPetr Machata 32bc7cbb1eSPetr Machata############################################################################## 33bc7cbb1eSPetr Machata# Devlink helpers 34bc7cbb1eSPetr Machata 35bc7cbb1eSPetr Machatadevlink_resource_names_to_path() 36bc7cbb1eSPetr Machata{ 37bc7cbb1eSPetr Machata local resource 38bc7cbb1eSPetr Machata local path="" 39bc7cbb1eSPetr Machata 40bc7cbb1eSPetr Machata for resource in "${@}"; do 41bc7cbb1eSPetr Machata if [ "$path" == "" ]; then 42bc7cbb1eSPetr Machata path="$resource" 43bc7cbb1eSPetr Machata else 44bc7cbb1eSPetr Machata path="${path}/$resource" 45bc7cbb1eSPetr Machata fi 46bc7cbb1eSPetr Machata done 47bc7cbb1eSPetr Machata 48bc7cbb1eSPetr Machata echo "$path" 49bc7cbb1eSPetr Machata} 50bc7cbb1eSPetr Machata 51bc7cbb1eSPetr Machatadevlink_resource_get() 52bc7cbb1eSPetr Machata{ 53bc7cbb1eSPetr Machata local name=$1 54bc7cbb1eSPetr Machata local resource_name=.[][\"$DEVLINK_DEV\"] 55bc7cbb1eSPetr Machata 56bc7cbb1eSPetr Machata resource_name="$resource_name | .[] | select (.name == \"$name\")" 57bc7cbb1eSPetr Machata 58bc7cbb1eSPetr Machata shift 59bc7cbb1eSPetr Machata for resource in "${@}"; do 60bc7cbb1eSPetr Machata resource_name="${resource_name} | .[\"resources\"][] | \ 61bc7cbb1eSPetr Machata select (.name == \"$resource\")" 62bc7cbb1eSPetr Machata done 63bc7cbb1eSPetr Machata 64bc7cbb1eSPetr Machata devlink -j resource show "$DEVLINK_DEV" | jq "$resource_name" 65bc7cbb1eSPetr Machata} 66bc7cbb1eSPetr Machata 67bc7cbb1eSPetr Machatadevlink_resource_size_get() 68bc7cbb1eSPetr Machata{ 69bc7cbb1eSPetr Machata local size=$(devlink_resource_get "$@" | jq '.["size_new"]') 70bc7cbb1eSPetr Machata 71bc7cbb1eSPetr Machata if [ "$size" == "null" ]; then 72bc7cbb1eSPetr Machata devlink_resource_get "$@" | jq '.["size"]' 73bc7cbb1eSPetr Machata else 74bc7cbb1eSPetr Machata echo "$size" 75bc7cbb1eSPetr Machata fi 76bc7cbb1eSPetr Machata} 77bc7cbb1eSPetr Machata 78bc7cbb1eSPetr Machatadevlink_resource_size_set() 79bc7cbb1eSPetr Machata{ 80bc7cbb1eSPetr Machata local new_size=$1 81bc7cbb1eSPetr Machata local path 82bc7cbb1eSPetr Machata 83bc7cbb1eSPetr Machata shift 84bc7cbb1eSPetr Machata path=$(devlink_resource_names_to_path "$@") 85bc7cbb1eSPetr Machata devlink resource set "$DEVLINK_DEV" path "$path" size "$new_size" 86bc7cbb1eSPetr Machata check_err $? "Failed setting path $path to size $size" 87bc7cbb1eSPetr Machata} 88bc7cbb1eSPetr Machata 89bc7cbb1eSPetr Machatadevlink_reload() 90bc7cbb1eSPetr Machata{ 91bc7cbb1eSPetr Machata local still_pending 92bc7cbb1eSPetr Machata 93bc7cbb1eSPetr Machata devlink dev reload "$DEVLINK_DEV" &> /dev/null 94bc7cbb1eSPetr Machata check_err $? "Failed reload" 95bc7cbb1eSPetr Machata 96bc7cbb1eSPetr Machata still_pending=$(devlink resource show "$DEVLINK_DEV" | \ 97bc7cbb1eSPetr Machata grep -c "size_new") 98bc7cbb1eSPetr Machata check_err $still_pending "Failed reload - There are still unset sizes" 99bc7cbb1eSPetr Machata} 100d04cc726SPetr Machata 101d04cc726SPetr Machatadeclare -A DEVLINK_ORIG 102d04cc726SPetr Machata 103d04cc726SPetr Machatadevlink_port_pool_threshold() 104d04cc726SPetr Machata{ 105d04cc726SPetr Machata local port=$1; shift 106d04cc726SPetr Machata local pool=$1; shift 107d04cc726SPetr Machata 108d04cc726SPetr Machata devlink sb port pool show $port pool $pool -j \ 109d04cc726SPetr Machata | jq '.port_pool."'"$port"'"[].threshold' 110d04cc726SPetr Machata} 111d04cc726SPetr Machata 112d04cc726SPetr Machatadevlink_port_pool_th_set() 113d04cc726SPetr Machata{ 114d04cc726SPetr Machata local port=$1; shift 115d04cc726SPetr Machata local pool=$1; shift 116d04cc726SPetr Machata local th=$1; shift 117d04cc726SPetr Machata local key="port_pool($port,$pool).threshold" 118d04cc726SPetr Machata 119d04cc726SPetr Machata DEVLINK_ORIG[$key]=$(devlink_port_pool_threshold $port $pool) 120d04cc726SPetr Machata devlink sb port pool set $port pool $pool th $th 121d04cc726SPetr Machata} 122d04cc726SPetr Machata 123d04cc726SPetr Machatadevlink_port_pool_th_restore() 124d04cc726SPetr Machata{ 125d04cc726SPetr Machata local port=$1; shift 126d04cc726SPetr Machata local pool=$1; shift 127d04cc726SPetr Machata local key="port_pool($port,$pool).threshold" 128d04cc726SPetr Machata 129d04cc726SPetr Machata devlink sb port pool set $port pool $pool th ${DEVLINK_ORIG[$key]} 130d04cc726SPetr Machata} 131d04cc726SPetr Machata 132d04cc726SPetr Machatadevlink_pool_size_thtype() 133d04cc726SPetr Machata{ 134d04cc726SPetr Machata local pool=$1; shift 135d04cc726SPetr Machata 136d04cc726SPetr Machata devlink sb pool show "$DEVLINK_DEV" pool $pool -j \ 137d04cc726SPetr Machata | jq -r '.pool[][] | (.size, .thtype)' 138d04cc726SPetr Machata} 139d04cc726SPetr Machata 140d04cc726SPetr Machatadevlink_pool_size_thtype_set() 141d04cc726SPetr Machata{ 142d04cc726SPetr Machata local pool=$1; shift 143d04cc726SPetr Machata local thtype=$1; shift 144d04cc726SPetr Machata local size=$1; shift 145d04cc726SPetr Machata local key="pool($pool).size_thtype" 146d04cc726SPetr Machata 147d04cc726SPetr Machata DEVLINK_ORIG[$key]=$(devlink_pool_size_thtype $pool) 148d04cc726SPetr Machata devlink sb pool set "$DEVLINK_DEV" pool $pool size $size thtype $thtype 149d04cc726SPetr Machata} 150d04cc726SPetr Machata 151d04cc726SPetr Machatadevlink_pool_size_thtype_restore() 152d04cc726SPetr Machata{ 153d04cc726SPetr Machata local pool=$1; shift 154d04cc726SPetr Machata local key="pool($pool).size_thtype" 155d04cc726SPetr Machata local -a orig=(${DEVLINK_ORIG[$key]}) 156d04cc726SPetr Machata 157d04cc726SPetr Machata devlink sb pool set "$DEVLINK_DEV" pool $pool \ 158d04cc726SPetr Machata size ${orig[0]} thtype ${orig[1]} 159d04cc726SPetr Machata} 160d04cc726SPetr Machata 161d04cc726SPetr Machatadevlink_tc_bind_pool_th() 162d04cc726SPetr Machata{ 163d04cc726SPetr Machata local port=$1; shift 164d04cc726SPetr Machata local tc=$1; shift 165d04cc726SPetr Machata local dir=$1; shift 166d04cc726SPetr Machata 167d04cc726SPetr Machata devlink sb tc bind show $port tc $tc type $dir -j \ 168d04cc726SPetr Machata | jq -r '.tc_bind[][] | (.pool, .threshold)' 169d04cc726SPetr Machata} 170d04cc726SPetr Machata 171d04cc726SPetr Machatadevlink_tc_bind_pool_th_set() 172d04cc726SPetr Machata{ 173d04cc726SPetr Machata local port=$1; shift 174d04cc726SPetr Machata local tc=$1; shift 175d04cc726SPetr Machata local dir=$1; shift 176d04cc726SPetr Machata local pool=$1; shift 177d04cc726SPetr Machata local th=$1; shift 178d04cc726SPetr Machata local key="tc_bind($port,$dir,$tc).pool_th" 179d04cc726SPetr Machata 180d04cc726SPetr Machata DEVLINK_ORIG[$key]=$(devlink_tc_bind_pool_th $port $tc $dir) 181d04cc726SPetr Machata devlink sb tc bind set $port tc $tc type $dir pool $pool th $th 182d04cc726SPetr Machata} 183d04cc726SPetr Machata 184d04cc726SPetr Machatadevlink_tc_bind_pool_th_restore() 185d04cc726SPetr Machata{ 186d04cc726SPetr Machata local port=$1; shift 187d04cc726SPetr Machata local tc=$1; shift 188d04cc726SPetr Machata local dir=$1; shift 189d04cc726SPetr Machata local key="tc_bind($port,$dir,$tc).pool_th" 190d04cc726SPetr Machata local -a orig=(${DEVLINK_ORIG[$key]}) 191d04cc726SPetr Machata 192d04cc726SPetr Machata devlink sb tc bind set $port tc $tc type $dir \ 193d04cc726SPetr Machata pool ${orig[0]} th ${orig[1]} 194d04cc726SPetr Machata} 195