Re: Coupling between KVM_IRQFD and KVM_SET_GSI_ROUTING?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 06/24/2014 05:47 PM, Alexander Graf wrote:
> 
> On 24.06.14 17:05, Eric Auger wrote:
>> On 06/24/2014 12:40 PM, Alexander Graf wrote:
>>> On 24.06.14 11:47, Paul Mackerras wrote:
>>>> On Mon, Jun 23, 2014 at 06:47:51PM +0200, Alexander Graf wrote:
>>>>> On 17.06.14 13:39, Eric Auger wrote:
>>
>>>>>> Hello,
>>>>>>
>>>>>> I have a question related to KVM_IRQFD and KVM_SET_GSI_ROUTING ioctl
>>>>>> relationship.
>>>>>>
>>>>>> When reading the KVM API documentation I do not understand there
>>>>>> is any
>>>>>> dependency between KVM_IRQFD and KVM_SET_GSI_ROUTING. According to
>>>>>> the
>>>>>> text it seems only the gsi field is used and interpreted as the
>>>>>> irqchip pin.
>>>>>>
>>>>>> However irqchip.c kvm_set_irq code relies on an existing and not
>>>>>> dummy
>>>>>> routing table.
>>>>>>
>>>>>> My question is: does anyone agree on the fact the user-side must
>>>>>> set a
>>>>>> consistent routing table using KVM_SET_GSI_ROUTING before using
>>>>>> KVM_IRQFD? The other alternative would have been to build a default
>>>>>> identity GSI routing table in the kernel (gsi = irqchip.pin).
>>>>> I untangled irqfd support from the x86 ioapic emulation a while back.
>>>>> When I
>>>>> looked at it, I didn't see any easy way to split it out from the
>>>>> routing
>>>>> too, so I kept that dependency in.
>> Hi Alex, Paul,
>>
>> thanks for your replies. hence don't you think the KVM API doc deserves
>> to be clarified then?
>>>>> If you look at the code, you will see that the irq routing entry is
>>>>> used as
>>>>> token for an irqfd. So every irqfd only knows its routing table entry,
>>>>> nothing else.
>>>> As far as I can see, the routing table entry is used for only two
>>>> things: to tell whether the interrupt is an MSI or LSI, and to pass to
>>>> kvm_set_msi.
>>
>> Indeed I noticed irq_entry in _irqfd struct only is set for MSI routing.
>> For other IRQS - I guess what you call LSI - , routine table map[] is
>> used to retrieve the irchip.pin(s) associated to that gsi and call set().
>>>> One way to tackle the problem would be to abstract out the routing
>>>> table lookup into a function in irqchip.c, rather than having it
>>>> open-coded in irqfd_update.  Then, if you don't want to have the
>>>> routing table you write an alternative function that creates a
>>>> routing entry from scratch.  It would need information from the
>>>> low-level irq chip code as to which interrupts are LSIs and which are
>>>> MSIs.  It also ties you down to having only one kind of interrupt
>> controller.
>>> You could also create it along with the irqfd state struct. So
>>> instead of
>>>
>>>    kzalloc(sizeof(*irqfd), GFP_KERNEL);
>>>
>>> we could do
>>>
>>>    kzalloc(sizeof(*irqfd) + sizeof(struct kvm_kernel_irq_routing_entry),
>>> GFP_KERNEL);
>>
>> Wouldn't it make sense, in kvm_irqfd_assign, to test whether there is a
>> routing entry associated to that gsi. In the negative, create a default
>> one where irqchip.pin = gsi or something architecture specific?.
> 
> "no entry" really should be "no entry". I think if we want some other
> mechanism, we should make it be explicit.
Yep I agree. But currently the usage of routing mechanism is not
explicit neither in 4.75 KVM_IRQFD and that was causing my doubts;-)
On top of that the doc says:
"kvm_irqfd.gsi specifies the irqchip pin toggled by this event" but if
there is no routing table set before by user-side, the injection will fail.
> 
>>
>> That way would not need a complete & big routing table to be set by
>> user-side?
>>
>>> and point the routing entry to the inline irqfd one. We'd lose the
>>> ability to change any routings with that construct, but I think that's
>>> ok for irq controllers that are not configurable.
>>>
>>> Alternatively, we could also have a single routing entry that is a
>>> wildcard match, ranging from say LSI [x...y]. The irqfd structure would
>>> then need to carry a local payload to define an offset inside that
>>> wildcard routing entry.
>> Also whatever the number of IRQs assigned, we have this big
>> chip[KVM_NR_IRQCHIPS][KVM_IRQCHIP_NUM_PINS] allocated. Also on ARM we
>> have some difficulties to define KVM_IRQCHIP_NUM_PINS which becomes
>> quite dynamic.
> 
> Right, if you go with the ranged routing entries you should be able to
> get by with a very small number of NUM_PINS, no?
Yes that's correct. but the effort to integrate such feature in the code
need to be further assessed.
Eric
> 
> 
> Alex
> 
> -- 
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

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




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux