Re: [LAD] JACK and vanilla 3.19.2 startup issue

From: Tito Latini <tito.01beta@email-addr-hidden>
Date: Sun Jun 07 2015 - 00:08:38 EEST

On Sat, Jun 06, 2015 at 03:35:16PM +0100, Harry van Haaren wrote:
> On Sat, Apr 4, 2015 at 8:13 PM, Adrian Knoth <adi@email-addr-hidden>
> wrote:
>
> > Not enough information. I recommend starting jackd with strace
> >
> Done - apologies for the delay. Strace output available[1], but the most
> interesting part copied here:
>
> sched_get_priority_min(SCHED_FIFO) = 1
> sched_setscheduler(0, SCHED_FIFO, { 1 }) = -1 EPERM (Operation not
> permitted)
> write(2, "\nJACK is running in realtime mod"..., 87
> JACK is running in realtime mode, but you are not allowed to use realtime
> scheduling.
> ) = 87
>
>
>
> > This code tries to call sched_setscheduler() with SCHED_FIFO. My bet is
> > that your "almost vanilla kernel" fails to fulfil this request, but
> > strace will tell you for sure.
> >
> By "almost vanilla" I meant the Arch linux packaged version - I didn't
> change the config myself (and Arch aims to be true to vanilla). A very
> accurace prediction though - indeed sched_setscheduler() is causing a
> return of -1. This is running as root though - so something is wrong here.
>
>
> > The question is why said call should fail. The only thing that comes to
> > my mind are CGROUPS. Maybe your old kernel comes without, the new kernel
> > supports them and the configuration is set in a way that disables
> > SCHED_FIFO by default.
> >
> Perhaps - I'm not experienced with cgroups or such, if anybody has any test
> ideas for me I'll try them out?

No tested but perhaps the follow lines in __sched_setscheduler
(linux-3.19.8/kernel/sched/core.c) are relevant:

#ifdef CONFIG_RT_GROUP_SCHED
                /*
                 * Do not allow realtime tasks into groups that have no runtime
                 * assigned.
                 */
                if (rt_bandwidth_enabled() && rt_policy(policy) &&
                                task_group(p)->rt_bandwidth.rt_runtime == 0 &&
                                !task_group_is_autogroup(task_group(p))) {
                        task_rq_unlock(rq, p, &flags);
                        return -EPERM;
                }
#endif
#ifdef CONFIG_SMP
                if (dl_bandwidth_enabled() && dl_policy(policy)) {
                        cpumask_t *span = rq->rd->span;

                        /*
                         * Don't allow tasks with an affinity mask smaller than
                         * the entire root_domain to become SCHED_DEADLINE. We
                         * will also fail if there's no bandwidth available.
                         */
                        if (!cpumask_subset(span, &p->cpus_allowed) ||
                            rq->rd->dl_bw.bw == 0) {
                                task_rq_unlock(rq, p, &flags);
                                return -EPERM;
                        }
                }
#endif

However I'm using 3.10 compiled without CONFIG_RT_GROUP_SCHED and the
second `#ifdef' (CONFIG_SMP) is not present in the source code.

Hypothesis: the second condition fails

  => disable the bandwidth management logic (the default is 950000):

     echo -1 > /proc/sys/kernel/sched_rt_runtime_us

     More info about sched_rt_runtime_us:

       scheduler/sched-rt-group.txt: "2.1 System wide settings"
       scheduler/sched-deadline.txt: "4.1 System wide settings"

If it continues to fail and your kernel is compiled with
CONFIG_RT_GROUP_SCHED, you could recompile it without this
configuration option (if you don't use realtime group scheduling).

Oh, if it continues to fail, see the other branches with `return -EPERM'
in __sched_setscheduler.
_______________________________________________
Linux-audio-dev mailing list
Linux-audio-dev@email-addr-hidden
http://lists.linuxaudio.org/listinfo/linux-audio-dev
Received on Sun Jun 7 00:15:02 2015

This archive was generated by hypermail 2.1.8 : Sun Jun 07 2015 - 00:15:02 EEST