@@ -182,18 +182,21 @@ def _set_irq_affinity(self, irq, affinity, restoring):
182
182
#
183
183
# "high-level" methods: apply tuning while saving original affinities
184
184
#
185
- def _apply_irq_affinity (self , irqinfo , affinity , mode ):
185
+ def _apply_irq_affinity (self , irqinfo , affinity , mode , transfer ):
186
186
"""Apply IRQ affinity tuning
187
187
188
188
Args:
189
189
irqinfo (IrqInfo): IRQ that should be tuned
190
190
affinity (set): desired affinity
191
191
"""
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 )
193
196
if mode == "intersect" :
194
197
# intersection of affinity and original, if that is empty fall back to configured affinity
195
198
affinity = affinity & original or affinity
196
- if irqinfo .unchangeable or affinity == original :
199
+ if irqinfo .unchangeable or ( not transfer and affinity == original ) :
197
200
return
198
201
res = self ._set_irq_affinity (irqinfo .irq , affinity , False )
199
202
if res == 0 :
@@ -202,13 +205,13 @@ def _apply_irq_affinity(self, irqinfo, affinity, mode):
202
205
elif res == - 2 :
203
206
irqinfo .unchangeable = True
204
207
205
- def _restore_irq_affinity (self , irqinfo ):
208
+ def _restore_irq_affinity (self , irqinfo , transfer ):
206
209
"""Restore IRQ affinity
207
210
208
211
Args:
209
212
irqinfo (IrqInfo): IRQ that should be restored
210
213
"""
211
- if irqinfo .unchangeable or irqinfo .original_affinity is None :
214
+ if transfer or irqinfo .unchangeable or irqinfo .original_affinity is None :
212
215
return
213
216
self ._set_irq_affinity (irqinfo .irq , irqinfo .original_affinity , True )
214
217
irqinfo .original_affinity = None
@@ -257,6 +260,7 @@ def _mode(self, enabling, value, verify, ignore_missing, instance, transfer_inst
257
260
258
261
@command_custom ("affinity" , per_device = True )
259
262
def _affinity (self , enabling , value , device , verify , ignore_missing , instance , transfer_instance ):
263
+ transfer = transfer_instance is not None
260
264
irq = "DEFAULT" if device == "DEFAULT" else device [len ("irq" ):]
261
265
if irq not in self ._irqs :
262
266
log .error ("Unknown device: %s" % device )
@@ -267,6 +271,6 @@ def _affinity(self, enabling, value, device, verify, ignore_missing, instance, t
267
271
return self ._verify_irq_affinity (irqinfo , affinity , self ._mode_val )
268
272
if enabling :
269
273
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 )
271
275
else :
272
- return self ._restore_irq_affinity (irqinfo )
276
+ return self ._restore_irq_affinity (irqinfo , transfer )
0 commit comments