Am 06.03.2013 um 16:30 schrieb Gleb Natapov <g...@redhat.com>:
> 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? User space can't access the MPIC :). So it has to do SET_INTERRUPT on vcpus like it does when it doesn't set the irq arch. Alex > > -- > 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