DEADLINE schedule policy not found

I want to implement the DEADLINE scheduling policy in C. I know that the function is implemented with Linux 3.14.10 , and I use Ubuntu 14.04 Linux #### 3.17.0-031700-lowlatency #201410060605 SMP PREEMPT , which should be fairly recent. I am developing a program using Eclipse (runs as sudo).

I defined _GNU_SOURCE and included sched.h and I still cannot use the SCHED_DEADLINE keyword to define struct sched_attr or use a function like sched_getattr .

 #define _GNU_SOURCE #include <sched.h> 

None of these keywords and functions are defined in my /usr/include/ folder, but I managed to find them in /usr/src/linux-headers-3.17.0-031700/include/ . I tried to include this folder in my project build options, but it seems to be creating a communication error.

I am not very used to C developpment (I am originally the creator of JS), so if someone can explain to me what I am doing wrong and how to fix it, it will be very nice.

Contents /usr/include/linux/sched.h

 #ifndef _LINUX_SCHED_H #define _LINUX_SCHED_H /* * cloning flags: */ #define CSIGNAL 0x000000ff /* signal mask to be sent at exit */ #define CLONE_VM 0x00000100 /* set if VM shared between processes */ #define CLONE_FS 0x00000200 /* set if fs info shared between processes */ #define CLONE_FILES 0x00000400 /* set if open files shared between processes */ #define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */ #define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */ #define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */ #define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */ #define CLONE_THREAD 0x00010000 /* Same thread group? */ #define CLONE_NEWNS 0x00020000 /* New namespace group? */ #define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */ #define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */ #define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */ #define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */ #define CLONE_DETACHED 0x00400000 /* Unused, ignored */ #define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */ #define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */ /* 0x02000000 was previously the unused CLONE_STOPPED (Start in stopped state) and is now available for re-use. */ #define CLONE_NEWUTS 0x04000000 /* New utsname group? */ #define CLONE_NEWIPC 0x08000000 /* New ipcs */ #define CLONE_NEWUSER 0x10000000 /* New user namespace */ #define CLONE_NEWPID 0x20000000 /* New pid namespace */ #define CLONE_NEWNET 0x40000000 /* New network namespace */ #define CLONE_IO 0x80000000 /* Clone io context */ /* * Scheduling policies */ #define SCHED_NORMAL 0 #define SCHED_FIFO 1 #define SCHED_RR 2 #define SCHED_BATCH 3 /* SCHED_ISO: reserved but not implemented yet */ #define SCHED_IDLE 5 /* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */ #define SCHED_RESET_ON_FORK 0x40000000 #endif /* _LINUX_SCHED_H */ 

EDIT

The files I want are in the /usr/src/linux-headers-3.17.0-031700/include/ folder. Anyway, I tried to add a folder to my project using several methods. First use the -I flag gcc and next, using the C_INCLUDE_PATH environment C_INCLUDE_PATH .

In both cases, gcc looked for priority in the default locations and found the wrong <sched.h> file. I tried using the -nostdinc to suppress default locations, but this is even worse ... I get a lot of errors.

+5
source share
3 answers

In fact, I upgraded to Ubuntu 16.04 LTS using kernel 4.4.0-21-lowlatency , and the keyword SCHED_DEADLINE now defined by default.

The struct sched_attr problem and sched_getattr() / sched_setattr() methods are still missing!

After some research (thanks to Google), I found this article released by kernel developers. The end of the document describes how to use the scheduling policy. They simply define the structure themselves and use syscall for the get / set methods.

Here is a more readable version of this document: Planning for Deadlines .

0
source

The answer may depend on the distribution! this example is based on Debian 8.4

In addition, in these situations you will find two useful tools: both are available in the debian repositories - ack ( ack-grep ) and find ack will help you find the given line in all subdirectories, and the search will help find the actual file (after updatedb ), if it exists in your system. For example, you can find all files like sched.h, starting with root with locate sched.h

First of all, you must #include, if you do not have this particular inclusion, try downloading it from the repositories, if you are using Debian - this file can be found in (possibly the last) libc6-dev (note that dev packages will contain included and headers for development purposes) or linux-headers

Also, if your compiler cannot find linux / sched.h, try giving the compiler a hint of the path, in my case it will be: gcc -I / usr / include (which in this case is completely useless - this default includes dir on Linux)

Please note that /usr/include/linux/sched.h and /usr/include/sched.h may be slightly different

0
source

Apparently, although SCHED_DEADLINE been the main line since three years ago, libc include files still do not have an interface for the time scheduler (i.e. sched_setattr() , sched_getattr() and sched_attr , etc.) . Behavior that somehow resembles the time libc wraps getttid() syscall .

Therefore, at the moment, the best option is to download the rt application from GitHub and use libdl .

0
source

Source: https://habr.com/ru/post/1247503/


All Articles