Skip to content

Commit d8ff6ab

Browse files
committed
plugin_irq: add support for device transfer
Signed-off-by: Adriaan Schmidt <[email protected]>
1 parent b771c58 commit d8ff6ab

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

tuned/plugins/plugin_irq.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,18 +182,21 @@ def _set_irq_affinity(self, irq, affinity, restoring):
182182
#
183183
# "high-level" methods: apply tuning while saving original affinities
184184
#
185-
def _apply_irq_affinity(self, irqinfo, affinity, mode):
185+
def _apply_irq_affinity(self, irqinfo, affinity, mode, transfer):
186186
"""Apply IRQ affinity tuning
187187
188188
Args:
189189
irqinfo (IrqInfo): IRQ that should be tuned
190190
affinity (set): desired affinity
191191
"""
192-
original = self._get_irq_affinity(irqinfo.irq)
192+
if transfer:
193+
original = irqinfo.original_affinity
194+
else:
195+
original = self._get_irq_affinity(irqinfo.irq)
193196
if mode == "intersect":
194197
# intersection of affinity and original, if that is empty fall back to configured affinity
195198
affinity = affinity & original or affinity
196-
if irqinfo.unchangeable or affinity == original:
199+
if irqinfo.unchangeable or (not transfer and affinity == original):
197200
return
198201
res = self._set_irq_affinity(irqinfo.irq, affinity, False)
199202
if res == 0:
@@ -202,13 +205,13 @@ def _apply_irq_affinity(self, irqinfo, affinity, mode):
202205
elif res == -2:
203206
irqinfo.unchangeable = True
204207

205-
def _restore_irq_affinity(self, irqinfo):
208+
def _restore_irq_affinity(self, irqinfo, transfer):
206209
"""Restore IRQ affinity
207210
208211
Args:
209212
irqinfo (IrqInfo): IRQ that should be restored
210213
"""
211-
if irqinfo.unchangeable or irqinfo.original_affinity is None:
214+
if transfer or irqinfo.unchangeable or irqinfo.original_affinity is None:
212215
return
213216
self._set_irq_affinity(irqinfo.irq, irqinfo.original_affinity, True)
214217
irqinfo.original_affinity = None
@@ -257,6 +260,7 @@ def _mode(self, enabling, value, verify, ignore_missing, instance, transfer_inst
257260

258261
@command_custom("affinity", per_device=True)
259262
def _affinity(self, enabling, value, device, verify, ignore_missing, instance, transfer_instance):
263+
transfer = transfer_instance is not None
260264
irq = "DEFAULT" if device == "DEFAULT" else device[len("irq"):]
261265
if irq not in self._irqs:
262266
log.error("Unknown device: %s" % device)
@@ -267,6 +271,6 @@ def _affinity(self, enabling, value, device, verify, ignore_missing, instance, t
267271
return self._verify_irq_affinity(irqinfo, affinity, self._mode_val)
268272
if enabling:
269273
affinity = set(self._cmd.cpulist_unpack(value))
270-
return self._apply_irq_affinity(irqinfo, affinity, self._mode_val)
274+
return self._apply_irq_affinity(irqinfo, affinity, self._mode_val, transfer)
271275
else:
272-
return self._restore_irq_affinity(irqinfo)
276+
return self._restore_irq_affinity(irqinfo, transfer)

0 commit comments

Comments
 (0)