@@ -241,17 +241,44 @@ function create_vf() {
241241}
242242
243243
244- function get_pattern () {
244+ get_raw_vf_pattern () {
245245 local dev=$1
246- pattern= $( devlink -js port | \
246+ devlink -js port | \
247247 jq -r --arg dev " $dev " ' .port | to_entries[] | select(.key | startswith("pci/" + $dev)) | select(.value.flavour=="pcivf") | .value.netdev' | \
248- sed -rn ' s/(.*[a-z_])[0-9]{1,3}$/\1/p' | uniq)
249- if [ -z " $pattern " ]; then
250- err " can't determine the vf pattern for $dev "
251- elif [ $( wc -l <<< " $pattern" ) -ne 1 ]; then
252- err " multiple vf patterns found for $dev "
248+ sed -rn ' s/(.*[a-z_])[0-9]{1,3}$/\1/p' | \
249+ uniq
250+ }
251+
252+ function get_pattern() {
253+ local dev=$1
254+ local pattern
255+
256+ if [[ " $IS_ARM_WITH_BLUEFIELD " == " true" ]]; then
257+ local timeout_seconds=120
258+ local interval_seconds=2
259+ local end_time=$(( $(date +% s) + timeout_seconds ))
260+
261+ while [ $( date +%s) -lt $end_time ]; do
262+ pattern=$( get_raw_vf_pattern " $dev " )
263+ if [ -n " $pattern " ]; then
264+ if [ $( wc -l <<< " $pattern" ) -eq 1 ]; then
265+ sleep $interval_seconds
266+ echo " $pattern "
267+ return
268+ fi
269+ fi
270+ sleep $interval_seconds
271+ done
272+ err " timed out after ${timeout_seconds} s waiting for the vf pattern for $dev "
273+ else
274+ pattern=$( get_raw_vf_pattern " $dev " )
275+ if [ -z " $pattern " ]; then
276+ err " can't determine the vf pattern for $dev "
277+ elif [ $( wc -l <<< " $pattern" ) -ne 1 ]; then
278+ err " multiple vf patterns found for $dev "
279+ fi
280+ echo " $pattern "
253281 fi
254- echo " $pattern "
255282}
256283
257284function get_ifname() {
@@ -354,5 +381,9 @@ validate
354381get_pfs
355382detect_card_and_arch_type
356383validate_pf
384+ # Bluefield relies on host side creating VFs, so wait here for systemd to settle and dont rush with the next steps
385+ if [[ " $IS_ARM_WITH_BLUEFIELD " == " true" ]]; then
386+ udevadm settle
387+ fi
357388create_vf
358389make_config
0 commit comments