cli_space
}
+cli_device_show_queues() {
+ assert [ $# -eq 2 ]
+
+ local level=${1}
+ local device=${2}
+
+ cli_headline ${level} "Queues"
+ cli_print_fmt1 ${level} "Queue" "Processors"
+
+ local processors=$(system_get_processors)
+
+ local queue
+ for queue in $(device_get_queues ${device}); do
+ local smp_affinity=$(device_queue_get_smp_affinity ${device} ${queue})
+
+ local processor s=""
+ for (( processor = 0; processor < ${processors}; processor++ )); do
+ if ! isset smp_affinity || list_match ${processor} ${smp_affinity}; then
+ list_append s ${processor}
+ fi
+ done
+
+ cli_print_fmt1 ${level} "${queue}" "$(list_join s ", ")"
+ done
+ cli_space
+}
+
cli_headline() {
local level=${1}
local format=${2}
done
}
+device_supports_multiqueue() {
+ local device=${1}
+
+ local num_queues=$(device_num_queues ${device})
+
+ if isset num_queues && [ ${num_queues} -gt 2 ]; then
+ return ${EXIT_TRUE}
+ fi
+
+ return ${EXIT_FALSE}
+}
+
+device_num_queues() {
+ local device=${1}
+ local type=${2}
+
+ assert isoneof type "" rx tx
+
+ local i=0
+
+ local q
+ for q in $(device_get_queues ${device}); do
+ case "${type},${q}" in
+ rx,rx-*)
+ (( i++ ))
+ ;;
+ tx,tx-*)
+ (( i++ ))
+ ;;
+ *,*)
+ (( i++ ))
+ ;;
+ esac
+ done
+
+ print ${i}
+}
+
+device_queue_get_smp_affinity() {
+ assert [ $# -eq 2 ]
+
+ local device=${1}
+ local queue=${2}
+
+ local path="${SYS_CLASS_NET}/${device}/queues/${queue}/rps_cpus"
+ assert [ -r "${path}" ]
+
+ __bitmap_to_processor_ids $(<${path})
+}
+
device_queue_set_smp_affinity() {
assert [ $# -eq 3 ]
device_is_promisc ${device} &>/dev/null
cli_print_fmt1 1 "Promisc" "$(cli_print_bool $?)"
+
+ # Supports multiqueue?
+ if device_supports_multiqueue ${device}; then
+ cli_print_fmt 1 "Multiqueue" "Supported"
+ fi
cli_space
+ cli_device_show_queues 2 ${device}
+
# Print all vlan devices.
local vlans=$(device_get_vlans ${device})
if [ -n "${vlans}" ]; then