summaryrefslogtreecommitdiff
path: root/google-startup-scripts/usr/share/google/virtionet-irq-affinity
diff options
context:
space:
mode:
Diffstat (limited to 'google-startup-scripts/usr/share/google/virtionet-irq-affinity')
-rwxr-xr-xgoogle-startup-scripts/usr/share/google/virtionet-irq-affinity141
1 files changed, 0 insertions, 141 deletions
diff --git a/google-startup-scripts/usr/share/google/virtionet-irq-affinity b/google-startup-scripts/usr/share/google/virtionet-irq-affinity
deleted file mode 100755
index 6b86ee2..0000000
--- a/google-startup-scripts/usr/share/google/virtionet-irq-affinity
+++ /dev/null
@@ -1,141 +0,0 @@
-#! /bin/bash
-# Copyright 2013 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# For a single-queue / no MSI-X virtionet device, sets the IRQ affinities to
-# processor 0. For this virtionet configuration, distributing IRQs to all
-# processors results in comparatively high cpu utilization and comparatively
-# low network bandwidth.
-#
-# For a multi-queue / MSI-X virtionet device, sets the IRQ affinities to the
-# per-IRQ affinity hint. The virtionet driver maps each virtionet TX (RX) queue
-# MSI-X interrupt to a unique single CPU if the number of TX (RX) queues equals
-# the number of online CPUs. The mapping of network MSI-X interrupt vector to
-# CPUs is stored in the virtionet MSI-X interrupt vector affinity hint. This
-# configuration allows network traffic to be spread across the CPUs, giving
-# each CPU a dedicated TX and RX network queue, while ensuring that all packets
-# from a single flow are delivered to the same CPU.
-
-function log() {
- if [[ -x ${PREFIX}/usr/bin/logger ]]; then
- echo $* | ${PREFIX}/usr/bin/logger -t virtionet-irq-affinity -p daemon.info
- else
- echo $* >&2
- fi
-}
-
-function is_decimal_int() {
- [ "${1}" -eq "${1}" ] > /dev/null 2>&1
-}
-
-function set_channels() {
- ethtool -L "${1}" combined "${2}" > /dev/null 2>&1
-}
-
-log "Running $(basename $0)"
-NET_DEVS=/sys/bus/virtio/drivers/virtio_net/virtio*
-
-# Loop through all the virtionet devices and enable multi-queue
-if [ -x /sbin/ethtool ]; then
- for dev in $NET_DEVS; do
- ETH_DEVS=${dev}/net/*
- for eth_dev in $ETH_DEVS; do
- eth_dev=$(basename "$eth_dev")
- if ! errormsg=$(ethtool -l "$eth_dev" 2>&1); then
- log "/sbin/ethtool says that $eth_dev does not support virtionet multiqueue: $errormsg"
- continue
- fi
- num_max_channels=$(ethtool -l "$eth_dev" | grep -m 1 Combined | cut -f2)
- [ "${num_max_channels}" -eq "1" ] && continue
- if is_decimal_int "$num_max_channels" && \
- set_channels "$eth_dev" "$num_max_channels"; then
- log "Set channels for $eth_dev to $num_max_channels"
- else
- log "Could not set channels for $eth_dev to $num_max_channels"
- fi
- done
- done
-else
- log "/sbin/ethtool not found: cannot configure virtionet multiqueue"
-fi
-
-for dev in $NET_DEVS
-do
- dev=$(basename "$dev")
- irq_dir=/proc/irq/*
- for irq in $irq_dir
- do
- smp_affinity="${irq}/smp_affinity"
- [ ! -f "${smp_affinity}" ] && continue
- # Classify this IRQ as virtionet intx, virtionet MSI-X, or non-virtionet
- # If the IRQ type is virtionet intx, a subdirectory with the same name as
- # the device will be present. If the IRQ type is virtionet MSI-X, then
- # a subdirectory of the form <device name>-<input|output>.N will exist.
- # In this case, N is the input (output) queue number, and is specified as
- # a decimal integer ranging from 0 to K - 1 where K is the number of
- # input (output) queues in the virtionet device.
- virtionet_intx_dir="${irq}/${dev}"
- virtionet_msix_dir_regex=".*/${dev}-(input|output)\.[0-9]+$"
- if [ -d "${virtionet_intx_dir}" ]; then
- # All virtionet intx IRQs are delivered to CPU 0
- log "Setting ${smp_affinity} to 01 for device ${dev}"
- echo "01" > ${smp_affinity}
- continue
- fi
- # Not virtionet intx, probe for MSI-X
- virtionet_msix_found=0
- for entry in ${irq}/${dev}*; do
- if [[ "$entry" =~ ${virtionet_msix_dir_regex} ]]; then
- virtionet_msix_found=1
- fi
- done
- affinity_hint="${irq}/affinity_hint"
- [ "$virtionet_msix_found" -eq 0 -o ! -f "${affinity_hint}" ] && continue
-
- # The affinity hint file contains a CPU mask, consisting of
- # groups of up to 8 hexadecimal digits, separated by a comma. Each bit
- # position in the CPU mask hex value specifies whether this interrupt
- # should be delivered to the corresponding CPU. For example, if bits 0
- # and 3 are set in the affinity hint CPU mask hex value, then the
- # interrupt should be delivered to CPUs 0 and 3. The virtionet device
- # driver should set only a single bit in the affinity hint per MSI-X
- # interrupt, ensuring each TX (RX) queue is used only by a single CPU.
- # The virtionet driver will only specify an affinity hint if the number of
- # TX (RX) queues equals the number of online CPUs. If no affinity hint is
- # specified for an IRQ, the affinity hint file will contain all zeros.
- affinity_cpumask=$(cat "${affinity_hint}")
- affinity_hint_enabled=0
- # Parse the affinity hint, skip if mask is invalid or is empty (all-zeros)
- OIFS=${IFS}
- IFS=","
- for cpu_bitmap in ${affinity_cpumask}; do
- bitmap_val=$(printf "%d" "0x${cpu_bitmap}" 2>/dev/null)
- if [ "$?" -ne 0 ]; then
- log "Invalid affinity hint ${affinity_hint}: ${affinity_cpumask}"
- affinity_hint_enabled=0
- break
- elif [ "${bitmap_val}" -ne 0 ]; then
- affinity_hint_enabled=1
- fi
- done
- IFS=${OIFS}
- if [ "${affinity_hint_enabled}" -eq 0 ]; then
- log "Cannot set IRQ affinity ${smp_affinity}, affinity hint disabled"
- else
- # Set the IRQ CPU affinity to the virtionet-initialized affinity hint
- log "Setting ${smp_affinity} to ${affinity_cpumask} for device ${dev}"
- echo "${affinity_cpumask}" > "${smp_affinity}"
- fi
- done
-done