|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 05/17] xen/arm: ITS: implement hw_irq_controller for LPIs
On Wed, 2015-07-15 at 22:31 +0530, Vijay Kilari wrote:
> Sorry. I may not be clear.
>
> In Linux when MSIx is enabled.
> Device is created first and its_device->its_collection is set for
> first onine cpu
> and mapvi is called with collection set in its_create_device() as below.
[...]
> When affinity is set, movi is sent with collection id selected
> for the cpu_mask.
OK, so at start of day all events for a given device end up mapped to a
single processor, but as individual interrupts are rebalanced they will
then become spread out among different CPUs, that makes sense.
I'm not sure I follow the scheme which Linux is using to achieve that
behaviour though, so I've CC'd Marc.
It seems to me from looking at the Linux code that its_dev->collection
doesn't, as one might expect, contain the collection associated with the
device (and therefore all Events of that device), but rather it contains
the collection corresponding to a single Event which is the one which
most recently had its affinity changed, i.e. the one with an potentially
outstanding INV.
So its_send_movi sends the MOVI command which ends up calling INV on
that collection, which at this point is the _old_ collection. Then it
stores the new collection for that Event in its_dev->collection.
What I don't follow is how set_lpi_config copes with this, since it
always sends the INV for an Event to the corresponding its_dev's
collection, but after a bunch of Events/IRQs have been rebalanced there
doesn't seem to be any guarantee that this would corresponding to the
current collection associated with the interrupt which has been
reconfigured.
Marc, have I misunderstood what the Linux ITS driver is trying to
achieve or how it goes about it?
Perhaps lpi_set_config (and by extension its_(un)mask_irq) is only
called at start of day?
I'm not sure if Xen is going to (want to) follow the way Linux arranges
this stuff, but I would very much like to at least understand it, since
it may have implications...
Cheers,
Ian
>
> struct its_device *its_create_device(struct its_node *its, u32 dev_id,
> int nvecs)
> {
> ....
> /* Bind the device to the first possible CPU */
> cpu = cpumask_first(cpu_online_mask);
> dev->collection = &its->collections[cpu];
> ....
> }
>
> int its_alloc_device_irq(struct its_device *dev, u32 id,
> int *hwirq, unsigned int *irq)
> {
> ...
> /* Map the GIC irq ID to the device */
> its_send_mapvi(dev, *hwirq, id);
> ...
> }
>
> When affinity is set, movi is sent with collection id selected
> for the cpu_mask.
>
> static int its_set_affinity(struct irq_data *d, const struct cpumask
> *mask_val,
> bool force)
> {
> unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask);
> ...
> target_col = &its_dev->its->collections[cpu];
> ....
> its_send_movi(its_dev, target_col, id);
> its_dev->collection = target_col;
> ...
> }
>
> So, collection id to Event/LPI mapping is not stored.
>
> Regards
> Vijay
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |