Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DEADLINE scheduling policy not found

I want to implement the DEADLINE scheduling policy in C. I know the feature is implemented since Linux 3.14.10 and I'm using Ubuntu 14.04 Linux #### 3.17.0-031700-lowlatency #201410060605 SMP PREEMPT which should be recent enough. I develop the program with Eclipse (launched as sudo).

I've defined _GNU_SOURCE and included sched.h and I'm still unable to use the keyword SCHED_DEADLINE, to define a struct sched_attr or to use function like sched_getattr.

#define _GNU_SOURCE
#include <sched.h>

None of these keywords nor functions are defined in my /usr/include/ folder but I've managed to find them in /usr/src/linux-headers-3.17.0-031700/include/. I've tried to include this folder in my project's build options but it seems to generate link error.

I'm not really used to C developpment (I'm originally a JS developper) so if someone can explain me what I'm doing wrong and how to fix this, that would be very nice.

Content of the /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

Files I want are located in the /usr/src/linux-headers-3.17.0-031700/include/ folder. Anyway, I tried to add the folder to my project using several methods. Firstly using -I flag of gcc and next using the C_INCLUDE_PATH environment variable.

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

like image 886
c.censier Avatar asked Nov 09 '22 16:11

c.censier


1 Answers

I actually upgraded to Ubuntu 16.04 LTS with a kernel 4.4.0-21-lowlatency and the key word SCHED_DEADLINE is now defined by default.

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

After some research (thanks Google) I found this article emitted by the kernel developpers. At the end of the document, it is describe how to use deadline scheduling policy. They simply define by themselves the structure and use syscall for the get/set methods.

like image 160
c.censier Avatar answered Nov 15 '22 06:11

c.censier