On Sun, Feb 16, 2014 at 06:23:11PM +0200, Michael S. Tsirkin wrote:
> Well there is a bigger issue: any interrupt with
> multiple sources is broken.
>
> __kvm_irq_line_state does a logical OR of all sources,
> before XOR with polarity.
>
> This makes no sense if polarity is active low.
So, do you think something like this would make sense, to address
active-low polarity in __kvm_irq_line_state ?
(this would be independent of the subsequent xor in
kvm_ioapic_set_irq()):
-static inline int __kvm_irq_line_state(unsigned long *irq_state,
+static inline int __kvm_irq_line_state(unsigned long *irq_state, int polarity,
int irq_source_id, int level)
{
- /* Logical OR for level trig interrupt */
if (level)
__set_bit(irq_source_id, irq_state);
else
__clear_bit(irq_source_id, irq_state);
- return !!(*irq_state);
+ if (polarity) {
+ /* Logical OR for level trig interrupt, active-high */
+ return !!(*irq_state);
+ } else { // active-low
+ /* Logical AND for level trig interrupt, active-low */
+ return !~(*irq_state);
+ }
}
Thanks,
--Gabriel
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html