On Wed, Mar 06, 2013 at 03:48:54PM +0100, Alexander Graf wrote:
> 
> On 06.03.2013, at 15:41, Gleb Natapov wrote:
> 
> > On Wed, Mar 06, 2013 at 03:03:53PM +0100, Alexander Graf wrote:
> >> 
> >> On 06.03.2013, at 14:56, Gleb Natapov wrote:
> >> 
> >>> On Wed, Mar 06, 2013 at 02:22:15PM +0100, Alexander Graf wrote:
> >>>> 
> >>>> On 06.03.2013, at 14:14, Gleb Natapov wrote:
> >>>> 
> >>>>> On Wed, Mar 06, 2013 at 01:20:39PM +0100, Alexander Graf wrote:
> >>>>>>> The problem would only start if KVM_SET_IRQCHIP_TYPE (new name of
> >>>>>>> KVM_CREATE_IRQCHIP_ARGS) forced you to later call KVM_CREATE_DEVICE.
> >>>>>> 
> >>>>>> Ah, I see. I don't see why it would. The fact that there is a "LAPIC" 
> >>>>>> doesn't mean that the per-vcpu SET_INTERRUPT ioctl stops working. So 
> >>>>>> if SET_IRQCHIP_TYPE(!none) breaks user-space interrupt controller 
> >>>>>> emulation I would consider that a bug.
> >>>>>> 
> >>>>> For x86 this is the case though. I do not see how it can't be. If
> >>>>> LAPIC is emulated in userspace SET_INTERRUPT is used to pass IRQ
> >>>>> vector that should be handled as a result of LAPIC emulation.
> >>>> 
> >>>> So SET_INTERRUPT on a vcpu triggers a line on the LAPIC emulation in 
> >>>> that vcpu? For us it directly controls the CPU interrupt pin.
> >>>> 
> >>> No SET_INTERRUPT on a vcpu tells vcpu to which vector in IDT it needs to
> >>> jump immediately. LAPIC is really part of a cpu and we cut it and put into
> >>> userspace, so interface between userspace LAPIC emulation is really low
> >>> level and has to be synchronous. X86 has two interrupt lines NMI and INTR
> >>> and we do not have interface to trigger the later.  KVM_IRQ_LINE works on
> >>> GSI lines which do not go into CPU directly. They go either via PIC (which
> >>> triggers INTR or APIC LINT0) or via IOAPIC which on real HW communicates
> >>> with APICs via bus, but in our emulation just calls APICs directly.
> >> 
> >> Great :). It's similar for us. SET_INTERRUPT directly asserts the INTR 
> >> line of the vcpu. There is nothing like an IDT on PPC, so external 
> >> interrupts simply arrive at a specific vector. That vector can differ for 
> >> critical or NMI interrupts IIRC, but I'm not sure we implement that right 
> >> now. If so, it'd be a different line for SET_INTERRUPT.
> >> 
> >> So in a way, it's the same. And SET_INTERRUPT should work regardless of 
> >> whether a LAPIC is used or not really. At least it would for us :).
> >> 
> > Is it possible for some devices to inject interrupt directly and other
> > to go through interrupt controller?
> 
> It would be racy if both assert + deassert the same line, but I don't see why 
> we should keep anyone from doing it. If user space wants to run such a 
> configuration, it needs to ensure that only one of the 2 is actively used at 
> any given time.
> 
> >> KVM_IRQ_LINE is basically an IOAPIC interrupt line assert. That's fine. 
> >> That ioctl should get an ioapic device handle to work on. Whether we call 
> >> the IOAPIC PINs GSIs or something different is really just a naming 
> >> question. I'd probably call it IRQ number :).
> > Yes and no. On sane archs we can call it IRQ number (lucky you!), but on
> > X86 there is a GSI that can be IRQ2 if it goes through IOAPIC and IRQ0
> > if it goes through PIC, so additional entity was invented: irq routing.
> > It maps between GSI and irqchips pin. Same GSI may go to more than one
> > irqchip. This is why for x86 having irqchip device handle as a parameter
> > to KVM_IRQ_LINE does not make sense. It make sense to provide it to irq
> > router and this is how it work now except that "device handlers" are
> > hard coded.
> 
> Then you would create a new "irq router" device that does the multiplexing 
> and can also receive IRQs. You could then directly assert an IOAPIC/PIC line 
> or a multiplexer line. Or am I misunderstanding something?
> 
The usefulness of such flexibility is questionable, but you are right, it can 
be implemented this way.

> > 
> >> But it's the same idea. The "IOAPIC" would then talk to to in-kernel 
> >> "LAPIC" style bits (or in case of the MPIC just integrate them inside of 
> >> itself). That's why by the time we create an "IOAPIC", the "LAPIC"s in the 
> >> system have to be populated.
> > The restriction that LAPIC has to be created before IOAPIC would be a
> > bug that need to be fixed on X86. The reason is cpu hotplug. If you have
> > to support cpu hotplug you have to be able to create LAPICs after IOAPIC
> > and at this point you can create IOAPIC before any LAPICs as well. I
> > understand this may not be the case for all architectures right now, but
> > something to keep in mind.
> 
> Paul, Scott, do you think we can move the "this CPU can receive interrupts 
> from MPIC / XICS" part into an ENABLE_CAP that gets set dynamically? That 
> ENABLE_CAP would allocate the structures in the vcpu and register the vcpu 
> with the interrupt controller pool.
> 
> The interrupt controller device would still iterate through all vcpus to find 
> the ones that match so that we support the ENABLE_CAP at any point in time.
> 
> > 
> >> 
> >> So again, I'm failing to see where we think differently :).
> >> 
> > The difference is very minor really. I still try to justify to myself
> > why we need separate ioctl() to announce what irqchip we are going to
> > create before creating one (except save QEMU some troubles). The question
> > is: is this ioctl can be useful by itself? Seems like unlikely scenario
> > that we will allow IOAPIC/PIC emulation in uesrspace while LAPIC is in
> > kernel may be such case. QEMU will call it before creating vcpus to
> > tell KVM that LAPICs need to be created along with VCPUs, but no
> > irqchip will be created.
> 
> I don't have a real answer for you yet, but so far the general design mantra 
> of "small, individual pieces that plug together" worked out way better for us 
> than the "have one call that does it all" one. Being explicit simply makes 
> sure that we support more scenarios we don't think of today.
> 
Suppose we are going with the IRQ_CHIP_ARCH ioctl. What happens if
userspace calls ioctl(IRQ_CHIP_ARCH, MPIC) and tries to call KVM_RUN
before creating MPIC device?

--
                        Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to