All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lowell Gilbert <kludge@be-well.ilk.org>
To: xenomai@xenomai.org
Subject: Re: [Xenomai] interrupt service
Date: Thu, 26 Feb 2015 16:58:06 -0500	[thread overview]
Message-ID: <441tlce3o1.fsf@lowell-desk.lan> (raw)
In-Reply-To: <20150226201100.GB434@hermes.click-hack.org> (Gilles Chanteperdrix's message of "Thu, 26 Feb 2015 21:11:00 +0100")

Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org> writes:

> On Thu, Feb 26, 2015 at 02:25:13PM -0500, Lowell Gilbert wrote:
>> Philippe Gerum <rpm@xenomai.org> writes:
>> 
>> > On 02/26/2015 05:38 PM, Lowell Gilbert wrote:
>> > The new task will be pinned to the CPU running rtdm_task_init() by
>> > default, which is likely CPU0 as well.
>> >
>> > To check this, I would set the global Xenomai affinity to CPU1 before
>> > starting the test, so that your driver task ends up there.
>> >
>> > # echo 2 > /proc/xenomai/affinity
>> 
>> Yes, I initialize that already. And give "isolcpus=1" to the kernel so
>> that Linux will not schedule anything else on CPU1.
>> 
>> > At least you would have the timing IRQ and the task on a different CPU,
>> > leaving some cycles to the latter. This said, 10 us between timer shots
>> > is really too fast.
>> 
>> Having enough cycles for this isn't my fundamental problem. Running
>> everything in the ISR has no trouble keeping up with the 100kHz data
>> flow. The problem comes in a *non* real-time task, which is pulling data
>> in from an IP socket and pushing it into a queue for the real-time code
>> to use synchronously.
>> 
>> If I could run bare-metal on the second CPU, I would have done so.
>> The real-time behaviour is easily characterized, and the periodic work
>> can safely be done in 10 us even if all of the data has to be fetched
>> from external memory.
>
> Consuming all the time for running ISRs is not normal for OSes like
> Linux and Xenomai. Being able to run the ISR in less than 10us does
> not mean that there is some time left for the rest of the system;
> there is quite some code executed around the ISR, and at this
> frequency it stops being negligible. Linux at least needs to run
> from time to time for time keeping. If you want to execute something
> with this frequency, maybe you could consider using an FIQ. FIQs
> have a lower overhead.

Sure. In a static test, with the ISR being the only thing assigned to
the isolated CPU, an idle task does get run time.

An FIQ doesn't really make sense if, as I suggest, my problem is that
the system is spending too much time with interrupts disabled.

> So, to be clear, does the ISR run on CPU0 and the thread doing the
> reads run on CPU1? If no, does it work if you do it that way? To

The other way around, but that's pretty much what I have set up. CPU0
handles work that doesn't need to be real-time, and CPU1 handles only
the real-time work.  In particular, CPU0 reads a stream of incoming data
from a TCP socket, processes it slightly, and writes it into kernel
memory.

If I preload several seconds worth of data before enabling the
interrupt, the ISR is able to keep up with the workload while a busy-
loop task gets roughly 15-20% of the cycles (on CPU1). On the other
hand, if I delay starting the ISR, my (non-real-time, or at least not
necessarily real time) network task (on CPU0) can load data -- at a
speed several times that which the data will be consumed at. But once I
release the ISR, the network task can't keep up, and the ISR eventually
runs dry.

> know whether the problem comes from the interrupt consuming all the
> available time, simply create a periodic task, in addition to the
> ISR, with a high priority, and see if it executes from time to time
> to increment a counter. If it does not execute, then we have a proof
> that the ISR is not letting anything else run.

I did this with a low-priority task, and with nothing but it, the ISR,
and Linux housekeeping running on CPU1, it did get some time.

> Another problem may be in handling the /proc/xenomai/affinity, so
> could you try without using it? Same for isolcpus.

I can certainly try that, but what should I be looking for? 

> could you try without using it? Same for isolcpus. If the ISR runs
> on cpu0 and the tasks run on cpu1, an IPI should be sent in
> __xnpod_schedule to wake up the task blocked in read, you can check
> whether the IPI is sent by using ipipe_trace_special for instance
> and checking the tracer trace.

Ah, thank you. That may be very helpful.

Be well.


  reply	other threads:[~2015-02-26 21:58 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-18 22:03 [Xenomai] interrupt service Lowell Gilbert
2015-02-18 22:08 ` Gilles Chanteperdrix
2015-02-19  4:44   ` Lowell Gilbert
2015-02-19 21:06     ` Lowell Gilbert
2015-02-20 19:38     ` Lowell Gilbert
2015-02-20 22:57       ` Gilles Chanteperdrix
2015-02-24 23:01         ` Lowell Gilbert
2015-02-24 23:34           ` Gilles Chanteperdrix
2015-02-25 16:22             ` Lowell Gilbert
2015-02-25 17:34               ` Philippe Gerum
2015-02-25 18:35                 ` Philippe Gerum
2015-02-25 20:41                 ` Lowell Gilbert
2015-02-25 21:02                   ` Lowell Gilbert
2015-02-26 11:19                     ` Philippe Gerum
2015-02-26 16:38                       ` Lowell Gilbert
2015-02-26 17:26                         ` Gilles Chanteperdrix
2015-02-26 17:56                         ` Philippe Gerum
2015-02-26 19:25                           ` Lowell Gilbert
2015-02-26 20:11                             ` Gilles Chanteperdrix
2015-02-26 21:58                               ` Lowell Gilbert [this message]
2015-02-26 22:37                                 ` Gilles Chanteperdrix
2015-02-26 23:12                                   ` Lowell Gilbert
2015-02-26 23:09                               ` Philippe Gerum
2015-03-06 22:57                               ` Lowell Gilbert
2015-03-06 22:58                               ` Lowell Gilbert
2015-03-08 15:52                                 ` Gilles Chanteperdrix
2015-03-09 13:28                                   ` Lowell Gilbert
2015-02-26 20:24                             ` Philippe Gerum
2015-02-26 22:55                               ` Lowell Gilbert
2015-02-26 23:17                                 ` Daniele Nicolodi
2015-02-26 23:21                                 ` Philippe Gerum
2015-02-27  7:15                                 ` Tom Evans
2015-02-25  8:30           ` Philippe Gerum
2015-02-25  9:36             ` Philippe Gerum

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=441tlce3o1.fsf@lowell-desk.lan \
    --to=kludge@be-well.ilk.org \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.