[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.19 4/9] x86/irq: describe how the interrupt CPU movement works
On Wed, May 29, 2024 at 03:57:19PM +0200, Jan Beulich wrote: > On 29.05.2024 11:01, Roger Pau Monne wrote: > > --- a/xen/arch/x86/include/asm/irq.h > > +++ b/xen/arch/x86/include/asm/irq.h > > @@ -28,6 +28,32 @@ typedef struct { > > > > struct irq_desc; > > > > +/* > > + * Xen logic for moving interrupts around CPUs allows manipulating > > interrupts > > + * that target remote CPUs. The logic to move an interrupt from CPU(s) is > > as > > + * follows: > > + * > > + * 1. cpu_mask and vector is copied to old_cpu_mask and old_vector. > > + * 2. New cpu_mask and vector are set, vector is setup at the new > > destination. > > + * 3. move_in_progress is set. > > + * 4. Interrupt source is updated to target new CPU and vector. > > + * 5. Interrupts arriving at old_cpu_mask are processed normally. > > + * 6. When an interrupt is delivered at the new destination (cpu_mask) as > > part > > + * of acking the interrupt move_in_progress is cleared and > > move_cleanup_count > > Nit: A comma after "interrupt" may help reading. > > > + * is set to the weight of online CPUs in old_cpu_mask. > > + * IRQ_MOVE_CLEANUP_VECTOR is sent to all CPUs in old_cpu_mask. > > These last two steps aren't precise enough, compared to what the code does. > old_cpu_mask is first reduced to online CPUs therein. If the result is non- > empty, what you describe is done. If, however, the result is empty, the > vector is released right away (this code may be there just in case, but I > think it shouldn't be omitted here). I've left that out because I got the impression it made the text more complex to follow (with the extra branch) for no real benefit, but I'm happy to attempt to add it. > > > + * 7. When receiving IRQ_MOVE_CLEANUP_VECTOR CPUs in old_cpu_mask clean the > > + * vector entry and decrease the count in move_cleanup_count. The CPU > > that > > + * sets move_cleanup_count to 0 releases the vector. > > + * > > + * Note that when interrupt movement (either move_in_progress or > > + * move_cleanup_count set) is in progress it's not possible to move the > > + * interrupt to yet a different CPU. > > + * > > + * By keeping the vector in the old CPU(s) configured until the interrupt > > is > > + * acked on the new destination Xen allows draining any pending interrupts > > at > > + * the old destinations. > > + */ > > struct arch_irq_desc { > > s16 vector; /* vector itself is only 8 bits, */ > > s16 old_vector; /* but we use -1 for unassigned */ > > I take it that it is not a goal to (also) describe under what conditions > an IRQ move may actually be initiated (IRQ_MOVE_PENDING)? I ask not the > least because the 2nd from last paragraph lightly touches that area. Right, I was mostly focused on moves (forcefully) initiated from fixup_irqs(), which is different from the opportunistic affinity changes signaled by IRQ_MOVE_PENDING. Not sure whether I want to mention this ahead of the list in a paragraph, or just add it as a step. Do you have any preference? Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |