Dmitry Adamushko wrote:
> On Monday 31 October 2005 16:04, you wrote:
>>Dmitry Adamushko wrote:
>>>It seems to me now, that some parts of the hal will be involved
>>>(rthal_irq_request/release()) since the nucleus itself doesn't keep track
>>>of registered irqs.
>>That's true. And it also raises another question to me: why do we have
>>those two different IRQ models?
>>The HAL only one handler per IRQ which get called with the triggering
>>IRQ number. That handler will call the nucleus with an attached cookie.
>>And on the other side is the nucleus which works with a xnintr_t per
>>IRQ. The xnintr_irq_handler() deals with things like re-enabling IRQs,
>>rescheduling, etc.
>>I'm asking as this abstraction adds one trampoline call (at HAL level),
>>thus may lead to more I-cache misses. Isn't it worth considering some
>>HAL mechanisms based on more #defines and static inlines in this regard?
> Let's take a look at what we have got currently:
> [1]   ipipe_domain::irqs[IPIPE_NR_IRQS]       [ADEOS-IPIPE]
> the handler is defined as void (*handler)(unsigned irq);
> in our case, this is rthal_irq_trampoline() [2] , but can be different for 
> some other cases;
> [2]   rthal_irq_trampoline()                          [HAL]
> struct rthal_realtime_irq[IPIPE_NR_IRQS]
> the handler is defined as void (*handler)(unsigned irq, void *cookie);
> this one normally does a simple thing, just calls xnintr_irq_handler() [3] as 
> you have mentioned before.
> [3]   xnintr_irq_handler()                            [nucleus]
> this routine calls a certain user's ISR as well as handles some 
> nucleus-specific chores (re-scheduling, etc.)
> [4]   user's ISR                                              [user driver]
> does user-specific things
> Well, [3] is necessary anyway since some nucleus-related chores must be done 
> and this is a correct layer for that (e.g. [2] knows nothing about 
> scheduling).
> What can be theoretically merged is [1] + [2] (errr... I said theoretically, 
> it's still not the case to kill me for just having said that :o). To this 
> end, ipipe_domain should be extended in order to contain all the fields of 
> [2]::struct rthal_realtime_irq (at least, handler(irq, cookie) + cookie).
> btw, ipipe_domain::irqs may even contain a pointer to the slightly modified 
> xnintr_t structure (which is really e.g. a circular list) that may be passed 
> as "cockie" to the xnintr_irq_handler().
> The analogy is irq_desc_t vs. irqaction structures in Linux.
> This way, xnintr_irq_handler() can be called from adeos-ipipe layer directly 
> without the [2] layer.
> But that change looks quite invasive to me so far since 
> ipipe_domain::irqs::handler(irq - with a single parameter) is used all over 
> the map.
> In our case, the relation between xnintr_irq_handler() and 
> rthal_irq_trampoline() is 1:1. The first one does much more things that the 
> second one which is really almost a pure redirection layer.
> Hopefully, xnintr_irq_handler() is i-cache-hot as long as possible under high 
> irq load. In this case, I guess, rthal_irq_trampoline() will be in cache as 
> well (since it's really small) and the overhead is only about having one 
> array indexing op. and issuing a call via a pointer to the function 
> (xnintr_irq_handler() in our case).
> Do you think that really gives a significant overhead? Well, maybe so. I'm 
> not 
> a profie here anyway...

...compared to the usefulness I still have to understand - yes.

Other option: what about merging [2] into [3], i.e. let
xnintr_irq_handler deal with the translation IRQ number -> cookie?

Philippe, I guess your wisdom is required here. Are we missing some
important point in your design right now?


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to