From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <51DD4760.6050908@xenomai.org> Date: Wed, 10 Jul 2013 13:37:04 +0200 From: Gilles Chanteperdrix MIME-Version: 1.0 References: <51DBF6B8.1000000@mitrol.it> In-Reply-To: <51DBF6B8.1000000@mitrol.it> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Xenomai] Make a block of code atomic List-Id: Discussions about the Xenomai project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Minazzi Cc: xenomai@xenomai.org 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.