1
0
Fork 0

plugin_irq: add support for device transfer

Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
This commit is contained in:
Adriaan Schmidt 2026-06-08 11:24:55 +02:00
parent 47f4e78e96
commit 05696f1847

View file

@ -182,18 +182,25 @@ class IrqPlugin(hotplug.Plugin):
#
# "high-level" methods: apply tuning while saving original affinities
#
def _apply_irq_affinity(self, irqinfo, affinity, mode):
def _apply_irq_affinity(self, irqinfo, affinity, mode, transfer):
"""Apply IRQ affinity tuning
Args:
irqinfo (IrqInfo): IRQ that should be tuned
affinity (set): desired affinity
"""
original = self._get_irq_affinity(irqinfo.irq)
if transfer:
original = irqinfo.original_affinity
if original is None:
# the source instance never changed this IRQ, so the current
# affinity is the original
original = self._get_irq_affinity(irqinfo.irq)
else:
original = self._get_irq_affinity(irqinfo.irq)
if mode == "intersect":
# intersection of affinity and original, if that is empty fall back to configured affinity
affinity = affinity & original or affinity
if irqinfo.unchangeable or affinity == original:
if irqinfo.unchangeable or (not transfer and affinity == original):
return
res = self._set_irq_affinity(irqinfo.irq, affinity, False)
if res == 0:
@ -202,13 +209,13 @@ class IrqPlugin(hotplug.Plugin):
elif res == -2:
irqinfo.unchangeable = True
def _restore_irq_affinity(self, irqinfo):
def _restore_irq_affinity(self, irqinfo, transfer):
"""Restore IRQ affinity
Args:
irqinfo (IrqInfo): IRQ that should be restored
"""
if irqinfo.unchangeable or irqinfo.original_affinity is None:
if transfer or irqinfo.unchangeable or irqinfo.original_affinity is None:
return
self._set_irq_affinity(irqinfo.irq, irqinfo.original_affinity, True)
irqinfo.original_affinity = None
@ -257,6 +264,7 @@ class IrqPlugin(hotplug.Plugin):
@command_custom("affinity", per_device=True)
def _affinity(self, enabling, value, device, verify, ignore_missing, instance, transfer_instance):
transfer = transfer_instance is not None
irq = "DEFAULT" if device == "DEFAULT" else device[len("irq"):]
if irq not in self._irqs:
log.error("Unknown device: %s" % device)
@ -267,6 +275,6 @@ class IrqPlugin(hotplug.Plugin):
return self._verify_irq_affinity(irqinfo, affinity, self._mode_val)
if enabling:
affinity = set(self._cmd.cpulist_unpack(value))
return self._apply_irq_affinity(irqinfo, affinity, self._mode_val)
return self._apply_irq_affinity(irqinfo, affinity, self._mode_val, transfer)
else:
return self._restore_irq_affinity(irqinfo)
return self._restore_irq_affinity(irqinfo, transfer)