On 07/09/2013 01:40 PM, Paolo Minazzi wrote:

Hi,

I would like to make a block of kernel code atomic, so that no one (both
xenomai and Linux) can interrupt it.
I use the following :

#define my_local_irq_save(x)    ((x) =
ipipe_test_and_stall_pipeline_head()&  1)
#define my_local_irq_restore(x) ipipe_restore_pipeline_head(x)

my_local_irq_save(flags);
<  critical section>
my_local_irq_restore(flags);

It works well enough, but rarely an rtdm irq enter into my critical
section.
The rtdm irq is registered in this way : rtdm_irq_request(&priv->irqHnd,
ETH_PORT_IRQ_NUM(priv->port), irqHandler, RTDM_IRQTYPE_EDGE, "rtdm_eth",
priv);

Is it normal ? Are you sure that it cannot happen ?


Looking at ipipe_test_and_stall_head implementation on the I-pipe patch for Linux 3.8:

static inline unsigned long ipipe_test_and_stall_head(void)
{
        hard_local_irq_disable();
        return __test_and_set_bit(IPIPE_STALL_FLAG, &__ipipe_head_status);
}

getting an interrupt in your critical section would mean that "hard_local_irq_disable" is broken on the architecture where you use it.

That being said, I do not know if I look at the implementation you are using, since you did not give us any information about version and architecture you are using.

--
                                                                Gilles.

_______________________________________________
Xenomai mailing list
[email protected]
http://www.xenomai.org/mailman/listinfo/xenomai

Reply via email to