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

Re: [Xen-devel] translate pirq to irq



hi Andrew,

On Jan 13, 2014, at 1:10 AM, Andrew Cooper wrote:

> On 12/01/2014 21:01, Igor Kozhukhov wrote:
>> On Jan 13, 2014, at 12:34 AM, Andrew Cooper wrote:
>> 
>>> On 12/01/2014 19:26, Igor Kozhukhov wrote:
>>>> Hi Andrew,
>>>> 
>>>> On Jan 12, 2014, at 10:29 PM, Andrew Cooper wrote:
>>>> 
>>>>> On 11/01/2014 22:59, Igor Kozhukhov wrote:
>>>>>> Hello All,
>>>>>> 
>>>>>> I see a comment in physdev.h for 'struct physdev_map_pirq', var 'pirq':
>>>>>> /* IN - high 16 bits hold segment for MAP_PIRQ_TYPE_MSI_SEG */
>>>>>> 
>>>>>> i have received 'pirq' from hypervisor > 255.
>>>>>> 
>>>>>> map_irq.domid = DOMID_SELF;                                              
>>>>>>      
>>>>>> map_irq.type = MAP_PIRQ_TYPE_MSI;                                        
>>>>>>      
>>>>>> map_irq.index = -1; /* hypervisor auto allocates vector */               
>>>>>>      
>>>>>> map_irq.pirq = -1;                                                       
>>>>>>      
>>>>>> map_irq.bus = busnum;                                                    
>>>>>>      
>>>>>> map_irq.devfn = devfn;                                                   
>>>>>>      
>>>>>> map_irq.entry_nr = i;                                                    
>>>>>>      
>>>>>> map_irq.table_base = 0;                                              
>>>>>> rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq);                
>>>>>>      
>>>>>> irqno = map_irq.pirq;
>>>>>> 
>>>>>> i have:
>>>>>> irqno = 279 - it is more APIC_MAX_VECTOR(255)
>>>>>> 
>>>>>> i have a question: how to correct translate pirq to irq for APIC map 
>>>>>> table ?
>>>>>> 
>>>>>> all work well on xen-3.4, but it has another realization in function 
>>>>>> physdev_map_pirq() then for xen-4.2.
>>>>> Is this for a PV or HVM guest?  I suspect PV, in which case the irqno
>>>>> handed back will be the event channel on which the notification will
>>>>> arrive, and has nothing to do with regular IDT vectors.
>>>> it is for dom0.
>>>> 
>>>> full boot log with xen debug info and DDI_DEBUG on illumos you can find 
>>>> here :
>>>> http://apt2.dilos.org/dilos/logs/putty.log.dom0.txt
>>>> 
>>>> 
>>>> if it is possible - could you please let me know how to work MSI irq 
>>>> translation to APIC irq table for xen-4.2 ?
>>>> 
>>>> i see - in xen code we have a range from 16 to 784 for 4 CPU for MSI IRQ 
>>>> (irq_create() function)
>>>> but - how to correct translate it to APIC IRQ (physical irq)?
>>> Why do you need to know?
>>> 
>>> Xen controls all interrupts on the system.  Event channels which you
>>> register with Xen have no mapping/relation to local apic vectors.  Your
>>> device drivers should not expect to have an apic vector in their hand.
>>> 
>>> The reason behind this is that as virtual cpus get scheduled around
>>> physical cpus, Xen needs to move the interrupts from IDT to IDT at which
>>> point their vector will change.
>> is it possible to receive IRQ from APIC table from Xen as index ?
> 
> No.
> 
>> i need it for local APIC pointer to APIC table array as index.
>> all others functions is using index from apic_irq_table[] as APIC IRQ.
>> 
>> i have function apic_find_irq() for this. 
>> it is not my realization - it is original code.
> 
> Nothing in a dom0 system should know/care about apic vectors.  Dom0
> cannot use the IDT, nor can it even write to MSI/MSI-X configuration
> registers (they get trapped and fixed-up by Xen).
> 
> Even if there were a hypercall to map an event channel back to an
> apic-id/vector, it is possible that the data would be stale by the time
> the vcpu ran again.

thanks for your details. I have found and fixed a problem.
now i have finished illumos side and have to fork with xen-4.2 sources.

it was interest problem.
details:
i have array:
#define APIC_MAX_VECTOR 255
uchar_t msi_vector_to_pirq[APIC_MAX_VECTOR+1]

i have received map_irq.pirq = 279(0x117) 
it is more then 255(0xff)

i have operation:
msi_vector_to_pirq[vector] = (uchar_t)pirq;

by this operation i have msi_vector_to_pirq[vector] = 0x17;
:)

it was a mistake, because i tried to use APIC IRQs from reserved space with 
additional PIRQs.
i have replaced it by: get free APIC IRQ from range 0x10 - 0xff and update info 
about IRQ with additional field for PIRQ for mapping by event.

now i have correct APIC IRQs with sync it for PIRQ map.

> ~Andrew

-Igor


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.